bitkeeper revision 1.411 (3f592cf2ZW4sVWHIw4rRCGs-4LMYUw)
authoriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>
Sat, 6 Sep 2003 00:40:18 +0000 (00:40 +0000)
committeriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>
Sat, 6 Sep 2003 00:40:18 +0000 (00:40 +0000)
Update to linux 2.4.22

177 files changed:
.rootkeys
xenolinux-2.4.21-sparse/Documentation/Configure.help [deleted file]
xenolinux-2.4.21-sparse/Makefile [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/Makefile [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/boot/Makefile [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/config.in [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/defconfig [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/drivers/balloon/Makefile [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/drivers/balloon/balloon.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/drivers/balloon/dom_mem_ops.h [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/drivers/block/Makefile [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_block.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_block.h [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_ide.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_scsi.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_segment.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_segment_proc.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/drivers/console/Makefile [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/drivers/console/console.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/Makefile [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/dom0_core.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/vfr.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/drivers/network/Makefile [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/drivers/network/network.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/kernel/Makefile [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/kernel/entry.S [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/kernel/head.S [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/kernel/hypervisor.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/kernel/i386_ksyms.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/kernel/ioport.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/kernel/irq.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/kernel/ldt.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/kernel/process.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/kernel/setup.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/kernel/signal.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/kernel/time.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/kernel/traps.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/lib/Makefile [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/lib/delay.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/mm/Makefile [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/mm/fault.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/mm/hypervisor.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/mm/init.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/mm/ioremap.c [deleted file]
xenolinux-2.4.21-sparse/arch/xeno/vmlinux.lds [deleted file]
xenolinux-2.4.21-sparse/drivers/block/genhd.c [deleted file]
xenolinux-2.4.21-sparse/drivers/block/ll_rw_blk.c [deleted file]
xenolinux-2.4.21-sparse/drivers/char/mem.c [deleted file]
xenolinux-2.4.21-sparse/drivers/char/tty_io.c [deleted file]
xenolinux-2.4.21-sparse/fs/exec.c [deleted file]
xenolinux-2.4.21-sparse/fs/partitions/Config.in [deleted file]
xenolinux-2.4.21-sparse/fs/partitions/Makefile [deleted file]
xenolinux-2.4.21-sparse/fs/partitions/check.c [deleted file]
xenolinux-2.4.21-sparse/fs/partitions/xeno.c [deleted file]
xenolinux-2.4.21-sparse/fs/partitions/xeno.h [deleted file]
xenolinux-2.4.21-sparse/include/asm-xeno/bugs.h [deleted file]
xenolinux-2.4.21-sparse/include/asm-xeno/desc.h [deleted file]
xenolinux-2.4.21-sparse/include/asm-xeno/fixmap.h [deleted file]
xenolinux-2.4.21-sparse/include/asm-xeno/highmem.h [deleted file]
xenolinux-2.4.21-sparse/include/asm-xeno/hw_irq.h [deleted file]
xenolinux-2.4.21-sparse/include/asm-xeno/hypervisor.h [deleted file]
xenolinux-2.4.21-sparse/include/asm-xeno/irq.h [deleted file]
xenolinux-2.4.21-sparse/include/asm-xeno/keyboard.h [deleted file]
xenolinux-2.4.21-sparse/include/asm-xeno/mmu_context.h [deleted file]
xenolinux-2.4.21-sparse/include/asm-xeno/multicall.h [deleted file]
xenolinux-2.4.21-sparse/include/asm-xeno/page.h [deleted file]
xenolinux-2.4.21-sparse/include/asm-xeno/pgalloc.h [deleted file]
xenolinux-2.4.21-sparse/include/asm-xeno/pgtable-2level.h [deleted file]
xenolinux-2.4.21-sparse/include/asm-xeno/pgtable.h [deleted file]
xenolinux-2.4.21-sparse/include/asm-xeno/proc_cmd.h [deleted file]
xenolinux-2.4.21-sparse/include/asm-xeno/processor.h [deleted file]
xenolinux-2.4.21-sparse/include/asm-xeno/ptrace.h [deleted file]
xenolinux-2.4.21-sparse/include/asm-xeno/segment.h [deleted file]
xenolinux-2.4.21-sparse/include/asm-xeno/smp.h [deleted file]
xenolinux-2.4.21-sparse/include/asm-xeno/system.h [deleted file]
xenolinux-2.4.21-sparse/include/asm-xeno/vga.h [deleted file]
xenolinux-2.4.21-sparse/include/linux/blk.h [deleted file]
xenolinux-2.4.21-sparse/include/linux/major.h [deleted file]
xenolinux-2.4.21-sparse/include/linux/sunrpc/debug.h [deleted file]
xenolinux-2.4.21-sparse/init/do_mounts.c [deleted file]
xenolinux-2.4.21-sparse/kernel/panic.c [deleted file]
xenolinux-2.4.21-sparse/kernel/printk.c [deleted file]
xenolinux-2.4.21-sparse/lndir-rel [deleted file]
xenolinux-2.4.21-sparse/mkbuildtree [deleted file]
xenolinux-2.4.21-sparse/mm/memory.c [deleted file]
xenolinux-2.4.21-sparse/mm/mprotect.c [deleted file]
xenolinux-2.4.21-sparse/mm/mremap.c [deleted file]
xenolinux-2.4.21-sparse/mm/swapfile.c [deleted file]
xenolinux-2.4.21-sparse/mm/vmalloc.c [deleted file]
xenolinux-2.4.22-sparse/Documentation/Configure.help [new file with mode: 0644]
xenolinux-2.4.22-sparse/Makefile [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/Makefile [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/boot/Makefile [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/config.in [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/defconfig [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/drivers/balloon/Makefile [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/drivers/balloon/balloon.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/drivers/balloon/dom_mem_ops.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/drivers/block/Makefile [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_block.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_block.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_ide.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_scsi.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_segment.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_segment_proc.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/drivers/console/Makefile [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/drivers/console/console.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/drivers/dom0/Makefile [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/drivers/dom0/dom0_core.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/drivers/dom0/vfr.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/drivers/network/Makefile [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/drivers/network/network.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/kernel/Makefile [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/kernel/entry.S [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/kernel/head.S [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/kernel/hypervisor.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/kernel/i386_ksyms.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/kernel/ioport.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/kernel/irq.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/kernel/ldt.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/kernel/process.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/kernel/setup.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/kernel/signal.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/kernel/time.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/kernel/traps.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/lib/Makefile [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/lib/delay.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/mm/Makefile [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/mm/fault.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/mm/hypervisor.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/mm/init.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/mm/ioremap.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/arch/xeno/vmlinux.lds [new file with mode: 0644]
xenolinux-2.4.22-sparse/drivers/block/genhd.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/drivers/block/ll_rw_blk.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/drivers/char/mem.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/drivers/char/tty_io.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/fs/exec.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/fs/partitions/Config.in [new file with mode: 0644]
xenolinux-2.4.22-sparse/fs/partitions/Makefile [new file with mode: 0644]
xenolinux-2.4.22-sparse/fs/partitions/check.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/fs/partitions/xeno.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/fs/partitions/xeno.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/asm-xeno/bugs.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/asm-xeno/desc.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/asm-xeno/fixmap.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/asm-xeno/highmem.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/asm-xeno/hw_irq.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/asm-xeno/hypervisor.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/asm-xeno/irq.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/asm-xeno/keyboard.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/asm-xeno/mmu_context.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/asm-xeno/multicall.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/asm-xeno/page.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/asm-xeno/pgalloc.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/asm-xeno/pgtable-2level.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/asm-xeno/pgtable.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/asm-xeno/proc_cmd.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/asm-xeno/processor.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/asm-xeno/ptrace.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/asm-xeno/segment.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/asm-xeno/smp.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/asm-xeno/system.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/asm-xeno/vga.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/linux/blk.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/linux/major.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/include/linux/sunrpc/debug.h [new file with mode: 0644]
xenolinux-2.4.22-sparse/init/do_mounts.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/kernel/panic.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/kernel/printk.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/lndir-rel [new file with mode: 0755]
xenolinux-2.4.22-sparse/mkbuildtree [new file with mode: 0755]
xenolinux-2.4.22-sparse/mm/memory.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/mm/mprotect.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/mm/mremap.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/mm/swapfile.c [new file with mode: 0644]
xenolinux-2.4.22-sparse/mm/vmalloc.c [new file with mode: 0644]

index 62cf88cadb5201965c94fbeb4cabd19c492e8efb..9f6ce592c7de92147ad48c546af401f7a55a6f99 100644 (file)
--- a/.rootkeys
+++ b/.rootkeys
 3eb3c87fmKYTC5GCh_rydFakZp9ayw xen/tools/figlet/README
 3eb3c87fdQKQ5OBGbM-KjZfi9Us4ng xen/tools/figlet/figlet.c
 3eb3c87fS7DNbg0i6yhFs28UIqAK5g xen/tools/figlet/xen.flf
-3f05a939TA3SLPY7ZiScMotLjg9owQ xenolinux-2.4.21-sparse/Documentation/Configure.help
-3e5a4e6589G-U42lFKs43plskXoFxQ xenolinux-2.4.21-sparse/Makefile
-3e5a4e65IEPjnWPZ5w3TxS5scV8Ewg xenolinux-2.4.21-sparse/arch/xeno/Makefile
-3e5a4e65n-KhsEAs-A4ULiStBp-r6w xenolinux-2.4.21-sparse/arch/xeno/boot/Makefile
-3e5a4e65OV_j_DBtjzt5vej771AJsA xenolinux-2.4.21-sparse/arch/xeno/config.in
-3e5a4e65TNEycLeXqPSXQJQm_xGecA xenolinux-2.4.21-sparse/arch/xeno/defconfig
-3e6377f5xwPfYZkPHPrDbEq1PRN7uQ xenolinux-2.4.21-sparse/arch/xeno/drivers/balloon/Makefile
-3e6377f8Me8IqtvEhb70XFgOvqQH7A xenolinux-2.4.21-sparse/arch/xeno/drivers/balloon/balloon.c
-3e6377fbMjXWAQd0XN0FWv4fDEo6fg xenolinux-2.4.21-sparse/arch/xeno/drivers/balloon/dom_mem_ops.h
-3e5a4e65iHEuC5sjFhj42XALYbLVRw xenolinux-2.4.21-sparse/arch/xeno/drivers/block/Makefile
-3e5a4e65pP5spJErBW69pJxSSdK9RA xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_block.c
-3e67f822FOPwqHiaRKbrskgWgoNL5g xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_block.h
-3e677190SjkzJIvFifRVeYpIZOCtYA xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_ide.c
-3e677193nOKKTLJzcAu4SYdbZaia8g xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_scsi.c
-3e676eb5RXnHzSHgA1BvM0B1aIm4qg xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_segment.c
-3e5d129aDldt6geU2-2SzBae34sQzg xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_segment_proc.c
-3e5a4e65G3e2s0ghPMgiJ-gBTUJ0uQ xenolinux-2.4.21-sparse/arch/xeno/drivers/console/Makefile
-3e5a4e651TH-SXHoufurnWjgl5bfOA xenolinux-2.4.21-sparse/arch/xeno/drivers/console/console.c
-3e5a4e656nfFISThfbyXQOA6HN6YHw xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/Makefile
-3e5a4e65BXtftInNHUC2PjDfPhdZZA xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/dom0_core.c
-3e5a4e65gfn_ltB8ujHMVFApnTTNRQ xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/vfr.c
-3e5a4e65gZBRBB6RsSVg1c9iahigAw xenolinux-2.4.21-sparse/arch/xeno/drivers/network/Makefile
-3e5a4e65ZxKrbFetVB84JhrTyZ1YuQ xenolinux-2.4.21-sparse/arch/xeno/drivers/network/network.c
-3e5a4e65lWzkiPXsZdzPt2RNnJGG1g xenolinux-2.4.21-sparse/arch/xeno/kernel/Makefile
-3e5a4e65_hqfuxtGG8IUy6wRM86Ecg xenolinux-2.4.21-sparse/arch/xeno/kernel/entry.S
-3e5a4e65Hy_1iUvMTPsNqGNXd9uFpg xenolinux-2.4.21-sparse/arch/xeno/kernel/head.S
-3e5a4e65ibVQmwlOn0j3sVH_j_6hAg xenolinux-2.4.21-sparse/arch/xeno/kernel/hypervisor.c
-3e5a4e65RMGcuA-HCn3-wNx3fFQwdg xenolinux-2.4.21-sparse/arch/xeno/kernel/i386_ksyms.c
-3e5a4e65MEvZhlr070sK5JsfAQlv7Q xenolinux-2.4.21-sparse/arch/xeno/kernel/ioport.c
-3e5a4e653U6cELGv528IxOLHvCq8iA xenolinux-2.4.21-sparse/arch/xeno/kernel/irq.c
-3e5a4e65muT6SU3ck47IP87Q7Ti5hA xenolinux-2.4.21-sparse/arch/xeno/kernel/ldt.c
-3e5a4e65IGt3WwQDNiL4h-gYWgNTWQ xenolinux-2.4.21-sparse/arch/xeno/kernel/process.c
-3e5a4e66tR-qJMLj3MppcKqmvuI2XQ xenolinux-2.4.21-sparse/arch/xeno/kernel/setup.c
-3e5a4e66fWSTagLGU2P8BGFGRjhDiw xenolinux-2.4.21-sparse/arch/xeno/kernel/signal.c
-3e5a4e66N__lUXNwzQ-eADRzK9LXuQ xenolinux-2.4.21-sparse/arch/xeno/kernel/time.c
-3e5a4e66aHCbQ_F5QZ8VeyikLmuRZQ xenolinux-2.4.21-sparse/arch/xeno/kernel/traps.c
-3e5a4e66-9_NczrVMbuQkoSLyXckIw xenolinux-2.4.21-sparse/arch/xeno/lib/Makefile
-3e5a4e6637ZDk0BvFEC-aFQs599-ng xenolinux-2.4.21-sparse/arch/xeno/lib/delay.c
-3e5a4e66croVgpcJyJuF2ycQw0HuJw xenolinux-2.4.21-sparse/arch/xeno/mm/Makefile
-3e5a4e66l8Q5Tv-6B3lQIRmaVbFPzg xenolinux-2.4.21-sparse/arch/xeno/mm/fault.c
-3e5a4e668SE9rixq4ahho9rNhLUUFQ xenolinux-2.4.21-sparse/arch/xeno/mm/hypervisor.c
-3e5a4e661gLzzff25pJooKIIWe7IWg xenolinux-2.4.21-sparse/arch/xeno/mm/init.c
-3f0bed43UUdQichXAiVNrjV-y2Kzcg xenolinux-2.4.21-sparse/arch/xeno/mm/ioremap.c
-3e5a4e66qRlSTcjafidMB6ulECADvg xenolinux-2.4.21-sparse/arch/xeno/vmlinux.lds
-3ea53c6em6uzVHSiGqrbbAVofyRY_g xenolinux-2.4.21-sparse/drivers/block/genhd.c
-3e5a4e66mrtlmV75L1tjKDg8RaM5gA xenolinux-2.4.21-sparse/drivers/block/ll_rw_blk.c
-3f108aeaLcGDgQdFAANLTUEid0a05w xenolinux-2.4.21-sparse/drivers/char/mem.c
-3e5a4e66rw65CxyolW9PKz4GG42RcA xenolinux-2.4.21-sparse/drivers/char/tty_io.c
-3e5a4e669uzIE54VwucPYtGwXLAbzA xenolinux-2.4.21-sparse/fs/exec.c
-3f05a939l8s0eQb_fpMvYiI06cTGlA xenolinux-2.4.21-sparse/fs/partitions/Config.in
-3f05a939W65febbeWrBtuQgsQDK2Bg xenolinux-2.4.21-sparse/fs/partitions/Makefile
-3f05a939phguW4R5PelNQZ8o_EcYZA xenolinux-2.4.21-sparse/fs/partitions/check.c
-3f05a939ZSKN7gX2sfTLzPcYJvPkcQ xenolinux-2.4.21-sparse/fs/partitions/xeno.c
-3f05a939_I9vPADPgyVBwUDUxtoeOQ xenolinux-2.4.21-sparse/fs/partitions/xeno.h
-3e5a4e66wbeCpsJgVf_U8Jde-CNcsA xenolinux-2.4.21-sparse/include/asm-xeno/bugs.h
-3e5a4e66HdSkvIV6SJ1evG_xmTmXHA xenolinux-2.4.21-sparse/include/asm-xeno/desc.h
-3e5a4e66SYp_UpAVcF8Lc1wa3Qtgzw xenolinux-2.4.21-sparse/include/asm-xeno/fixmap.h
-3e5a4e67w_DWgjIJ17Tlossu1LGujQ xenolinux-2.4.21-sparse/include/asm-xeno/highmem.h
-3e5a4e67YtcyDLQsShhCfQwPSELfvA xenolinux-2.4.21-sparse/include/asm-xeno/hw_irq.h
-3e5a4e677VBavzM1UZIEcH1B-RlXMA xenolinux-2.4.21-sparse/include/asm-xeno/hypervisor.h
-3e5a4e673p7PEOyHFm3nHkYX6HQYBg xenolinux-2.4.21-sparse/include/asm-xeno/irq.h
-3ead095db_LRUXnxaqs0dA1DWhPoQQ xenolinux-2.4.21-sparse/include/asm-xeno/keyboard.h
-3e5a4e678ddsQOpbSiRdy1GRcDc9WA xenolinux-2.4.21-sparse/include/asm-xeno/mmu_context.h
-3e7270deQqtGPSnFxcW4AvJZuTUWfg xenolinux-2.4.21-sparse/include/asm-xeno/multicall.h
-3e5a4e67mnQfh-R8KcQCaVo2Oho6yg xenolinux-2.4.21-sparse/include/asm-xeno/page.h
-3e5a4e67uTYU5oEnIDjxuaez8njjqg xenolinux-2.4.21-sparse/include/asm-xeno/pgalloc.h
-3e5a4e67X7JyupgdYkgDX19Huj2sAw xenolinux-2.4.21-sparse/include/asm-xeno/pgtable-2level.h
-3e5a4e67gr4NLGtQ5CvSLimMYZlkOA xenolinux-2.4.21-sparse/include/asm-xeno/pgtable.h
-3f108af1qNv8DVSGPv4zpqIU1txCkg xenolinux-2.4.21-sparse/include/asm-xeno/proc_cmd.h
-3e5a4e676uK4xErTBDH6XJREn9LSyg xenolinux-2.4.21-sparse/include/asm-xeno/processor.h
-3e5a4e67AJPjW-zL7p-xWuA6IVeH1g xenolinux-2.4.21-sparse/include/asm-xeno/ptrace.h
-3e5a4e68uJz-xI0IBVMD7xRLQKJDFg xenolinux-2.4.21-sparse/include/asm-xeno/segment.h
-3e5a4e68Nfdh6QcOKUTGCaYkf2LmYA xenolinux-2.4.21-sparse/include/asm-xeno/smp.h
-3e5a4e68mTr0zcp9SXDbnd-XLrrfxw xenolinux-2.4.21-sparse/include/asm-xeno/system.h
-3f1056a9L_kqHcFheV00KbKBzv9j5w xenolinux-2.4.21-sparse/include/asm-xeno/vga.h
-3f056927gMHl7mWB89rb73JahbhQIA xenolinux-2.4.21-sparse/include/linux/blk.h
-3e5a4e68WLX3B8owTvktP3HHOtznPQ xenolinux-2.4.21-sparse/include/linux/major.h
-3e5a4e686V0nioX2ZpFf056sgvdiQw xenolinux-2.4.21-sparse/include/linux/sunrpc/debug.h
-3e5a4e68W_hpMlM3u_-QOKMp3gzcwQ xenolinux-2.4.21-sparse/init/do_mounts.c
-3e5a4e68TJJavrunYwTAnLRSBxSYqQ xenolinux-2.4.21-sparse/kernel/panic.c
-3f1056a9LXNTgSzITNh1mb-MIKV1Ng xenolinux-2.4.21-sparse/kernel/printk.c
-3eba8f878XjouY21EkQBXwYBsPsipQ xenolinux-2.4.21-sparse/lndir-rel
-3e6e7c1efbQe93xCvOpOVCnXTMmQ5w xenolinux-2.4.21-sparse/mkbuildtree
-3e5a4e68GxCIaFH4sy01v1wjapetaA xenolinux-2.4.21-sparse/mm/memory.c
-3f108af5VxPkLv13tXpXgoRKALQtXQ xenolinux-2.4.21-sparse/mm/mprotect.c
-3e5a4e681xMPdF9xCMwpyfuYMySU5g xenolinux-2.4.21-sparse/mm/mremap.c
-3e5a4e683HKVU-sxtagrDasRB8eBVw xenolinux-2.4.21-sparse/mm/swapfile.c
-3f108af81Thhb242EmKjGCYkjx-GJA xenolinux-2.4.21-sparse/mm/vmalloc.c
+3f05a939TA3SLPY7ZiScMotLjg9owQ xenolinux-2.4.22-sparse/Documentation/Configure.help
+3e5a4e6589G-U42lFKs43plskXoFxQ xenolinux-2.4.22-sparse/Makefile
+3e5a4e65IEPjnWPZ5w3TxS5scV8Ewg xenolinux-2.4.22-sparse/arch/xeno/Makefile
+3e5a4e65n-KhsEAs-A4ULiStBp-r6w xenolinux-2.4.22-sparse/arch/xeno/boot/Makefile
+3e5a4e65OV_j_DBtjzt5vej771AJsA xenolinux-2.4.22-sparse/arch/xeno/config.in
+3e5a4e65TNEycLeXqPSXQJQm_xGecA xenolinux-2.4.22-sparse/arch/xeno/defconfig
+3e6377f5xwPfYZkPHPrDbEq1PRN7uQ xenolinux-2.4.22-sparse/arch/xeno/drivers/balloon/Makefile
+3e6377f8Me8IqtvEhb70XFgOvqQH7A xenolinux-2.4.22-sparse/arch/xeno/drivers/balloon/balloon.c
+3e6377fbMjXWAQd0XN0FWv4fDEo6fg xenolinux-2.4.22-sparse/arch/xeno/drivers/balloon/dom_mem_ops.h
+3e5a4e65iHEuC5sjFhj42XALYbLVRw xenolinux-2.4.22-sparse/arch/xeno/drivers/block/Makefile
+3e5a4e65pP5spJErBW69pJxSSdK9RA xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_block.c
+3e67f822FOPwqHiaRKbrskgWgoNL5g xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_block.h
+3e677190SjkzJIvFifRVeYpIZOCtYA xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_ide.c
+3e677193nOKKTLJzcAu4SYdbZaia8g xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_scsi.c
+3e676eb5RXnHzSHgA1BvM0B1aIm4qg xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_segment.c
+3e5d129aDldt6geU2-2SzBae34sQzg xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_segment_proc.c
+3e5a4e65G3e2s0ghPMgiJ-gBTUJ0uQ xenolinux-2.4.22-sparse/arch/xeno/drivers/console/Makefile
+3e5a4e651TH-SXHoufurnWjgl5bfOA xenolinux-2.4.22-sparse/arch/xeno/drivers/console/console.c
+3e5a4e656nfFISThfbyXQOA6HN6YHw xenolinux-2.4.22-sparse/arch/xeno/drivers/dom0/Makefile
+3e5a4e65BXtftInNHUC2PjDfPhdZZA xenolinux-2.4.22-sparse/arch/xeno/drivers/dom0/dom0_core.c
+3e5a4e65gfn_ltB8ujHMVFApnTTNRQ xenolinux-2.4.22-sparse/arch/xeno/drivers/dom0/vfr.c
+3e5a4e65gZBRBB6RsSVg1c9iahigAw xenolinux-2.4.22-sparse/arch/xeno/drivers/network/Makefile
+3e5a4e65ZxKrbFetVB84JhrTyZ1YuQ xenolinux-2.4.22-sparse/arch/xeno/drivers/network/network.c
+3e5a4e65lWzkiPXsZdzPt2RNnJGG1g xenolinux-2.4.22-sparse/arch/xeno/kernel/Makefile
+3e5a4e65_hqfuxtGG8IUy6wRM86Ecg xenolinux-2.4.22-sparse/arch/xeno/kernel/entry.S
+3e5a4e65Hy_1iUvMTPsNqGNXd9uFpg xenolinux-2.4.22-sparse/arch/xeno/kernel/head.S
+3e5a4e65ibVQmwlOn0j3sVH_j_6hAg xenolinux-2.4.22-sparse/arch/xeno/kernel/hypervisor.c
+3e5a4e65RMGcuA-HCn3-wNx3fFQwdg xenolinux-2.4.22-sparse/arch/xeno/kernel/i386_ksyms.c
+3e5a4e65MEvZhlr070sK5JsfAQlv7Q xenolinux-2.4.22-sparse/arch/xeno/kernel/ioport.c
+3e5a4e653U6cELGv528IxOLHvCq8iA xenolinux-2.4.22-sparse/arch/xeno/kernel/irq.c
+3e5a4e65muT6SU3ck47IP87Q7Ti5hA xenolinux-2.4.22-sparse/arch/xeno/kernel/ldt.c
+3e5a4e65IGt3WwQDNiL4h-gYWgNTWQ xenolinux-2.4.22-sparse/arch/xeno/kernel/process.c
+3e5a4e66tR-qJMLj3MppcKqmvuI2XQ xenolinux-2.4.22-sparse/arch/xeno/kernel/setup.c
+3e5a4e66fWSTagLGU2P8BGFGRjhDiw xenolinux-2.4.22-sparse/arch/xeno/kernel/signal.c
+3e5a4e66N__lUXNwzQ-eADRzK9LXuQ xenolinux-2.4.22-sparse/arch/xeno/kernel/time.c
+3e5a4e66aHCbQ_F5QZ8VeyikLmuRZQ xenolinux-2.4.22-sparse/arch/xeno/kernel/traps.c
+3e5a4e66-9_NczrVMbuQkoSLyXckIw xenolinux-2.4.22-sparse/arch/xeno/lib/Makefile
+3e5a4e6637ZDk0BvFEC-aFQs599-ng xenolinux-2.4.22-sparse/arch/xeno/lib/delay.c
+3e5a4e66croVgpcJyJuF2ycQw0HuJw xenolinux-2.4.22-sparse/arch/xeno/mm/Makefile
+3e5a4e66l8Q5Tv-6B3lQIRmaVbFPzg xenolinux-2.4.22-sparse/arch/xeno/mm/fault.c
+3e5a4e668SE9rixq4ahho9rNhLUUFQ xenolinux-2.4.22-sparse/arch/xeno/mm/hypervisor.c
+3e5a4e661gLzzff25pJooKIIWe7IWg xenolinux-2.4.22-sparse/arch/xeno/mm/init.c
+3f0bed43UUdQichXAiVNrjV-y2Kzcg xenolinux-2.4.22-sparse/arch/xeno/mm/ioremap.c
+3e5a4e66qRlSTcjafidMB6ulECADvg xenolinux-2.4.22-sparse/arch/xeno/vmlinux.lds
+3ea53c6em6uzVHSiGqrbbAVofyRY_g xenolinux-2.4.22-sparse/drivers/block/genhd.c
+3e5a4e66mrtlmV75L1tjKDg8RaM5gA xenolinux-2.4.22-sparse/drivers/block/ll_rw_blk.c
+3f108aeaLcGDgQdFAANLTUEid0a05w xenolinux-2.4.22-sparse/drivers/char/mem.c
+3e5a4e66rw65CxyolW9PKz4GG42RcA xenolinux-2.4.22-sparse/drivers/char/tty_io.c
+3e5a4e669uzIE54VwucPYtGwXLAbzA xenolinux-2.4.22-sparse/fs/exec.c
+3f05a939l8s0eQb_fpMvYiI06cTGlA xenolinux-2.4.22-sparse/fs/partitions/Config.in
+3f05a939W65febbeWrBtuQgsQDK2Bg xenolinux-2.4.22-sparse/fs/partitions/Makefile
+3f05a939phguW4R5PelNQZ8o_EcYZA xenolinux-2.4.22-sparse/fs/partitions/check.c
+3f05a939ZSKN7gX2sfTLzPcYJvPkcQ xenolinux-2.4.22-sparse/fs/partitions/xeno.c
+3f05a939_I9vPADPgyVBwUDUxtoeOQ xenolinux-2.4.22-sparse/fs/partitions/xeno.h
+3e5a4e66wbeCpsJgVf_U8Jde-CNcsA xenolinux-2.4.22-sparse/include/asm-xeno/bugs.h
+3e5a4e66HdSkvIV6SJ1evG_xmTmXHA xenolinux-2.4.22-sparse/include/asm-xeno/desc.h
+3e5a4e66SYp_UpAVcF8Lc1wa3Qtgzw xenolinux-2.4.22-sparse/include/asm-xeno/fixmap.h
+3e5a4e67w_DWgjIJ17Tlossu1LGujQ xenolinux-2.4.22-sparse/include/asm-xeno/highmem.h
+3e5a4e67YtcyDLQsShhCfQwPSELfvA xenolinux-2.4.22-sparse/include/asm-xeno/hw_irq.h
+3e5a4e677VBavzM1UZIEcH1B-RlXMA xenolinux-2.4.22-sparse/include/asm-xeno/hypervisor.h
+3e5a4e673p7PEOyHFm3nHkYX6HQYBg xenolinux-2.4.22-sparse/include/asm-xeno/irq.h
+3ead095db_LRUXnxaqs0dA1DWhPoQQ xenolinux-2.4.22-sparse/include/asm-xeno/keyboard.h
+3e5a4e678ddsQOpbSiRdy1GRcDc9WA xenolinux-2.4.22-sparse/include/asm-xeno/mmu_context.h
+3e7270deQqtGPSnFxcW4AvJZuTUWfg xenolinux-2.4.22-sparse/include/asm-xeno/multicall.h
+3e5a4e67mnQfh-R8KcQCaVo2Oho6yg xenolinux-2.4.22-sparse/include/asm-xeno/page.h
+3e5a4e67uTYU5oEnIDjxuaez8njjqg xenolinux-2.4.22-sparse/include/asm-xeno/pgalloc.h
+3e5a4e67X7JyupgdYkgDX19Huj2sAw xenolinux-2.4.22-sparse/include/asm-xeno/pgtable-2level.h
+3e5a4e67gr4NLGtQ5CvSLimMYZlkOA xenolinux-2.4.22-sparse/include/asm-xeno/pgtable.h
+3f108af1qNv8DVSGPv4zpqIU1txCkg xenolinux-2.4.22-sparse/include/asm-xeno/proc_cmd.h
+3e5a4e676uK4xErTBDH6XJREn9LSyg xenolinux-2.4.22-sparse/include/asm-xeno/processor.h
+3e5a4e67AJPjW-zL7p-xWuA6IVeH1g xenolinux-2.4.22-sparse/include/asm-xeno/ptrace.h
+3e5a4e68uJz-xI0IBVMD7xRLQKJDFg xenolinux-2.4.22-sparse/include/asm-xeno/segment.h
+3e5a4e68Nfdh6QcOKUTGCaYkf2LmYA xenolinux-2.4.22-sparse/include/asm-xeno/smp.h
+3e5a4e68mTr0zcp9SXDbnd-XLrrfxw xenolinux-2.4.22-sparse/include/asm-xeno/system.h
+3f1056a9L_kqHcFheV00KbKBzv9j5w xenolinux-2.4.22-sparse/include/asm-xeno/vga.h
+3f056927gMHl7mWB89rb73JahbhQIA xenolinux-2.4.22-sparse/include/linux/blk.h
+3e5a4e68WLX3B8owTvktP3HHOtznPQ xenolinux-2.4.22-sparse/include/linux/major.h
+3e5a4e686V0nioX2ZpFf056sgvdiQw xenolinux-2.4.22-sparse/include/linux/sunrpc/debug.h
+3e5a4e68W_hpMlM3u_-QOKMp3gzcwQ xenolinux-2.4.22-sparse/init/do_mounts.c
+3e5a4e68TJJavrunYwTAnLRSBxSYqQ xenolinux-2.4.22-sparse/kernel/panic.c
+3f1056a9LXNTgSzITNh1mb-MIKV1Ng xenolinux-2.4.22-sparse/kernel/printk.c
+3eba8f878XjouY21EkQBXwYBsPsipQ xenolinux-2.4.22-sparse/lndir-rel
+3e6e7c1efbQe93xCvOpOVCnXTMmQ5w xenolinux-2.4.22-sparse/mkbuildtree
+3e5a4e68GxCIaFH4sy01v1wjapetaA xenolinux-2.4.22-sparse/mm/memory.c
+3f108af5VxPkLv13tXpXgoRKALQtXQ xenolinux-2.4.22-sparse/mm/mprotect.c
+3e5a4e681xMPdF9xCMwpyfuYMySU5g xenolinux-2.4.22-sparse/mm/mremap.c
+3e5a4e683HKVU-sxtagrDasRB8eBVw xenolinux-2.4.22-sparse/mm/swapfile.c
+3f108af81Thhb242EmKjGCYkjx-GJA xenolinux-2.4.22-sparse/mm/vmalloc.c
diff --git a/xenolinux-2.4.21-sparse/Documentation/Configure.help b/xenolinux-2.4.21-sparse/Documentation/Configure.help
deleted file mode 100644 (file)
index 2910095..0000000
+++ /dev/null
@@ -1,26994 +0,0 @@
-# Maintained by:
-#      Eric S. Raymond <mailto:esr@thyrsus.com>
-#      Steven Cole <mailto:elenstev@mesatop.com>
-#
-# Version 3.01: current with 2.4.19+
-#
-# Translations of this file available on the WWW:
-#
-#   - Japanese, maintained by the JF Project <mailto:JF@linux.or.jp>, at
-#     <http://www.linux.or.jp/JF/JFdocs/Configure.help/>
-#   - Russian, by <mailto:kaf@linux.nevod.perm.su>, at
-#     <http://nevod.perm.su/service/linux/doc/kernel/Configure.help>
-#   - French, by Pierre Tane <mailto:tanep@bigfoot.com>, at
-#     <http://www.traduc.org/kernelfr/>
-#   - Polish, by Dominik Mierzejewski <mailto:dmierzej@elka.pw.edu.pl>, at
-#     <http://home.elka.pw.edu.pl/~dmierzej/linux/kernel/>
-#   - German, by SuSE, at <http://www.suse.de/~ke/kernel/>. This patch
-#     also includes infrastructure to support different languages.
-#   - Catalan, by Antoni Bella <mailto:bella5@teleline.es>, at
-#     <http://www.terra.es/personal7/bella5/traduccions.htm>
-#
-# To access a document on the WWW, you need to have a direct Internet
-# connection and a browser program such as netscape or lynx. If you
-# only have email access, you can still use FTP and WWW servers: send
-# an email to <mailto:mail-server@rtfm.mit.edu> with the text
-#   send usenet/news.answers/internet-services/access-via-email
-# in the body of the message.
-#
-# Information about what a kernel is, what it does, how to patch and
-# compile it and much more is contained in the Kernel-HOWTO, available
-# at <http://www.tldp.org/docs.html#howto>. Before you start
-# compiling, make sure that you have the necessary versions of all
-# programs and libraries required to compile and run this kernel; they
-# are listed in the <file:Documentation/Changes>. Make sure to read the
-# toplevel kernel README file as well.
-#
-# Format of this file: description<nl>variable<nl>help text<nl><nl>.
-# The help texts may contain empty lines, but every non-empty line must
-# be indented two positions.  Order of the help texts does not matter,
-# however, no variable should be documented twice: if it is, only the
-# first occurrence will be used. We try to keep the help texts of related
-# variables close together. Lines starting with `#' are ignored. To be
-# nice to menuconfig, limit your line length to 70 characters. Use emacs'
-# kfill.el to edit and ispell.el to spell check this file or you lose.
-#
-# Comments of the form "# Choice:" followed by a menu name are used
-# internally by the maintainers' consistency-checking tools.
-#
-# If you add a help text to this file, please try to be as gentle as
-# possible. Don't use unexplained acronyms and generally write for the
-# hypothetical ignorant but intelligent user who has just bought a PC,
-# removed Windows, installed Linux and is now recompiling the kernel
-# for the first time. Tell them what to do if they're unsure. Technical
-# information should go in a README in the Documentation directory.
-#
-# Mention all the relevant READMEs and HOWTOs in the help text.
-# Make them file URLs relative to the top level of the source tree so
-# that help browsers can turn them into hotlinks.  All URLs should be
-# surrounded by <>.
-#
-# Repetitions are fine since the help texts are not meant to be read
-# in sequence.  It is good style to include URLs pointing to more
-# detailed technical information, pictures of the hardware, etc.
-#
-# The most important thing to include in a help entry is *motivation*.
-# Explain why someone configuring a kernel might want to select your
-# option.
-#
-# All this was shamelessly stolen from numerous different sources. Many
-# thanks to all the contributors. Feel free to use these help texts in
-# your own kernel configuration tools. The texts are copyrighted (c)
-# 1995-2000 by Axel Boldt and many others and are governed by the GNU
-# General Public License.
-
-Prompt for development and/or incomplete code/drivers
-CONFIG_EXPERIMENTAL
-  Some of the various things that Linux supports (such as network
-  drivers, file systems, network protocols, etc.) can be in a state
-  of development where the functionality, stability, or the level of
-  testing is not yet high enough for general use. This is usually
-  known as the "alpha-test" phase among developers. If a feature is
-  currently in alpha-test, then the developers usually discourage
-  uninformed widespread use of this feature by the general public to
-  avoid "Why doesn't this work?" type mail messages. However, active
-  testing and use of these systems is welcomed. Just be aware that it
-  may not meet the normal level of reliability or it may fail to work
-  in some special cases. Detailed bug reports from people familiar
-  with the kernel internals are usually welcomed by the developers
-  (before submitting bug reports, please read the documents
-  <file:README>, <file:MAINTAINERS>, <file:REPORTING-BUGS>,
-  <file:Documentation/BUG-HUNTING>, and
-  <file:Documentation/oops-tracing.txt> in the kernel source).
-
-  This option will also make obsoleted drivers available. These are
-  drivers that have been replaced by something else, and/or are
-  scheduled to be removed in a future kernel release.
-
-  Unless you intend to help test and develop a feature or driver that
-  falls into this category, or you have a situation that requires
-  using these features, you should probably say N here, which will
-  cause the configurator to present you with fewer choices. If
-  you say Y here, you will be offered the choice of using features or
-  drivers that are currently considered to be in the alpha-test phase.
-
-Prompt for drivers for obsolete features and hardware
-CONFIG_OBSOLETE
-  Obsolete drivers have usually been replaced by more recent software
-  that can talk to the same hardware.  Obsolete hardware is things
-  like MGA monitors that you are very unlikely to see on today's
-  systems.
-
-Symmetric Multi-Processing support
-CONFIG_SMP
-  This enables support for systems with more than one CPU. If you have
-  a system with only one CPU, like most personal computers, say N. If
-  you have a system with more than one CPU, say Y.
-
-  If you say N here, the kernel will run on single and multiprocessor
-  machines, but will use only one CPU of a multiprocessor machine. If
-  you say Y here, the kernel will run on many, but not all,
-  single machines. On a singleprocessor machine, the kernel
-  will run faster if you say N here.
-
-  Note that if you say Y here and choose architecture "586" or
-  "Pentium" under "Processor family", the kernel will not work on 486
-  architectures. Similarly, multiprocessor kernels for the "PPro"
-  architecture may not work on all Pentium based boards.
-
-  People using multiprocessor machines who say Y here should also say
-  Y to "Enhanced Real Time Clock Support", below. The "Advanced Power
-  Management" code will be disabled if you say Y here.
-
-  See also the <file:Documentation/smp.tex>,
-  <file:Documentation/smp.txt>, <file:Documentation/i386/IO-APIC.txt>,
-  <file:Documentation/nmi_watchdog.txt> and the SMP-HOWTO available at
-  <http://www.tldp.org/docs.html#howto>.
-
-  If you don't know what to do here, say N.
-
-Intel or compatible 80x86 processor
-CONFIG_X86
-  This is Linux's home port.  Linux was originally native to the Intel
-  386, and runs on all the later x86 processors including the Intel
-  486, 586, Pentiums, and various instruction-set-compatible chips by
-  AMD, Cyrix, and others.
-
-Alpha processor
-CONFIG_ALPHA
-  The Alpha is a 64-bit general-purpose processor designed and
-  marketed by the Digital Equipment Corporation of blessed memory, now
-  Compaq.  Alpha Linux dates from 1995-1996 and was the first non-x86
-  port. The Alpha Linux project has a home page at
-  <http://www.alphalinux.org/>.
-
-32-bit Sun Sparc
-CONFIG_SPARC32
-  SPARC is a family of RISC microprocessors designed and marketed by
-  Sun Microsystems, incorporated.  They are very widely found in Sun
-  workstations and clones. This port covers the original 32-bit SPARC;
-  it is old and stable and usually considered one of the "big three"
-  along with the Intel and Alpha ports.  The UltraLinux project
-  maintains both the SPARC32 and SPARC64 ports; its web page is
-  available at <http://www.ultralinux.org/>.
-
-64-bit Sun Sparc
-CONFIG_SPARC64
-  SPARC is a family of RISC microprocessors designed and marketed by
-  Sun Microsystems, incorporated.  This port covers the newer 64-bit
-  UltraSPARC.  The UltraLinux project maintains both the SPARC32 and
-  SPARC64 ports; its web page is available at
-  <http://www.ultralinux.org/>.
-
-Power PC processor
-CONFIG_PPC
-  The PowerPC is a very capable 32-bit RISC processor from Motorola,
-  the successor to their 68000 and 88000 series.  It powers recent
-  Macintoshes and also a widely-used series of single-board computers
-  from Motorola.  The Linux PowerPC port has a home page at
-  <http://penguinppc.org/>.
-
-Motorola 68K processors
-CONFIG_M68K
-  The Motorola 68K microprocessors are now obsolete, having been
-  superseded by the PowerPC line also from Motorola.  But they powered
-  the first wave of workstation hardware in the 1980s, including Sun
-  workstations; they were also the basis of the original Amiga and
-  later Atari personal computers.  A lot of this hardware is still
-  around.  The m68k project has a home page at
-  <http://www.linux-m68k.org/>.
-
-ARM processors
-CONFIG_ARM
-  The ARM series is a line of low-power-consumption RISC chip designs
-  licensed by ARM ltd and targeted at embedded applications and
-  handhelds such as the Compaq IPAQ.  ARM-based PCs are no longer
-  manufactured, but  legacy ARM-based PC hardware remains popular in
-  Europe.  There is an ARM Linux project with a web page at
-  <http://www.arm.linux.org.uk/>.
-
-SuperH processors
-CONFIG_SUPERH
-  The SuperH is a RISC processor targeted for use in embedded systems
-  and consumer electronics; it was also used in the Sega Dreamcast
-  gaming console.  The SuperH port has a home page at
-  <http://www.sh-linux.org/>.
-
-IA64 processors, including Intel Itanium
-CONFIG_IA64
-  The Itanium is Intel's 64-bit successor to the 32-bit X86 line.  As
-  of early 2001 it is not yet in widespread production use.  The Linux
-  IA-64 project has a home page at <http://www.linuxia64.org/>.
-
-HP PA-RISC processor
-CONFIG_PARISC
-  The PA-RISC microprocessor is a RISC chip designed by
-  Hewlett-Packard and used in their line of workstations.  The PA-RISC
-  Linux project has a home page at <www.parisc-linux.org>.
-
-IBM System/390
-CONFIG_S390
-  Linux now runs on the venerable System/390 mainframe from IBM, in a
-  guest partition under VM.  In fact, over 40,000 simultaneous Linux
-  images have been run on a single mainframe!  The S390 Linux project
-  has a home page at <http://linux.s390.org/>.
-
-Axis Communications ETRAX 100LX embedded network CPU
-CONFIG_CRIS
-  Linux has been ported to run on the Axis Communications ETRAX 100LX
-  CPU and the single-board computers built around it, targeted for
-  network and embedded applications.  For more information see the
-  Axis Communication site, <http://developer.axis.com/>.
-
-Unsynced TSC support
-CONFIG_X86_TSC_DISABLE
-  This option is used for getting Linux to run on a NUMA multi-node 
-  boxes, laptops and other systems suffering from unsynced TSCs or 
-  TSC drift, which can cause gettimeofday to return non-monotonic values. 
-  Choosing this option will disable the CONFIG_X86_TSC optimization,
-  and allows you to then specify "notsc" as a boot option regardless of 
-  which processor you have compiled for. 
-  
-  NOTE: If your system hangs when init should run, you are probably
-  using a i686 compiled glibc which reads the TSC without checking for 
-  availability. Boot without "notsc" and install a i386 compiled glibc 
-  to solve the problem.
-
-  If unsure, say N.
-
-Multiquad support for NUMAQ systems
-CONFIG_X86_NUMAQ
-  This option is used for getting Linux to run on a (IBM/Sequent) NUMA 
-  multiquad box. This changes the way that processors are bootstrapped,
-  and uses Clustered Logical APIC addressing mode instead of Flat Logical.
-  You will need a new lynxer.elf file to flash your firmware with - send
-  email to Martin.Bligh@us.ibm.com
-
-Support for IBM Summit (EXA) systems
-CONFIG_X86_SUMMIT
-  This option is needed for IBM systems that use the Summit/EXA chipset.
-  (EXA: Extendable Xseries Architecture)In particular, it is needed for 
-  the x440 (even for the 4-CPU model).
-
-  If you don't have this computer, you may safely say N.
-
-IO-APIC support on uniprocessors
-CONFIG_X86_UP_IOAPIC
-  An IO-APIC (I/O Advanced Programmable Interrupt Controller) is an
-  SMP-capable replacement for PC-style interrupt controllers. Most
-  SMP systems and a small number of uniprocessor systems have one.
-  If you have a single-CPU system with an IO-APIC, you can say Y here
-  to use it. If you say Y here even though your machine doesn't have
-  an IO-APIC, then the kernel will still run with no slowdown at all.
-
-  If you have a system with several CPUs, you do not need to say Y
-  here: the IO-APIC will be used automatically.
-
-Local APIC Support on Uniprocessors
-CONFIG_X86_UP_APIC
-  A local APIC (Advanced Programmable Interrupt Controller) is an
-  integrated interrupt controller in the CPU. If you have a single-CPU
-  system which has a processor with a local APIC, you can say Y here to
-  enable and use it. If you say Y here even though your machine doesn't
-  have a local APIC, then the kernel will still run with no slowdown at
-  all. The local APIC supports CPU-generated self-interrupts (timer,
-  performance counters), and the NMI watchdog which detects hard lockups.
-
-  If you have a system with several CPUs, you do not need to say Y
-  here: the local APIC will be used automatically.
-
-Kernel math emulation
-CONFIG_MATH_EMULATION
-  Linux can emulate a math coprocessor (used for floating point
-  operations) if you don't have one. 486DX and Pentium processors have
-  a math coprocessor built in, 486SX and 386 do not, unless you added
-  a 487DX or 387, respectively. (The messages during boot time can
-  give you some hints here ["man dmesg"].) Everyone needs either a
-  coprocessor or this emulation.
-
-  If you don't have a math coprocessor, you need to say Y here; if you
-  say Y here even though you have a coprocessor, the coprocessor will
-  be used nevertheless. (This behaviour can be changed with the kernel
-  command line option "no387", which comes handy if your coprocessor
-  is broken. Try "man bootparam" or see the documentation of your boot
-  loader (lilo or loadlin) about how to pass options to the kernel at
-  boot time.) This means that it is a good idea to say Y here if you
-  intend to use this kernel on different machines.
-
-  More information about the internals of the Linux math coprocessor
-  emulation can be found in <file:arch/i386/math-emu/README>.
-
-  If you are not sure, say Y; apart from resulting in a 66 KB bigger
-  kernel, it won't hurt.
-
-Timer and CPU usage LEDs
-CONFIG_LEDS
-  If you say Y here, the LEDs on your machine will be used
-  to provide useful information about your current system status.
-
-  If you are compiling a kernel for a NetWinder or EBSA-285, you will
-  be able to select which LEDs are active using the options below. If
-  you are compiling a kernel for the EBSA-110 or the LART however, the
-  red LED will simply flash regularly to indicate that the system is
-  still functional. It is safe to say Y here if you have a CATS
-  system, but the driver will do nothing.
-
-Timer LED
-CONFIG_LEDS_TIMER
-  If you say Y here, one of the system LEDs (the green one on the
-  NetWinder, the amber one on the EBSA285, or the red one on the LART)
-  will flash regularly to indicate that the system is still
-  operational. This is mainly useful to kernel hackers who are
-  debugging unstable kernels.
-
-  The LART uses the same LED for both Timer LED and CPU usage LED
-  functions. You may choose to use both, but the Timer LED function
-  will overrule the CPU usage LED.
-
-CPU usage LED
-CONFIG_LEDS_CPU
-  If you say Y here, the red LED will be used to give a good real
-  time indication of CPU usage, by lighting whenever the idle task
-  is not currently executing.
-
-  The LART uses the same LED for both Timer LED and CPU usage LED
-  functions. You may choose to use both, but the Timer LED function
-  will overrule the CPU usage LED.
-
-Kernel FP software completion
-CONFIG_MATHEMU
-  This option is required for IEEE compliant floating point arithmetic
-  on the Alpha. The only time you would ever not say Y is to say M in
-  order to debug the code. Say Y unless you know what you are doing.
-
-# Choice: himem
-High Memory support
-CONFIG_NOHIGHMEM
-  Linux can use up to 64 Gigabytes of physical memory on x86 systems.
-  However, the address space of 32-bit x86 processors is only 4
-  Gigabytes large. That means that, if you have a large amount of
-  physical memory, not all of it can be "permanently mapped" by the
-  kernel. The physical memory that's not permanently mapped is called
-  "high memory".
-
-  If you are compiling a kernel which will never run on a machine with
-  more than 960 megabytes of total physical RAM, answer "off" here (default
-  choice and suitable for most users). This will result in a "3GB/1GB"
-  split: 3GB are mapped so that each process sees a 3GB virtual memory
-  space and the remaining part of the 4GB virtual memory space is used
-  by the kernel to permanently map as much physical memory as
-  possible.
-
-  If the machine has between 1 and 4 Gigabytes physical RAM, then
-  answer "4GB" here.
-
-  If more than 4 Gigabytes is used then answer "64GB" here. This
-  selection turns Intel PAE (Physical Address Extension) mode on.
-  PAE implements 3-level paging on IA32 processors. PAE is fully
-  supported by Linux, PAE mode is implemented on all recent Intel
-  processors (Pentium Pro and better). NOTE: If you say "64GB" here,
-  then the kernel will not boot on CPUs that don't support PAE!
-
-  The actual amount of total physical memory will either be auto
-  detected or can be forced by using a kernel command line option such
-  as "mem=256M". (Try "man bootparam" or see the documentation of your
-  boot loader (grub, lilo or loadlin) about how to pass options to the
-  kernel at boot time.)
-
-  If unsure, say "off".
-
-4GB
-CONFIG_HIGHMEM4G
-  Select this if you have a 32-bit processor and between 1 and 4
-  gigabytes of physical RAM.
-
-64GB
-CONFIG_HIGHMEM64G
-  Select this if you have a 32-bit processor and more than 4
-  gigabytes of physical RAM.
-
-HIGHMEM I/O support
-CONFIG_HIGHIO
-  If you want to be able to do I/O to high memory pages, say Y.
-  Otherwise low memory pages are used as bounce buffers causing a
-  degrade in performance.
-
-Normal floppy disk support
-CONFIG_BLK_DEV_FD
-  If you want to use the floppy disk drive(s) of your PC under Linux,
-  say Y. Information about this driver, especially important for IBM
-  Thinkpad users, is contained in <file:Documentation/floppy.txt>.
-  That file also contains the location of the Floppy driver FAQ as
-  well as location of the fdutils package used to configure additional
-  parameters of the driver at run time.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called floppy.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-iSeries Virtual I/O Disk Support
-CONFIG_VIODASD
-  If you are running on an iSeries system and you want to use
-  virtual disks created and managed by OS/400, say Y.
-
-iSeries Virtual I/O Disk IDE Emulation
-CONFIG_VIODASD_IDE
-  This causes the iSeries virtual disks to look like IDE disks.
-  If you have programs or utilities that only support certain
-  kinds of disks, this option will cause iSeries virtual disks
-  to pretend to be IDE disks, which may satisfy the program.
-
-Support for PowerMac floppy
-CONFIG_MAC_FLOPPY
-  If you have a SWIM-3 (Super Woz Integrated Machine 3; from Apple)
-  floppy controller, say Y here. Most commonly found in PowerMacs.
-
-RAM disk support
-CONFIG_BLK_DEV_RAM
-  Saying Y here will allow you to use a portion of your RAM memory as
-  a block device, so that you can make file systems on it, read and
-  write to it and do all the other things that you can do with normal
-  block devices (such as hard drives). It is usually used to load and
-  store a copy of a minimal root file system off of a floppy into RAM
-  during the initial install of Linux.
-
-  Note that the kernel command line option "ramdisk=XX" is now
-  obsolete. For details, read <file:Documentation/ramdisk.txt>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M and read <file:Documentation/modules.txt>. The module will be
-  called rd.o.
-
-  Most normal users won't need the RAM disk functionality, and can
-  thus say N here.
-
-Default RAM disk size
-CONFIG_BLK_DEV_RAM_SIZE
-  The default value is 4096. Only change this if you know what are
-  you doing. If you are using IBM S/390, then set this to 8192.
-
-Initial RAM disk (initrd) support
-CONFIG_BLK_DEV_INITRD
-  The initial RAM disk is a RAM disk that is loaded by the boot loader
-  (loadlin or lilo) and that is mounted as root before the normal boot
-  procedure. It is typically used to load modules needed to mount the
-  "real" root file system, etc. See <file:Documentation/initrd.txt>
-  for details.
-
-Loopback device support
-CONFIG_BLK_DEV_LOOP
-  Saying Y here will allow you to use a regular file as a block
-  device; you can then create a file system on that block device and
-  mount it just as you would mount other block devices such as hard
-  drive partitions, CD-ROM drives or floppy drives. The loop devices
-  are block special device files with major number 7 and typically
-  called /dev/loop0, /dev/loop1 etc.
-
-  This is useful if you want to check an ISO 9660 file system before
-  burning the CD, or if you want to use floppy images without first
-  writing them to floppy. Furthermore, some Linux distributions avoid
-  the need for a dedicated Linux partition by keeping their complete
-  root file system inside a DOS FAT file using this loop device
-  driver.
-
-  The loop device driver can also be used to "hide" a file system in a
-  disk partition, floppy, or regular file, either using encryption
-  (scrambling the data) or steganography (hiding the data in the low
-  bits of, say, a sound file). This is also safe if the file resides
-  on a remote file server. If you want to do this, you will first have
-  to acquire and install a kernel patch from
-  <ftp://ftp.kerneli.org/pub/kerneli/>, and then you need to
-  say Y to this option.
-
-  Note that alternative ways to use encrypted file systems are
-  provided by the cfs package, which can be gotten from
-  <ftp://ftp.kerneli.org/pub/kerneli/net-source/>, and the newer tcfs
-  package, available at <http://tcfs.dia.unisa.it/>. You do not need
-  to say Y here if you want to use one of these. However, using cfs
-  requires saying Y to "NFS file system support" below while using
-  tcfs requires applying a kernel patch. An alternative steganography
-  solution is provided by StegFS, also available from
-  <ftp://ftp.kerneli.org/pub/kerneli/net-source/>.
-
-  To use the loop device, you need the losetup utility and a recent
-  version of the mount program, both contained in the util-linux
-  package. The location and current version number of util-linux is
-  contained in the file <file:Documentation/Changes>.
-
-  Note that this loop device has nothing to do with the loopback
-  device used for network connections from the machine to itself.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>. The module
-  will be called loop.o.
-
-  Most users will answer N here.
-
-Micro Memory MM5415 Battery Backed RAM support (EXPERIMENTAL)
-CONFIG_BLK_DEV_UMEM
-  Saying Y here will include support for the MM5415 family of
-  battery backed (Non-volatile) RAM cards.
-  <http://www.umem.com/>
-
-  The cards appear as block devices that can be partitioned into
-  as many as 15 partitions.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called umem.o.
-
-  The umem driver has been allocated block major number 116.
-  See Documentation/devices.txt for recommended device naming.
-
-Network block device support
-CONFIG_BLK_DEV_NBD
-  Saying Y here will allow your computer to be a client for network
-  block devices, i.e. it will be able to use block devices exported by
-  servers (mount file systems on them etc.). Communication between
-  client and server works over TCP/IP networking, but to the client
-  program this is hidden: it looks like a regular local file access to
-  a block device special file such as /dev/nd0.
-
-  Network block devices also allows you to run a block-device in
-  userland (making server and client physically the same computer,
-  communicating using the loopback network device).
-
-  Read <file:Documentation/nbd.txt> for more information, especially
-  about where to find the server code, which runs in user space and
-  does not need special kernel support.
-
-  Note that this has nothing to do with the network file systems NFS
-  or Coda; you can say N here even if you intend to use NFS or Coda.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>. The module
-  will be called nbd.o.
-
-  If unsure, say N.
-
-XenoLinux virtual block device support
-CONFIG_XENOLINUX_BLOCK
-  Xen can export virtual block devices which map back to extents of
-  blocks on the physical partitions.  This option is needed for
-  xenolinux to make use of such devices when running as a Xen guest.
-
-  If unsure, say Y.
-
-Per partition statistics in /proc/partitions
-CONFIG_BLK_STATS
-  If you say yes here, your kernel will keep statistical information
-  for every partition. The information includes things as numbers of
-  read and write accesses, the number of merged requests etc.
-
-  This is required for the full functionality of sar(8) and interesting
-  if you want to do performance tuning, by tweaking the elevator, e.g.
-
-  If unsure, say N.
-
-ATA/IDE/MFM/RLL support
-CONFIG_IDE
-  If you say Y here, your kernel will be able to manage low cost mass
-  storage units such as ATA/(E)IDE and ATAPI units. The most common
-  cases are IDE hard drives and ATAPI CD-ROM drives.
-
-  If your system is pure SCSI and doesn't use these interfaces, you
-  can say N here.
-
-  Integrated Disk Electronics (IDE aka ATA-1) is a connecting standard
-  for mass storage units such as hard disks. It was designed by
-  Western Digital and Compaq Computer in 1984. It was then named
-  ST506. Quite a number of disks use the IDE interface.
-
-  AT Attachment (ATA) is the superset of the IDE specifications.
-  ST506 was also called ATA-1.
-
-  Fast-IDE is ATA-2 (also named Fast ATA), Enhanced IDE (EIDE) is
-  ATA-3. It provides support for larger disks (up to 8.4GB by means of
-  the LBA standard), more disks (4 instead of 2) and for other mass
-  storage units such as tapes and cdrom. UDMA/33 (aka UltraDMA/33) is
-  ATA-4 and provides faster (and more CPU friendly) transfer modes
-  than previous PIO (Programmed processor Input/Output) from previous
-  ATA/IDE standards by means of fast DMA controllers.
-
-  ATA Packet Interface (ATAPI) is a protocol used by EIDE tape and
-  CD-ROM drives, similar in many respects to the SCSI protocol.
-
-  SMART IDE (Self Monitoring, Analysis and Reporting Technology) was
-  designed in order to prevent data corruption and disk crash by
-  detecting pre hardware failure conditions (heat, access time, and
-  the like...). Disks built since June 1995 may follow this standard.
-  The kernel itself don't manage this; however there are quite a
-  number of user programs such as smart that can query the status of
-  SMART parameters disk.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>. The module
-  will be called ide.o.
-
-  For further information, please read <file:Documentation/ide.txt>.
-
-  If unsure, say Y.
-
-Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
-CONFIG_BLK_DEV_IDE
-  If you say Y here, you will use the full-featured IDE driver to
-  control up to ten ATA/IDE interfaces, each being able to serve a
-  "master" and a "slave" device, for a total of up to twenty ATA/IDE
-  disk/cdrom/tape/floppy drives.
-
-  Useful information about large (>540 MB) IDE disks, multiple
-  interfaces, what to do if ATA/IDE devices are not automatically
-  detected, sound card ATA/IDE ports, module support, and other
-  topics, is contained in <file:Documentation/ide.txt>. For detailed
-  information about hard drives, consult the Disk-HOWTO and the
-  Multi-Disk-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  To fine-tune ATA/IDE drive/interface parameters for improved
-  performance, look for the hdparm package at
-  <ftp://ibiblio.org/pub/Linux/system/hardware/>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt> and
-  <file:Documentation/ide.txt>. The module will be called ide-mod.o.
-  Do not compile this driver as a module if your root file system (the
-  one containing the directory /) is located on an IDE device.
-
-  If you have one or more IDE drives, say Y or M here. If your system
-  has no IDE drives, or if memory requirements are really tight, you
-  could say N here, and select the "Old hard disk driver" below
-  instead to save about 13 KB of memory in the kernel.
-
-Old hard disk (MFM/RLL/IDE) driver
-CONFIG_BLK_DEV_HD_ONLY
-  There are two drivers for MFM/RLL/IDE hard disks. Most people use
-  the newer enhanced driver, but this old one is still around for two
-  reasons. Some older systems have strange timing problems and seem to
-  work only with the old driver (which itself does not work with some
-  newer systems). The other reason is that the old driver is smaller,
-  since it lacks the enhanced functionality of the new one. This makes
-  it a good choice for systems with very tight memory restrictions, or
-  for systems with only older MFM/RLL/ESDI drives. Choosing the old
-  driver can save 13 KB or so of kernel memory.
-
-  If you are unsure, then just choose the Enhanced IDE/MFM/RLL driver
-  instead of this one. For more detailed information, read the
-  Disk-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-Use old disk-only driver on primary interface
-CONFIG_BLK_DEV_HD_IDE
-  There are two drivers for MFM/RLL/IDE disks.  Most people use just
-  the new enhanced driver by itself.  This option however installs the
-  old hard disk driver to control the primary IDE/disk interface in
-  the system, leaving the new enhanced IDE driver to take care of only
-  the 2nd/3rd/4th IDE interfaces.  Doing this will prevent you from
-  having an IDE/ATAPI CD-ROM or tape drive connected to the primary
-  IDE interface.  Choosing this option may be useful for older systems
-  which have MFM/RLL/ESDI controller+drives at the primary port
-  address (0x1f0), along with IDE drives at the secondary/3rd/4th port
-  addresses.
-
-  Normally, just say N here; you will then use the new driver for all
-  4 interfaces.
-
-Include IDE/ATA-2 DISK support
-CONFIG_BLK_DEV_IDEDISK
-  This will include enhanced support for MFM/RLL/IDE hard disks.  If
-  you have a MFM/RLL/IDE disk, and there is no special reason to use
-  the old hard disk driver instead, say Y.  If you have an SCSI-only
-  system, you can say N here.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called ide-disk.o.  Do not compile this driver as a module
-  if your root file system (the one containing the directory /) is
-  located on the IDE disk. If unsure, say Y.
-
-Use multi-mode by default
-CONFIG_IDEDISK_MULTI_MODE
-  If you get this error, try to say Y here:
-
-  hda: set_multmode: status=0x51 { DriveReady SeekComplete Error }
-  hda: set_multmode: error=0x04 { DriveStatusError }
-
-  If in doubt, say N.
-
-PCMCIA IDE support
-CONFIG_BLK_DEV_IDECS
-  Support for outboard IDE disks, tape drives, and CD-ROM drives
-  connected through a  PCMCIA card.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  ide-cs.o
-
-Include IDE/ATAPI CD-ROM support
-CONFIG_BLK_DEV_IDECD
-  If you have a CD-ROM drive using the ATAPI protocol, say Y. ATAPI is
-  a newer protocol used by IDE CD-ROM and TAPE drives, similar to the
-  SCSI protocol. Most new CD-ROM drives use ATAPI, including the
-  NEC-260, Mitsumi FX400, Sony 55E, and just about all non-SCSI
-  double(2X) or better speed drives.
-
-  If you say Y here, the CD-ROM drive will be identified at boot time
-  along with other IDE devices, as "hdb" or "hdc", or something
-  similar (check the boot messages with dmesg). If this is your only
-  CD-ROM drive, you can say N to all other CD-ROM options, but be sure
-  to say Y or M to "ISO 9660 CD-ROM file system support".
-
-  Note that older versions of LILO (LInux LOader) cannot properly deal
-  with IDE/ATAPI CD-ROMs, so install LILO 16 or higher, available from
-  <ftp://brun.dyndns.org/pub/linux/lilo/>.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called ide-cd.o.
-
-Include IDE/ATAPI TAPE support
-CONFIG_BLK_DEV_IDETAPE
-  If you have an IDE tape drive using the ATAPI protocol, say Y.
-  ATAPI is a newer protocol used by IDE tape and CD-ROM drives,
-  similar to the SCSI protocol.  If you have an SCSI tape drive
-  however, you can say N here.
-
-  You should also say Y if you have an OnStream DI-30 tape drive; this
-  will not work with the SCSI protocol, until there is support for the
-  SC-30 and SC-50 versions.
-
-  If you say Y here, the tape drive will be identified at boot time
-  along with other IDE devices, as "hdb" or "hdc", or something
-  similar, and will be mapped to a character device such as "ht0"
-  (check the boot messages with dmesg).  Be sure to consult the
-  <file:drivers/ide/ide-tape.c> and <file:Documentation/ide.txt> files
-  for usage information.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called ide-tape.o.
-
-Include IDE/ATAPI FLOPPY support
-CONFIG_BLK_DEV_IDEFLOPPY
-  If you have an IDE floppy drive which uses the ATAPI protocol,
-  answer Y.  ATAPI is a newer protocol used by IDE CD-ROM/tape/floppy
-  drives, similar to the SCSI protocol.
-
-  The LS-120 and the IDE/ATAPI Iomega ZIP drive are also supported by
-  this driver. For information about jumper settings and the question
-  of when a ZIP drive uses a partition table, see
-  <http://www.win.tue.nl/~aeb/linux/zip/zip-1.html>.
-  (ATAPI PD-CD/CDR drives are not supported by this driver; support
-  for PD-CD/CDR drives is available if you answer Y to
-  "SCSI emulation support", below).
-
-  If you say Y here, the FLOPPY drive will be identified along with
-  other IDE devices, as "hdb" or "hdc", or something similar (check
-  the boot messages with dmesg).
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called ide-floppy.o.
-
-AWARD Bios Work-Around
-CONFIG_IDEDISK_STROKE
-  Should you have a system w/ an AWARD Bios and your drives are larger
-  than 32GB and it will not boot, one is required to perform a few OEM
-  operations first.  The option is called "STROKE" because it allows
-  one to "soft clip" the drive to work around a barrier limit.  For
-  Maxtor drives it is called "jumpon.exe".  Please search Maxtor's
-  web-site for "JUMPON.EXE".  IBM has a similar tool at:
-  <http://www.storage.ibm.com/hdd/support/download.htm>.
-
-  If you are unsure, say N here.
-
-Raw Access to Media
-CONFIG_IDE_TASK_IOCTL
-  This is a direct raw access to the media.  It is a complex but
-  elegant solution to test and validate the domain of the hardware and
-  perform below the driver data recover if needed.  This is the most
-  basic form of media-forensics.
-
-  If you are unsure, say N here.
-
-Use Taskfile I/O
-CONFIG_IDE_TASKFILE_IO
-  This is the "Jewel" of the patch.  It will go away and become the new
-  driver core.  Since all the chipsets/host side hardware deal w/ their
-  exceptions in "their local code" currently, adoption of a
-  standardized data-transport is the only logical solution.
-  Additionally we packetize the requests and gain rapid performance and
-  a reduction in system latency.  Additionally by using a memory struct
-  for the commands we can redirect to a MMIO host hardware in the next
-  generation of controllers, specifically second generation Ultra133
-  and Serial ATA.
-
-  Since this is a major transition, it was deemed necessary to make the
-  driver paths buildable in separate models.  Therefore if using this
-  option fails for your arch then we need to address the needs for that
-  arch.
-
-  If you want to test this functionality, say Y here.
-
-Force DMA
-CONFIG_BLK_DEV_IDEDMA_FORCED
-  This is an old piece of lost code from Linux 2.0 Kernels.
-
-  Generally say N here.
-
-DMA Only on Disks
-CONFIG_IDEDMA_ONLYDISK
-  This is used if you know your ATAPI Devices are going to fail DMA
-  Transfers.
-
-  Generally say N here.
-
-SCSI emulation support
-CONFIG_BLK_DEV_IDESCSI
-  This will provide SCSI host adapter emulation for IDE ATAPI devices,
-  and will allow you to use a SCSI device driver instead of a native
-  ATAPI driver.
-
-  This is useful if you have an ATAPI device for which no native
-  driver has been written (for example, an ATAPI PD-CD or CDR drive);
-  you can then use this emulation together with an appropriate SCSI
-  device driver. In order to do this, say Y here and to "SCSI support"
-  and "SCSI generic support", below. You must then provide the kernel
-  command line "hdx=scsi" (try "man bootparam" or see the
-  documentation of your boot loader (lilo or loadlin) about how to
-  pass options to the kernel at boot time) for devices if you want the
-  native EIDE sub-drivers to skip over the native support, so that
-  this SCSI emulation can be used instead. This is required for use of
-  CD-RW's.
-
-  Note that this option does NOT allow you to attach SCSI devices to a
-  box that doesn't have a SCSI host adapter installed.
-
-  If both this SCSI emulation and native ATAPI support are compiled
-  into the kernel, the native support will be used.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  ide-scsi.o
-
-Use the NOOP Elevator (WARNING)
-CONFIG_BLK_DEV_ELEVATOR_NOOP
-  If you are using a raid class top-level driver above the ATA/IDE core,
-  one may find a performance boost by preventing a merging and re-sorting
-  of the new requests.
-
-  If unsure, say N.
-
-ISA-PNP EIDE support
-CONFIG_BLK_DEV_ISAPNP
-  If you have an ISA EIDE card that is PnP (Plug and Play) and
-  requires setup first before scanning for devices, say Y here.
-
-  If unsure, say N.
-
-CMD640 chipset bugfix/support
-CONFIG_BLK_DEV_CMD640
-  The CMD-Technologies CMD640 IDE chip is used on many common 486 and
-  Pentium motherboards, usually in combination with a "Neptune" or
-  "SiS" chipset. Unfortunately, it has a number of rather nasty
-  design flaws that can cause severe data corruption under many common
-  conditions. Say Y here to include code which tries to automatically
-  detect and correct the problems under Linux. This option also
-  enables access to the secondary IDE ports in some CMD640 based
-  systems.
-
-  This driver will work automatically in PCI based systems (most new
-  systems have PCI slots). But if your system uses VESA local bus
-  (VLB) instead of PCI, you must also supply a kernel boot parameter
-  to enable the CMD640 bugfix/support: "ide0=cmd640_vlb". (Try "man
-  bootparam" or see the documentation of your boot loader about how to
-  pass options to the kernel.)
-
-  The CMD640 chip is also used on add-in cards by Acculogic, and on
-  the "CSA-6400E PCI to IDE controller" that some people have. For
-  details, read <file:Documentation/ide.txt>.
-
-CMD640 enhanced support
-CONFIG_BLK_DEV_CMD640_ENHANCED
-  This option includes support for setting/autotuning PIO modes and
-  prefetch on CMD640 IDE interfaces.  For details, read
-  <file:Documentation/ide.txt>. If you have a CMD640 IDE interface
-  and your BIOS does not already do this for you, then say Y here.
-  Otherwise say N.
-
-RZ1000 chipset bugfix/support
-CONFIG_BLK_DEV_RZ1000
-  The PC-Technologies RZ1000 IDE chip is used on many common 486 and
-  Pentium motherboards, usually along with the "Neptune" chipset.
-  Unfortunately, it has a rather nasty design flaw that can cause
-  severe data corruption under many conditions. Say Y here to include
-  code which automatically detects and corrects the problem under
-  Linux. This may slow disk throughput by a few percent, but at least
-  things will operate 100% reliably.
-
-Generic PCI IDE chipset support
-CONFIG_BLK_DEV_IDEPCI
-  Say Y here for PCI systems which use IDE drive(s).
-  This option helps the IDE driver to automatically detect and
-  configure all PCI-based IDE interfaces in your system.
-
-Support for sharing PCI IDE interrupts
-CONFIG_IDEPCI_SHARE_IRQ
-  Some ATA/IDE chipsets have hardware support which allows for
-  sharing a single IRQ with other cards. To enable support for
-  this in the ATA/IDE driver, say Y here.
-
-  It is safe to say Y to this question, in most cases.
-  If unsure, say N.
-
-Generic PCI bus-master DMA support
-CONFIG_BLK_DEV_IDEDMA_PCI
-  If your PCI system uses IDE drive(s) (as opposed to SCSI, say) and
-  is capable of bus-master DMA operation (most Pentium PCI systems),
-  you will want to say Y here to reduce CPU overhead. You can then use
-  the "hdparm" utility to enable DMA for drives for which it was not
-  enabled automatically. By default, DMA is not enabled automatically
-  for these drives, but you can change that by saying Y to the
-  following question "Use DMA by default when available". You can get
-  the latest version of the hdparm utility from
-  <ftp://ibiblio.org/pub/Linux/system/hardware/>.
-
-  Read the comments at the beginning of <file:drivers/ide/ide-dma.c>
-  and the file <file:Documentation/ide.txt> for more information.
-
-  It is safe to say Y to this question.
-
-Good-Bad DMA Model-Firmware (WIP)
-CONFIG_IDEDMA_NEW_DRIVE_LISTINGS
-  If you say Y here, the model and firmware revision of your drive
-  will be compared against a blacklist of buggy drives that claim to
-  be (U)DMA capable but aren't. This is a blanket on/off test with no
-  speed limit options.
-
-  Straight GNU GCC 2.7.3/2.8.X compilers are known to be safe;
-  whereas, many versions of EGCS have a problem and miscompile if you
-  say Y here.
-
-  If in doubt, say N.
-
-Attempt to HACK around Chipsets that TIMEOUT (WIP)
-CONFIG_BLK_DEV_IDEDMA_TIMEOUT
-  If you say Y here, this is a NASTY UGLY HACK!
-
-  We have to issue an abort and requeue the request DMA engine got
-  turned off by a goofy ASIC, and we have to clean up the mess, and
-  here is as good as any.  Do it globally for all chipsets.
-
-  If in doubt, say N.
-
-Boot off-board chipsets first support
-CONFIG_BLK_DEV_OFFBOARD
-  Normally, IDE controllers built into the motherboard (on-board
-  controllers) are assigned to ide0 and ide1 while those on add-in PCI
-  cards (off-board controllers) are relegated to ide2 and ide3.
-  Answering Y here will allow you to reverse the situation, with
-  off-board controllers on ide0/1 and on-board controllers on ide2/3.
-  This can improve the usability of some boot managers such as lilo
-  when booting from a drive on an off-board controller.
-
-  If you say Y here, and you actually want to reverse the device scan
-  order as explained above, you also need to issue the kernel command
-  line option "ide=reverse". (Try "man bootparam" or see the
-  documentation of your boot loader (lilo or loadlin) about how to
-  pass options to the kernel at boot time.)
-
-  Note that, if you do this, the order of the hd* devices will be
-  rearranged which may require modification of fstab and other files.
-
-  If in doubt, say N.
-
-Use PCI DMA by default when available
-CONFIG_IDEDMA_PCI_AUTO
-  Prior to kernel version 2.1.112, Linux used to automatically use
-  DMA for IDE drives and chipsets which support it. Due to concerns
-  about a couple of cases where buggy hardware may have caused damage,
-  the default is now to NOT use DMA automatically. To revert to the
-  previous behaviour, say Y to this question.
-
-  If you suspect your hardware is at all flakey, say N here.
-  Do NOT email the IDE kernel people regarding this issue!
-
-  It is normally safe to answer Y to this question unless your
-  motherboard uses a VIA VP2 chipset, in which case you should say N.
-
-IGNORE word93 Validation BITS
-CONFIG_IDEDMA_IVB
-  There are unclear terms in ATA-4 and ATA-5 standards how certain
-  hardware (an 80c ribbon) should be detected. Different interpretations
-  of the standards have been released in hardware. This causes problems:
-  for example, a host with Ultra Mode 4 (or higher) will not run
-  in that mode with an 80c ribbon.
-
-  If you are experiencing compatibility or performance problems, you
-  MAY try to answering Y here. However, it does not necessarily solve
-  any of your problems, it could even cause more of them.
-
-  It is normally safe to answer Y; however, the default is N.
-
-ATA Work(s) In Progress (EXPERIMENTAL)
-CONFIG_IDEDMA_PCI_WIP
-  If you enable this you will be able to use and test highly
-  developmental projects. If you say N, the configurator will
-  simply skip those options.
-
-  It is SAFEST to say N to this question.
-
-Asynchronous DMA support (EXPERIMENTAL)
-CONFIG_BLK_DEV_ADMA
-  Please read the comments at the top of
-  <file:drivers/ide/ide-adma.c>.
-
-Pacific Digital A-DMA support (EXPERIMENTAL)
-CONFIG_BLK_DEV_PDC_ADMA
-  Please read the comments at the top of <file:drivers/ide/setup-pci.c>.
-
-3ware Hardware ATA-RAID support
-CONFIG_BLK_DEV_3W_XXXX_RAID
-  3ware is the only hardware ATA-Raid product in Linux to date.
-  This card is 2,4, or 8 channel master mode support only.
-  SCSI support required!!!
-
-  <http://www.3ware.com/>
-
-  Please read the comments at the top of
-  <file:drivers/scsi/3w-xxxx.c>.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called 3w-xxxx.o.
-
-AEC62XX chipset support
-CONFIG_BLK_DEV_AEC62XX
-  This driver adds up to 4 more EIDE devices sharing a single
-  interrupt. This add-on card is a bootable PCI UDMA controller. In
-  order to get this card to initialize correctly in some cases, you
-  should say Y here, and preferably also to "Use DMA by default when
-  available".
-
-  The ATP850U/UF is an UltraDMA 33 chipset base.
-  The ATP860 is an UltraDMA 66 chipset base.
-  The ATP860M(acintosh) version is an UltraDMA 66 chipset base.
-
-  Please read the comments at the top of <file:drivers/ide/pci/aec62xx.c>.
-  If you say Y here, then say Y to "Use DMA by default when available"
-  as well.
-
-AEC62XX Tuning support
-CONFIG_AEC62XX_TUNING
-  Please read the comments at the top of <file:drivers/ide/pci/aec62xx.c>.
-  If unsure, say N.
-
-ALI M15x3 chipset support
-CONFIG_BLK_DEV_ALI15X3
-  This driver ensures (U)DMA support for ALI 1533, 1543 and 1543C
-  onboard chipsets.  It also tests for Simplex mode and enables
-  normal dual channel support.
-
-  If you say Y here, you also need to say Y to "Use DMA by default
-  when available", above.  Please read the comments at the top of
-  <file:drivers/ide/pci/alim15x3.c>.
-
-  If unsure, say N.
-
-ALI M15x3 WDC support (DANGEROUS)
-CONFIG_WDC_ALI15X3
-  This allows for UltraDMA support for WDC drives that ignore CRC
-  checking. You are a fool for enabling this option, but there have
-  been requests. DO NOT COMPLAIN IF YOUR DRIVE HAS FS CORRUPTION, IF
-  YOU ENABLE THIS! No one will listen, just laugh for ignoring this
-  SERIOUS WARNING.
-
-  Using this option can allow WDC drives to run at ATA-4/5 transfer
-  rates with only an ATA-2 support structure.
-
-  SAY N!
-
-AMD and nVidia IDE support
-CONFIG_BLK_DEV_AMD74XX
-  This driver adds explicit support for AMD-7xx and AMD-8111 chips
-  and also for the nVidia nForce chip.  This allows the kernel to
-  change PIO, DMA and UDMA speeds and to configure the chip to
-  optimum performance.
-
-  If you say Y here, you also need to say Y to "Use DMA by default
-  when available", above.
-  Please read the comments at the top of <file:drivers/ide/pci/amd74xx.c>.
-
-  If unsure, say N.
-
-AMD Viper ATA-66 Override support (WIP)
-CONFIG_AMD74XX_OVERRIDE
-  This option auto-forces the ata66 flag.
-  This effect can be also invoked by calling "idex=ata66"
-  If unsure, say N.
-
-CMD64X/CMD680 chipset support
-CONFIG_BLK_DEV_CMD64X
-  Say Y here if you have an IDE controller which uses any of these
-  chipsets: CMD643, CMD646 and CMD648.
-
-CY82C693 chipset support
-CONFIG_BLK_DEV_CY82C693
-  This driver adds detection and support for the CY82C693 chipset
-  used on Digital's PC-Alpha 164SX boards.
-
-  If you say Y here, you need to say Y to "Use DMA by default
-  when available" as well.
-
-Cyrix CS5530 MediaGX chipset support
-CONFIG_BLK_DEV_CS5530
-  Include support for UDMA on the Cyrix MediaGX 5530 chipset. This
-  will automatically be detected and configured if found.
-
-  It is safe to say Y to this question.
-
-  People with SCSI-only systems should say N here. If unsure, say Y.
-
-HPT34X chipset support
-CONFIG_BLK_DEV_HPT34X
-  This driver adds up to 4 more EIDE devices sharing a single
-  interrupt. The HPT343 chipset in its current form is a non-bootable
-  controller; the HPT345/HPT363 chipset is a bootable (needs BIOS FIX)
-  PCI UDMA controllers. This driver requires dynamic tuning of the
-  chipset during the ide-probe at boot time. It is reported to support
-  DVD II drives, by the manufacturer.
-
-HPT34X AUTODMA support (WIP)
-CONFIG_HPT34X_AUTODMA
-  This is a dangerous thing to attempt currently! Please read the
-  comments at the top of <file:drivers/ide/pci/hpt34x.c>.  If you say Y
-  here, then say Y to "Use DMA by default when available" as well.
-
-  If unsure, say N.
-
-HPT36X/37X chipset support
-CONFIG_BLK_DEV_HPT366
-  HPT366 is an Ultra DMA chipset for ATA-66.
-  HPT368 is an Ultra DMA chipset for ATA-66 RAID Based.
-  HPT370 is an Ultra DMA chipset for ATA-100.
-  HPT372 is an Ultra DMA chipset for ATA-133.
-  HPT374 is an Ultra DMA chipset for ATA-133.
-
-  This driver adds up to 4 more EIDE devices sharing a single
-  interrupt.
-
-  The HPT366 chipset in its current form is bootable. One solution
-  for this problem are special LILO commands for redirecting the
-  reference to device 0x80. The other solution is to say Y to "Boot
-  off-board chipsets first support" (CONFIG_BLK_DEV_OFFBOARD) unless
-  your mother board has the chipset natively mounted. Regardless one
-  should use the fore mentioned option and call at LILO or include
-  "ide=reverse" in LILO's append-line.
-
-  This driver requires dynamic tuning of the chipset during the
-  ide-probe at boot. It is reported to support DVD II drives, by the
-  manufacturer.
-
-NS87415 chipset support (EXPERIMENTAL)
-CONFIG_BLK_DEV_NS87415
-  This driver adds detection and support for the NS87415 chip
-  (used in SPARC64, among others).
-
-  Please read the comments at the top of <file:drivers/ide/pci/ns87415.c>.
-
-OPTi 82C621 chipset enhanced support (EXPERIMENTAL)
-CONFIG_BLK_DEV_OPTI621
-  This is a driver for the OPTi 82C621 EIDE controller.
-  Please read the comments at the top of <file:drivers/ide/pci/opti621.c>.
-
-ServerWorks OSB4/CSB5 chipset support
-CONFIG_BLK_DEV_SVWKS
-  This driver adds PIO/(U)DMA support for the ServerWorks OSB4/CSB5
-  chipsets.
-
-Intel PIIXn chipsets support
-CONFIG_BLK_DEV_PIIX
-  This driver adds PIO mode setting and tuning for all PIIX IDE
-  controllers by Intel.  Since the BIOS can sometimes improperly tune
-  PIO 0-4 mode settings, this allows dynamic tuning of the chipset
-  via the standard end-user tool 'hdparm'.
-
-  Please read the comments at the top of <file:drivers/ide/pci/piix.c>.
-
-  If you say Y here, you should also say Y to "PIIXn Tuning support",
-  below.
-
-  If unsure, say N.
-
-PIIXn Tuning support
-CONFIG_PIIX_TUNING
-  This driver extension adds DMA mode setting and tuning for all PIIX
-  IDE controllers by Intel. Since the BIOS can sometimes improperly
-  set up the device/adapter combination and speed limits, it has
-  become a necessity to back/forward speed devices as needed.
-
-  Case 430HX/440FX PIIX3 need speed limits to reduce UDMA to DMA mode
-  2 if the BIOS can not perform this task at initialization.
-
-  If unsure, say N.
-
-PROMISE PDC20246/PDC20262/PDC20265/PDC20267/PDC20268 support
-CONFIG_BLK_DEV_PDC202XX_OLD
-  Promise Ultra33 or PDC20246
-  Promise Ultra66 or PDC20262
-  Promise Ultra100 or PDC20265/PDC20267/PDC20268
-
-  This driver adds up to 4 more EIDE devices sharing a single
-  interrupt. This add-on card is a bootable PCI UDMA controller. Since
-  multiple cards can be installed and there are BIOS ROM problems that
-  happen if the BIOS revisions of all installed cards (three-max) do
-  not match, the driver attempts to do dynamic tuning of the chipset
-  at boot-time for max-speed.  Ultra33 BIOS 1.25 or newer is required
-  for more than one card. This card may require that you say Y to
-  "Special UDMA Feature".
-
-  If you say Y here, you need to say Y to "Use DMA by default when
-  available" as well.
-
-  Please read the comments at the top of
-  <file:drivers/ide/pci/pdc202xx_old.c>.
-
-  If unsure, say N.
-
-Special UDMA Feature
-CONFIG_PDC202XX_BURST
-  This option causes the pdc202xx driver to enable UDMA modes on the
-  PDC202xx even when the PDC202xx BIOS has not done so.
-
-  It was originally designed for the PDC20246/Ultra33, whose BIOS will
-  only setup UDMA on the first two PDC20246 cards.  It has also been
-  used successfully on a PDC20265/Ultra100, allowing use of UDMA modes
-  when the PDC20265 BIOS has been disabled (for faster boot up).
-
-  Please read the comments at the top of
-  <file:drivers/ide/pci/pdc202xx_old.c>.
-
-  If unsure, say N.
-
-Special FastTrak Feature
-CONFIG_PDC202XX_FORCE
-  For FastTrak enable overriding BIOS.
-
-SiS5513 chipset support
-CONFIG_BLK_DEV_SIS5513
-  This driver ensures (U)DMA support for SIS5513 chipset family based
-  mainboards.
-
-  The following chipsets are supported:
-  ATA16:  SiS5511, SiS5513
-  ATA33:  SiS5591, SiS5597, SiS5598, SiS5600
-  ATA66:  SiS530, SiS540, SiS620, SiS630, SiS640
-  ATA100: SiS635, SiS645, SiS650, SiS730, SiS735, SiS740,
-          SiS745, SiS750
-
-  If you say Y here, you need to say Y to "Use DMA by default when
-  available" as well.
-
-  Please read the comments at the top of <file:drivers/ide/pci/sis5513.c>.
-
-Silicon Image chipset support
-CONFIG_BLK_DEV_SIIMAGE
-  This driver provides (U)DMA support for the SII3112 SATA controllers and
-  for the CMD/SI680 UDMA/DMA ATA controller.
-
-SLC90E66 chipset support
-CONFIG_BLK_DEV_SLC90E66
-  This driver ensures (U)DMA support for Victroy66 SouthBridges for
-  SMsC with Intel NorthBridges.  This is an Ultra66 based chipset.
-  The nice thing about it is that you can mix Ultra/DMA/PIO devices
-  and it will handle timing cycles.  Since this is an improved
-  look-a-like to the PIIX4 it should be a nice addition.
-
-  If you say Y here, you need to say Y to "Use DMA by default when
-  available" as well.
-
-  Please read the comments at the top of
-  <file:drivers/ide/pci/slc90e66.c>.
-
-Winbond SL82c105 support
-CONFIG_BLK_DEV_SL82C105
-  If you have a Winbond SL82c105 IDE controller, say Y here to enable
-  special configuration for this chip. This is common on various CHRP
-  motherboards, but could be used elsewhere. If in doubt, say Y.
-
-Tekram TRM290 chipset support
-CONFIG_BLK_DEV_TRM290
-  This driver adds support for bus master DMA transfers
-  using the Tekram TRM290 PCI IDE chip. Volunteers are
-  needed for further tweaking and development.
-  Please read the comments at the top of <file:drivers/ide/pci/trm290.c>.
-
-VIA82CXXX chipset support
-CONFIG_BLK_DEV_VIA82CXXX
-  This allows you to configure your chipset for a better use while
-  running PIO/(U)DMA, it will allow you to enable efficiently the
-  second channel dma usage, as it may not be set by BIOS.  It will try
-  to set fifo configuration at its best.  It will allow you to get
-  information from /proc/ide/via provided you enabled "/proc file
-  system" support.
-
-  Please read the comments at the top of
-  <file:drivers/ide/pci/via82cxxx.c>.
-
-  If you say Y here, then say Y to "Use DMA by default when available"
-  as well.
-
-  If unsure, say N.
-
-RapIDE interface support
-CONFIG_BLK_DEV_IDE_RAPIDE
-  Say Y here if you want to support the Yellowstone RapIDE controller
-  manufactured for use with Acorn computers.
-
-Other IDE chipset support
-CONFIG_IDE_CHIPSETS
-  Say Y here if you want to include enhanced support for various IDE
-  interface chipsets used on motherboards and add-on cards. You can
-  then pick your particular IDE chip from among the following options.
-  This enhanced support may be necessary for Linux to be able to
-  access the 3rd/4th drives in some systems. It may also enable
-  setting of higher speed I/O rates to improve system performance with
-  these chipsets. Most of these also require special kernel boot
-  parameters to actually turn on the support at runtime; you can find
-  a list of these in the file <file:Documentation/ide.txt>.
-
-  People with SCSI-only systems can say N here.
-
-Generic 4 drives/port support
-CONFIG_BLK_DEV_4DRIVES
-  Certain older chipsets, including the Tekram 690CD, use a single set
-  of I/O ports at 0x1f0 to control up to four drives, instead of the
-  customary two drives per port. Support for this can be enabled at
-  runtime using the "ide0=four" kernel boot parameter if you say Y
-  here.
-
-ALI M14xx support
-CONFIG_BLK_DEV_ALI14XX
-  This driver is enabled at runtime using the "ide0=ali14xx" kernel
-  boot parameter.  It enables support for the secondary IDE interface
-  of the ALI M1439/1443/1445/1487/1489 chipsets, and permits faster
-  I/O speeds to be set as well.  See the files
-  <file:Documentation/ide.txt> and <file:drivers/ide/legacy/ali14xx.c> for
-  more info.
-
-DTC-2278 support
-CONFIG_BLK_DEV_DTC2278
-  This driver is enabled at runtime using the "ide0=dtc2278" kernel
-  boot parameter. It enables support for the secondary IDE interface
-  of the DTC-2278 card, and permits faster I/O speeds to be set as
-  well. See the <file:Documentation/ide.txt> and
-  <file:drivers/ide/legacy/dtc2278.c> files for more info.
-
-Holtek HT6560B support
-CONFIG_BLK_DEV_HT6560B
-  This driver is enabled at runtime using the "ide0=ht6560b" kernel
-  boot parameter. It enables support for the secondary IDE interface
-  of the Holtek card, and permits faster I/O speeds to be set as well.
-  See the <file:Documentation/ide.txt> and
-  <file:drivers/ide/legacy/ht6560b.c> files for more info.
-
-PROMISE DC4030 support (EXPERIMENTAL)
-CONFIG_BLK_DEV_PDC4030
-  This driver provides support for the secondary IDE interface and
-  cache of Promise IDE chipsets, e.g. DC4030 and DC5030.  This driver
-  is known to incur timeouts/retries during heavy I/O to drives
-  attached to the secondary interface.  CD-ROM and TAPE devices are
-  not supported yet.  This driver is enabled at runtime using the
-  "ide0=dc4030" kernel boot parameter.  See the
-  <file:Documentation/ide.txt> and <file:drivers/ide/legacy/pdc4030.c> files
-  for more info.
-
-QDI QD65XX support
-CONFIG_BLK_DEV_QD65XX
-  This driver is enabled at runtime using the "ide0=qd65xx" kernel
-  boot parameter.  It permits faster I/O speeds to be set.  See the
-  <file:Documentation/ide.txt> and <file:drivers/ide/legacy/qd65xx.c> for
-  more info.
-
-UMC 8672 support
-CONFIG_BLK_DEV_UMC8672
-  This driver is enabled at runtime using the "ide0=umc8672" kernel
-  boot parameter. It enables support for the secondary IDE interface
-  of the UMC-8672, and permits faster I/O speeds to be set as well.
-  See the files <file:Documentation/ide.txt> and
-  <file:drivers/ide/legacy/umc8672.c> for more info.
-
-Amiga Gayle IDE interface support
-CONFIG_BLK_DEV_GAYLE
-  This is the IDE driver for the builtin IDE interface on some Amiga
-  models. It supports both the `A1200 style' (used in A600 and A1200)
-  and `A4000 style' (used in A4000 and A4000T) of the Gayle IDE
-  interface. Say Y if you have such an Amiga model and want to use IDE
-  devices (hard disks, CD-ROM drives, etc.) that are connected to the
-  builtin IDE interface.
-
-Falcon IDE interface support
-CONFIG_BLK_DEV_FALCON_IDE
-  This is the IDE driver for the builtin IDE interface on the Atari
-  Falcon. Say Y if you have a Falcon and want to use IDE devices (hard
-  disks, CD-ROM drives, etc.) that are connected to the builtin IDE
-  interface.
-
-Amiga Buddha/Catweasel/X-Surf IDE interface support (EXPERIMENTAL)
-CONFIG_BLK_DEV_BUDDHA
-  This is the IDE driver for the IDE interfaces on the Buddha, 
-  Catweasel and X-Surf expansion boards.  It supports up to two interfaces 
-  on the Buddha, three on the Catweasel and two on the X-Surf.
-
-  Say Y if you have a Buddha or Catweasel expansion board and want to
-  use IDE devices (hard disks, CD-ROM drives, etc.) that are connected
-  to one of its IDE interfaces.
-
-Amiga IDE Doubler support (EXPERIMENTAL)
-CONFIG_BLK_DEV_IDEDOUBLER
-  This driver provides support for the so-called `IDE doublers' (made
-  by various manufacturers, e.g. Eyetech) that can be connected to the
-  builtin IDE interface of some Amiga models. Using such an IDE
-  doubler, you can connect up to four instead of two IDE devices on
-  the Amiga's builtin IDE interface.
-
-  Note that the normal Amiga Gayle IDE driver may not work correctly
-  if you have an IDE doubler and don't enable this driver!
-
-  Say Y if you have an IDE doubler.  The driver is enabled at kernel
-  runtime using the "ide=doubler" kernel boot parameter.
-
-WarpEngine SCSI support
-CONFIG_WARPENGINE_SCSI
-  Support for MacroSystem Development's WarpEngine Amiga SCSI-2
-  controller. Info at
-  <http://www.lysator.liu.se/amiga/ar/guide/ar310.guide?FEATURE5>.
-
-Builtin PowerMac IDE support
-CONFIG_BLK_DEV_IDE_PMAC
-  This driver provides support for the built-in IDE controller on
-  most of the recent Apple Power Macintoshes and PowerBooks.
-  If unsure, say Y.
-
-PowerMac IDE DMA support
-CONFIG_BLK_DEV_IDEDMA_PMAC
-  This option allows the driver for the built-in IDE controller on
-  Power Macintoshes and PowerBooks to use DMA (direct memory access)
-  to transfer data to and from memory.  Saying Y is safe and improves
-  performance.
-
-Use DMA by default
-CONFIG_BLK_DEV_IDEDMA_PMAC_AUTO
-  This option allows the driver for the built-in IDE controller on
-  Power Macintoshes and PowerBooks to use DMA automatically, without
-  it having to be explicitly enabled.  This option is provided because
-  of concerns about a couple of cases where using DMA on buggy PC
-  hardware may have caused damage.  Saying Y should be safe on all
-  Apple machines.
-
-Macintosh Quadra/Powerbook IDE interface support
-CONFIG_BLK_DEV_MAC_IDE
-  This is the IDE driver for the builtin IDE interface on some m68k
-  Macintosh models. It supports both the `Quadra style' (used in
-  Quadra/ Centris 630 and Performa 588 models) and `Powerbook style'
-  (used in the Powerbook 150 and 190 models) IDE interface.
-
-  Say Y if you have such an Macintosh model and want to use IDE
-  devices (hard disks, CD-ROM drives, etc.) that are connected to the
-  builtin IDE interface.
-
-ICS IDE interface support
-CONFIG_BLK_DEV_IDE_ICSIDE
-  On Acorn systems, say Y here if you wish to use the ICS IDE
-  interface card.  This is not required for ICS partition support.
-  If you are unsure, say N to this.
-
-ICS DMA support
-CONFIG_BLK_DEV_IDEDMA_ICS
-  Say Y here if you want to add DMA (Direct Memory Access) support to
-  the ICS IDE driver.
-
-Use ICS DMA by default
-CONFIG_IDEDMA_ICS_AUTO
-  Prior to kernel version 2.1.112, Linux used to automatically use
-  DMA for IDE drives and chipsets which support it. Due to concerns
-  about a couple of cases where buggy hardware may have caused damage,
-  the default is now to NOT use DMA automatically. To revert to the
-  previous behaviour, say Y to this question.
-
-  If you suspect your hardware is at all flakey, say N here.
-  Do NOT email the IDE kernel people regarding this issue!
-
-XT hard disk support
-CONFIG_BLK_DEV_XD
-  Very old 8 bit hard disk controllers used in the IBM XT computer
-  will be supported if you say Y here.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>. The module
-  will be called xd.o.
-
-  It's pretty unlikely that you have one of these: say N.
-
-PS/2 ESDI hard disk support
-CONFIG_BLK_DEV_PS2
-  Say Y here if you have a PS/2 machine with a MCA bus and an ESDI
-  hard disk.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called ps2esdi.o.
-
-Mylex DAC960/DAC1100 PCI RAID Controller support
-CONFIG_BLK_DEV_DAC960
-  This driver adds support for the Mylex DAC960, AcceleRAID, and
-  eXtremeRAID PCI RAID controllers.  See the file
-  <file:Documentation/README.DAC960> for further information about
-  this driver.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called DAC960.o.
-
-Parallel port IDE device support
-CONFIG_PARIDE
-  There are many external CD-ROM and disk devices that connect through
-  your computer's parallel port. Most of them are actually IDE devices
-  using a parallel port IDE adapter. This option enables the PARIDE
-  subsystem which contains drivers for many of these external drives.
-  Read <file:Documentation/paride.txt> for more information.
-
-  If you have said Y to the "Parallel-port support" configuration
-  option, you may share a single port between your printer and other
-  parallel port devices. Answer Y to build PARIDE support into your
-  kernel, or M if you would like to build it as a loadable module. If
-  your parallel port support is in a loadable module, you must build
-  PARIDE as a module. If you built PARIDE support into your kernel,
-  you may still build the individual protocol modules and high-level
-  drivers as loadable modules. If you build this support as a module,
-  it will be called paride.o.
-
-  To use the PARIDE support, you must say Y or M here and also to at
-  least one high-level driver (e.g. "Parallel port IDE disks",
-  "Parallel port ATAPI CD-ROMs", "Parallel port ATAPI disks" etc.) and
-  to at least one protocol driver (e.g. "ATEN EH-100 protocol",
-  "MicroSolutions backpack protocol", "DataStor Commuter protocol"
-  etc.).
-
-Parallel port IDE disks
-CONFIG_PARIDE_PD
-  This option enables the high-level driver for IDE-type disk devices
-  connected through a parallel port. If you chose to build PARIDE
-  support into your kernel, you may answer Y here to build in the
-  parallel port IDE driver, otherwise you should answer M to build
-  it as a loadable module. The module will be called pd.o. You
-  must also have at least one parallel port protocol driver in your
-  system. Among the devices supported by this driver are the SyQuest
-  EZ-135, EZ-230 and SparQ drives, the Avatar Shark and the backpack
-  hard drives from MicroSolutions.
-
-Parallel port ATAPI CD-ROMs
-CONFIG_PARIDE_PCD
-  This option enables the high-level driver for ATAPI CD-ROM devices
-  connected through a parallel port. If you chose to build PARIDE
-  support into your kernel, you may answer Y here to build in the
-  parallel port ATAPI CD-ROM driver, otherwise you should answer M to
-  build it as a loadable module. The module will be called pcd.o. You
-  must also have at least one parallel port protocol driver in your
-  system. Among the devices supported by this driver are the
-  MicroSolutions backpack CD-ROM drives and the Freecom Power CD. If
-  you have such a CD-ROM drive, you should also say Y or M to "ISO
-  9660 CD-ROM file system support" below, because that's the file
-  system used on CD-ROMs.
-
-Parallel port ATAPI disks
-CONFIG_PARIDE_PF
-  This option enables the high-level driver for ATAPI disk devices
-  connected through a parallel port. If you chose to build PARIDE
-  support into your kernel, you may answer Y here to build in the
-  parallel port ATAPI disk driver, otherwise you should answer M
-  to build it as a loadable module. The module will be called pf.o.
-  You must also have at least one parallel port protocol driver in
-  your system. Among the devices supported by this driver are the
-  MicroSolutions backpack PD/CD drive and the Imation Superdisk
-  LS-120 drive.
-
-Parallel port ATAPI tapes
-CONFIG_PARIDE_PT
-  This option enables the high-level driver for ATAPI tape devices
-  connected through a parallel port. If you chose to build PARIDE
-  support into your kernel, you may answer Y here to build in the
-  parallel port ATAPI disk driver, otherwise you should answer M
-  to build it as a loadable module. The module will be called pt.o.
-  You must also have at least one parallel port protocol driver in
-  your system. Among the devices supported by this driver is the
-  parallel port version of the HP 5GB drive.
-
-Parallel port generic ATAPI devices
-CONFIG_PARIDE_PG
-  This option enables a special high-level driver for generic ATAPI
-  devices connected through a parallel port. The driver allows user
-  programs, such as cdrtools, to send ATAPI commands directly to a
-  device.
-
-  If you chose to build PARIDE support into your kernel, you may
-  answer Y here to build in the parallel port generic ATAPI driver,
-  otherwise you should answer M to build it as a loadable module. The
-  module will be called pg.o.
-
-  You must also have at least one parallel port protocol driver in
-  your system.
-
-  This driver implements an API loosely related to the generic SCSI
-  driver. See <file:include/linux/pg.h>. for details.
-
-  You can obtain the most recent version of cdrtools from
-  <ftp://ftp.fokus.gmd.de/pub/unix/cdrecord/>. Versions 1.6.1a3 and
-  later fully support this driver.
-
-ATEN EH-100 protocol
-CONFIG_PARIDE_ATEN
-  This option enables support for the ATEN EH-100 parallel port IDE
-  protocol. This protocol is used in some inexpensive low performance
-  parallel port kits made in Hong Kong. If you chose to build PARIDE
-  support into your kernel, you may answer Y here to build in the
-  protocol driver, otherwise you should answer M to build it as a
-  loadable module. The module will be called aten.o. You must also
-  have a high-level driver for the type of device that you want to
-  support.
-
-Micro Solutions BACKPACK Series 5 protocol
-CONFIG_PARIDE_BPCK
-  This option enables support for the Micro Solutions BACKPACK
-  parallel port Series 5 IDE protocol.  (Most BACKPACK drives made
-  before 1999 were Series 5) Series 5 drives will NOT always have the
-  Series noted on the bottom of the drive. Series 6 drivers will.
-
-  In other words, if your BACKPACK drive dosen't say "Series 6" on the
-  bottom, enable this option.
-
-  If you chose to build PARIDE support into your kernel, you may
-  answer Y here to build in the protocol driver, otherwise you should
-  answer M to build it as a loadable module.  The module will be
-  called bpck.o.  You must also have a high-level driver for the type
-  of device that you want to support.
-
-Micro Solutions BACKPACK Series 6 protocol
-CONFIG_PARIDE_BPCK6
-  This option enables support for the Micro Solutions BACKPACK
-  parallel port Series 6 IDE protocol.  (Most BACKPACK drives made
-  after 1999 were Series 6) Series 6 drives will have the Series noted
-  on the bottom of the drive.  Series 5 drivers don't always have it
-  noted.
-
-  In other words, if your BACKPACK drive says "Series 6" on the
-  bottom, enable this option.
-
-  If you chose to build PARIDE support into your kernel, you may
-  answer Y here to build in the protocol driver, otherwise you should
-  answer M to build it as a loadable module.  The module will be
-  called bpck6.o.  You must also have a high-level driver for the type
-  of device that you want to support.
-
-DataStor Commuter protocol
-CONFIG_PARIDE_COMM
-  This option enables support for the Commuter parallel port IDE
-  protocol from DataStor. If you chose to build PARIDE support
-  into your kernel, you may answer Y here to build in the protocol
-  driver, otherwise you should answer M to build it as a loadable
-  module. The module will be called comm.o. You must also have
-  a high-level driver for the type of device that you want to support.
-
-DataStor EP-2000 protocol
-CONFIG_PARIDE_DSTR
-  This option enables support for the EP-2000 parallel port IDE
-  protocol from DataStor. If you chose to build PARIDE support
-  into your kernel, you may answer Y here to build in the protocol
-  driver, otherwise you should answer M to build it as a loadable
-  module. The module will be called dstr.o. You must also have
-  a high-level driver for the type of device that you want to support.
-
-Shuttle EPAT/EPEZ protocol
-CONFIG_PARIDE_EPAT
-  This option enables support for the EPAT parallel port IDE protocol.
-  EPAT is a parallel port IDE adapter manufactured by Shuttle
-  Technology and widely used in devices from major vendors such as
-  Hewlett-Packard, SyQuest, Imation and Avatar. If you chose to build
-  PARIDE support into your kernel, you may answer Y here to build in
-  the protocol driver, otherwise you should answer M to build it as a
-  loadable module. The module will be called epat.o. You must also
-  have a high-level driver for the type of device that you want to
-  support.
-
-Shuttle EPAT c7/c8 extension
-CONFIG_PARIDE_EPATC8
-  This option enables support for the newer Shuttle EP1284 (aka c7 and
-  c8) chip. You need this if you are using any recent Imation SuperDisk
-  (LS-120) drive.
-
-Shuttle EPIA protocol
-CONFIG_PARIDE_EPIA
-  This option enables support for the (obsolete) EPIA parallel port
-  IDE protocol from Shuttle Technology. This adapter can still be
-  found in some no-name kits. If you chose to build PARIDE support
-  into your kernel, you may answer Y here to build in the protocol
-  driver, otherwise you should answer M to build it as a loadable
-  module. The module will be called epia.o. You must also have a
-  high-level driver for the type of device that you want to support.
-
-FIT TD-2000 protocol
-CONFIG_PARIDE_FIT2
-  This option enables support for the TD-2000 parallel port IDE
-  protocol from Fidelity International Technology. This is a simple
-  (low speed) adapter that is used in some portable hard drives. If
-  you chose to build PARIDE support into your kernel, you may answer Y
-  here to build in the protocol driver, otherwise you should answer M
-  to build it as a loadable module. The module will be called fit2.o.
-  You must also have a high-level driver for the type of device that
-  you want to support.
-
-FIT TD-3000 protocol
-CONFIG_PARIDE_FIT3
-  This option enables support for the TD-3000 parallel port IDE
-  protocol from Fidelity International Technology. This protocol is
-  used in newer models of their portable disk, CD-ROM and PD/CD
-  devices. If you chose to build PARIDE support into your kernel, you
-  may answer Y here to build in the protocol driver, otherwise you
-  should answer M to build it as a loadable module. The module will be
-  called fit3.o. You must also have a high-level driver for the type
-  of device that you want to support.
-
-Freecom IQ ASIC-2 protocol
-CONFIG_PARIDE_FRIQ
-  This option enables support for version 2 of the Freecom IQ parallel
-  port IDE adapter.  This adapter is used by the Maxell Superdisk
-  drive.  If you chose to build PARIDE support into your kernel, you
-  may answer Y here to build in the protocol driver, otherwise you
-  should answer M to build it as a loadable module. The module will be
-  called friq.o. You must also have a high-level driver for the type
-  of device that you want to support.
-
-FreeCom power protocol
-CONFIG_PARIDE_FRPW
-  This option enables support for the Freecom power parallel port IDE
-  protocol. If you chose to build PARIDE support into your kernel, you
-  may answer Y here to build in the protocol driver, otherwise you
-  should answer M to build it as a loadable module. The module will be
-  called frpw.o. You must also have a high-level driver for the type
-  of device that you want to support.
-
-KingByte KBIC-951A/971A protocols
-CONFIG_PARIDE_KBIC
-  This option enables support for the KBIC-951A and KBIC-971A parallel
-  port IDE protocols from KingByte Information Corp. KingByte's
-  adapters appear in many no-name portable disk and CD-ROM products,
-  especially in Europe. If you chose to build PARIDE support into your
-  kernel, you may answer Y here to build in the protocol driver,
-  otherwise you should answer M to build it as a loadable module. The
-  module will be called kbic.o. You must also have a high-level driver
-  for the type of device that you want to support.
-
-KT PHd protocol
-CONFIG_PARIDE_KTTI
-  This option enables support for the "PHd" parallel port IDE protocol
-  from KT Technology. This is a simple (low speed) adapter that is
-  used in some 2.5" portable hard drives. If you chose to build PARIDE
-  support into your kernel, you may answer Y here to build in the
-  protocol driver, otherwise you should answer M to build it as a
-  loadable module. The module will be called ktti.o. You must also
-  have a high-level driver for the type of device that you want to
-  support.
-
-OnSpec 90c20 protocol
-CONFIG_PARIDE_ON20
-  This option enables support for the (obsolete) 90c20 parallel port
-  IDE protocol from OnSpec (often marketed under the ValuStore brand
-  name). If you chose to build PARIDE support into your kernel, you
-  may answer Y here to build in the protocol driver, otherwise you
-  should answer M to build it as a loadable module. The module will
-  be called on20.o. You must also have a high-level driver for the
-  type of device that you want to support.
-
-OnSpec 90c26 protocol
-CONFIG_PARIDE_ON26
-  This option enables support for the 90c26 parallel port IDE protocol
-  from OnSpec Electronics (often marketed under the ValuStore brand
-  name). If you chose to build PARIDE support into your kernel, you
-  may answer Y here to build in the protocol driver, otherwise you
-  should answer M to build it as a loadable module. The module will be
-  called on26.o. You must also have a high-level driver for the type
-  of device that you want to support.
-
-Logical Volume Manager (LVM) support
-CONFIG_BLK_DEV_LVM
-  This driver lets you combine several hard disks, hard disk
-  partitions, multiple devices or even loop devices (for evaluation
-  purposes) into a volume group.  Imagine a volume group as a kind of
-  virtual disk. Logical volumes, which can be thought of as virtual
-  partitions, can be created in the volume group.  You can resize
-  volume groups and logical volumes after creation time, corresponding
-  to new capacity needs.  Logical volumes are accessed as block
-  devices named /dev/VolumeGroupName/LogicalVolumeName.
-
-  For details see <file:Documentation/LVM-HOWTO>.  You will need
-  supporting user space software; location is in
-  <file:Documentation/Changes>.
-
-  If you want to compile this support as a module ( = code which can
-  be inserted in and removed from the running kernel whenever you
-  want), say M here and read <file:Documentation/modules.txt>.  The
-  module will be called lvm-mod.o.
-
-Multiple devices driver support (RAID and LVM)
-CONFIG_MD
-  Support multiple physical spindles through a single logical device.
-  Required for RAID and logical volume management (LVM).
-
-Multiple devices driver support
-CONFIG_BLK_DEV_MD
-  This driver lets you combine several hard disk partitions into one
-  logical block device. This can be used to simply append one
-  partition to another one or to combine several redundant hard disks
-  into a RAID1/4/5 device so as to provide protection against hard
-  disk failures. This is called "Software RAID" since the combining of
-  the partitions is done by the kernel. "Hardware RAID" means that the
-  combining is done by a dedicated controller; if you have such a
-  controller, you do not need to say Y here.
-
-  More information about Software RAID on Linux is contained in the
-  Software RAID mini-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>. There you will also learn
-  where to get the supporting user space utilities raidtools.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  md.o
-
-  If unsure, say N.
-
-Linear (append) mode
-CONFIG_MD_LINEAR
-  If you say Y here, then your multiple devices driver will be able to
-  use the so-called linear mode, i.e. it will combine the hard disk
-  partitions by simply appending one to the other.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called linear.o.
-
-  If unsure, say Y.
-
-RAID-0 (striping) mode
-CONFIG_MD_RAID0
-  If you say Y here, then your multiple devices driver will be able to
-  use the so-called raid0 mode, i.e. it will combine the hard disk
-  partitions into one logical device in such a fashion as to fill them
-  up evenly, one chunk here and one chunk there. This will increase
-  the throughput rate if the partitions reside on distinct disks.
-
-  Information about Software RAID on Linux is contained in the
-  Software-RAID mini-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>. There you will also
-  learn where to get the supporting user space utilities raidtools.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called raid0.o.
-
-  If unsure, say Y.
-
-RAID-1 (mirroring) mode
-CONFIG_MD_RAID1
-  A RAID-1 set consists of several disk drives which are exact copies
-  of each other.  In the event of a mirror failure, the RAID driver
-  will continue to use the operational mirrors in the set, providing
-  an error free MD (multiple device) to the higher levels of the
-  kernel.  In a set with N drives, the available space is the capacity
-  of a single drive, and the set protects against a failure of (N - 1)
-  drives.
-
-  Information about Software RAID on Linux is contained in the
-  Software-RAID mini-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.  There you will also
-  learn where to get the supporting user space utilities raidtools.
-
-  If you want to use such a RAID-1 set, say Y. This code is also
-  available as a module called raid1.o ( = code which can be inserted
-  in and removed from the running kernel whenever you want).  If you
-  want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-  If unsure, say Y.
-
-RAID-4/RAID-5 mode
-CONFIG_MD_RAID5
-  A RAID-5 set of N drives with a capacity of C MB per drive provides
-  the capacity of C * (N - 1) MB, and protects against a failure
-  of a single drive. For a given sector (row) number, (N - 1) drives
-  contain data sectors, and one drive contains the parity protection.
-  For a RAID-4 set, the parity blocks are present on a single drive,
-  while a RAID-5 set distributes the parity across the drives in one
-  of the available parity distribution methods.
-
-  Information about Software RAID on Linux is contained in the
-  Software-RAID mini-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>. There you will also
-  learn where to get the supporting user space utilities raidtools.
-
-  If you want to use such a RAID-4/RAID-5 set, say Y. This code is
-  also available as a module called raid5.o ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-  If unsure, say Y.
-
-Multipath I/O support
-CONFIG_MD_MULTIPATH
-  Multipath-IO is the ability of certain devices to address the same
-  physical disk over multiple 'IO paths'. The code ensures that such
-  paths can be defined and handled at runtime, and ensures that a
-  transparent failover to the backup path(s) happens if a IO errors
-  arrives on the primary path.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  multipath.o
-
-  If unsure, say N.
-
-Support for IDE Raid controllers
-CONFIG_BLK_DEV_ATARAID
-  Say Y or M if you have an IDE Raid controller and want linux
-  to use its softwareraid feature.  You must also select an
-  appropriate for your board low-level driver below.
-
-  Note, that Linux does not use the Raid implementation in BIOS, and
-  the main purpose for this feature is to retain compatibility and
-  data integrity with other OS-es, using the same disk array. Linux
-  has its own Raid drivers, which you should use if you need better
-  performance.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  ataraid.o
-
-Support Promise software RAID (Fasttrak(tm))
-CONFIG_BLK_DEV_ATARAID_PDC
-  Say Y or M if you have a Promise Fasttrak (tm) Raid controller
-  and want linux to use the softwareraid feature of this card.
-  This driver uses /dev/ataraid/dXpY (X and Y numbers) as device
-  names.
-
-  If you choose to compile this as a module, the module will be called
-  pdcraid.o.
-
-Highpoint 370 software RAID
-CONFIG_BLK_DEV_ATARAID_HPT
-  Say Y or M if you have a Highpoint HPT 370 Raid controller
-  and want linux to use the softwareraid feature of this card.
-  This driver uses /dev/ataraid/dXpY (X and Y numbers) as device
-  names.
-
-  If you choose to compile this as a module, the module will be called
-  hptraid.o.
-
-Support for Acer PICA 1 chipset
-CONFIG_ACER_PICA_61
-  This is a machine with a R4400 133/150 MHz CPU. To compile a Linux
-  kernel that runs on these, say Y here. For details about Linux on
-  the MIPS architecture, check out the Linux/MIPS FAQ on the WWW at
-  <http://oss.sgi.com/mips/>.
-
-Support for Algorithmics P4032 (EXPERIMENTAL)
-CONFIG_ALGOR_P4032
-  This is an evaluation board of the British company Algorithmics.
-  The board uses the R4300 and a R5230 CPUs.  For more information
-  about this board see <http://www.algor.co.uk/>.
-
-Support for BAGET MIPS series
-CONFIG_BAGET_MIPS
-  This enables support for the Baget, a Russian embedded system.  For
-  more details about the Baget see the Linux/MIPS FAQ on
-  <http://oss.sgi.com/mips/>.
-
-Baget AMD LANCE support
-CONFIG_BAGETLANCE
-  Say Y to enable kernel support for AMD Lance Ethernet cards on the
-  MIPS-32-based Baget embedded system.  This chipset is better known
-  via the NE2100 cards.
-
-Support for DECstations
-CONFIG_DECSTATION
-  This enables support for DEC's MIPS based workstations.  For details
-  see the Linux/MIPS FAQ on <http://oss.sgi.com/mips/> and the
-  DECstation porting pages on <http://decstation.unix-ag.org/>.
-
-  If you have one of the following DECstation Models you definitely
-  want to choose R4xx0 for the CPU Type:
-
-       DECstation 5000/50
-       DECstation 5000/150
-       DECstation 5000/260
-       DECsystem 5900/260
-
-  otherwise choose R3000.
-
-Support for Cobalt Micro Server
-CONFIG_COBALT_MICRO_SERVER
-  Support for MIPS-based Cobalt boxes (they have been bought by Sun
-  and are now the "Server Appliance Business Unit") including the 2700
-  series -- versions 1 of the Qube and Raq.  To compile a Linux kernel
-  for this hardware, say Y here.
-
-Support for Cobalt 2800
-CONFIG_COBALT_28
-  Support for the second generation of MIPS-based Cobalt boxes (they
-  have been bought by Sun and are now the "Server Appliance Business
-  Unit") including the 2800 series -- versions 2 of the Qube and Raq.
-  To compile a Linux kernel for this hardware, say Y here.
-
-Support for the Momentum Computer Ocelot SBC
-CONFIG_MOMENCO_OCELOT
-  The Ocelot is a MIPS-based Single Board Computer (SBC) made by
-  Momentum Computer <http://www.momenco.com/>.
-
-Support for NEC DDB Vrc-5074
-CONFIG_DDB5074
-  This enables support for the VR5000-based NEC DDB Vrc-5074
-  evaluation board.
-
-Support for NEC DDB Vrc-5476
-CONFIG_DDB5476
-  This enables support for the R5432-based NEC DDB Vrc-5476
-  evaluation board.
-
-  Features : kernel debugging, serial terminal, NFS root fs, on-board
-  ether port (Need an additional patch at <http://linux.junsun.net/>),
-  USB, AC97, PCI, PCI VGA card & framebuffer console, IDE controller,
-  PS2 keyboard, PS2 mouse, etc.
-
-Support for NEC DDB Vrc-5477
-CONFIG_DDB5477
-  This enables support for the R5432-based NEC DDB Vrc-5477
-  evaluation board.
-
-  Features : kernel debugging, serial terminal, NFS root fs, on-board
-  ether port (Need an additional patch at <http://linux.junsun.net/>),
-  USB, AC97, PCI, etc.
-
-Support for MIPS Atlas board
-CONFIG_MIPS_ATLAS
-  This enables support for the QED R5231-based MIPS Atlas evaluation
-  board.
-
-Support for MIPS Malta board
-CONFIG_MIPS_MALTA
-  This enables support for the VR5000-based MIPS Malta evaluation
-  board.
-
-Support for Galileo Evaluation board or CoSine Orion
-CONFIG_ORION
-  Say Y if configuring for the Galileo evaluation board
-  or CoSine Orion.  More information is available at
-  <http://tochna.technion.ac.il/project/linux/html/linux.html>.
-
-  Otherwise, say N.
-
-Support for Mips Magnum 4000
-CONFIG_MIPS_MAGNUM_4000
-  This is a machine with a R4000 100 MHz CPU. To compile a Linux
-  kernel that runs on these, say Y here. For details about Linux on
-  the MIPS architecture, check out the Linux/MIPS FAQ on the WWW at
-  <http://oss.sgi.com/mips/>.
-
-Enable Qtronix 990P Keyboard Support
-CONFIG_QTRONIX_KEYBOARD
-  Images of Qtronix keyboards are at
-  <http://www.qtronix.com/keyboard.html>.
-
-Support for Olivetti M700
-CONFIG_OLIVETTI_M700
-  This is a machine with a R4000 100 MHz CPU. To compile a Linux
-  kernel that runs on these, say Y here. For details about Linux on
-  the MIPS architecture, check out the Linux/MIPS FAQ on the WWW at
-  <http://oss.sgi.com/mips/>.
-
-Support for SNI RM200 PCI
-CONFIG_SNI_RM200_PCI
-  The SNI RM200 PCI was a MIPS-based platform manufactured by Siemens
-  Nixdorf Informationssysteme (SNI), parent company of Pyramid
-  Technology and now in turn merged with Fujitsu.  Say Y here to
-  support this machine type.
-
-Support for SGI-IP22 (Indy/Indigo2)
-CONFIG_SGI_IP22
-  This are the SGI Indy, Challenge S and Indigo2, as well as certain
-  OEM variants like the Tandem CMN B006S. To compile a Linux kernel
-  that runs on these, say Y here.
-
-Support for SGI IP27 (Origin200/2000)
-CONFIG_SGI_IP27
-  This are the SGI Origin 200, Origin 2000 and Onyx 2 Graphics
-  workstations.  To compile a Linux kernel that runs on these, say Y
-  here.
-
-IP27 N-Mode
-CONFIG_SGI_SN0_N_MODE
-  The nodes of Origin 200, Origin 2000 and Onyx 2 systems can be
-  configured in either N-Modes which allows for more nodes or M-Mode
-  which allows for more memory.  Your system is most probably
-  running in M-Mode, so you should say N here.
-
-Lasi Ethernet
-CONFIG_LASI_82596
-  Say Y here to support the on-board Intel 82596 ethernet controller
-  built into Hewlett-Packard PA-RISC machines.
-
-MIPS JAZZ onboard SONIC Ethernet support
-CONFIG_MIPS_JAZZ_SONIC
-  This is the driver for the onboard card of MIPS Magnum 4000,
-  Acer PICA, Olivetti M700-10 and a few other identical OEM systems.
-
-MIPS JAZZ FAS216 SCSI support
-CONFIG_JAZZ_ESP
-  This is the driver for the onboard SCSI host adapter of MIPS Magnum
-  4000, Acer PICA, Olivetti M700-10 and a few other identical OEM
-  systems.
-
-MIPS GT96100 support
-CONFIG_MIPS_GT96100
-  Say Y here to support the Galileo Technology GT96100 communications
-  controller card.  There is a web page at <http://www.galileot.com/>.
-
-MIPS GT96100 Ethernet support
-CONFIG_MIPS_GT96100ETH
-  Say Y here to support the Ethernet subsystem on your GT96100 card.
-
-Zalon SCSI support
-CONFIG_SCSI_ZALON
-  The Zalon is an interface chip that sits between the PA-RISC
-  processor and the NCR 53c720 SCSI controller on K-series PA-RISC
-  boards (these are used, among other places, on some HP 780
-  workstations).  Say Y here to make sure it gets initialized
-  correctly before the Linux kernel tries to talk to the controller.
-
-Kernel floating-point instruction emulation
-CONFIG_MIPS_FPU_EMULATOR
-  This option enables the MIPS software floating support.  Due to
-  the way floating point works you should always enable this option
-  unless you exactly know what you're doing.
-
-SGI PROM Console Support
-CONFIG_SGI_PROM_CONSOLE
-  Say Y here to set up the boot console on serial port 0.
-
-DZ11 Serial Support
-CONFIG_DZ
-  DZ11-family serial controllers for VAXstations, including the
-  DC7085, M7814, and M7819.
-
-TURBOchannel support
-CONFIG_TC
-  TurboChannel is a DEC (now Compaq) bus for Alpha and MIPS processors.
-  Documentation on writing device drivers for TurboChannel is available at:
-  <http://www.cs.arizona.edu/computer.help/policy/DIGITAL_unix/AA-PS3HD-TET1_html/TITLE.html>.
-
-# Choice: galileo_clock
-75
-CONFIG_SYSCLK_75
-  Configure the kernel for clock speed of your Galileo board.  
-  The choices are 75MHz, 83.3MHz, and 100MHz.
-
-83.3
-CONFIG_SYSCLK_83
-  Configure the Galileo kernel for a clock speed of 83.3 MHz.
-
-100
-CONFIG_SYSCLK_100
-  Configure the Galileo kernel for a clock speed of 100 MHz.
-
-Z85C30 Serial Support
-CONFIG_ZS
-  Documentation on the Zilog 85C350 serial communications controller
-  is downloadable at <http://www.zilog.com/pdfs/serial/z85c30.pdf>.
-
-PCMCIA SCSI adapter support
-CONFIG_SCSI_PCMCIA
-  Say Y here if you intend to attach a PCMCIA or CardBus card to your
-  computer which acts as a SCSI host adapter. These are credit card
-  size devices often used with laptops.
-
-  Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause the configurator to skip all
-  the questions PCMCIA SCSI host adapters.
-
-Adaptec APA1480 CardBus support
-CONFIG_PCMCIA_APA1480
-  Say Y here if you intend to attach this type of CardBus SCSI host
-  adapter to your computer.
-
-  This driver is also available as a module called apa1480_cb.o ( =
-  code which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-NinjaSCSI-3 / NinjaSCSI-32Bi (16bit) PCMCIA support
-CONFIG_PCMCIA_NINJA_SCSI
-  If you intend to attach this type of PCMCIA SCSI host adapter to
-  your computer, say Y here and read
-  <file:Documentation/README.nsp_cs.eng>.
-
-  This driver is also available as a module called nsp_cs.o ( =
-  code which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Adaptec AHA152X PCMCIA support
-CONFIG_PCMCIA_AHA152X
-  Say Y here if you intend to attach this type of PCMCIA SCSI host
-  adapter to your computer.
-
-  This driver is also available as a module called aha152x_cs.o ( =
-  code which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Qlogic PCMCIA support
-CONFIG_PCMCIA_QLOGIC
-  Say Y here if you intend to attach this type of PCMCIA SCSI host
-  adapter to your computer.
-
-  This driver is also available as a module called qlogic_cs.o ( =
-  code which can be inserted in and removed from the running kernel
-  whenever you want).  If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Future Domain PCMCIA support
-CONFIG_PCMCIA_FDOMAIN
-  Say Y here if you intend to attach this type of PCMCIA SCSI host
-  adapter to your computer.
-
-  This driver is also available as a module called fdomain_cs.o ( =
-  code which can be inserted in and removed from the running kernel
-  whenever you want).  If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-# Choice: mipstype
-CPU type
-CONFIG_CPU_R3000
-  Please make sure to pick the right CPU type. Linux/MIPS is not
-  designed to be generic, i.e. Kernels compiled for R3000 CPUs will
-  *not* work on R4000 machines and vice versa.  However, since most
-  of the supported machines have an R4000 (or similar) CPU, R4x00
-  might be a safe bet.  If the resulting kernel does not work,
-  try to recompile with R3000.
-
-  R3000    MIPS Technologies R3000-series processors,
-           including the 3041, 3051, and 3081.
-
-  R6000    MIPS Technologies R6000-series processors,
-           including the 64474, 64475, 64574 and 64575.
-
-  R4300    MIPS Technologies R4300-series processors.
-
-  R4x00    MIPS Technologies R4000-series processors other than 4300,
-           including the 4640, 4650, and 4700.
-
-  R5000    MIPS Technologies R5000-series processors other than the
-           Nevada.
-
-  R52xx    MIPS Technologies R52xx-series ("Nevada") processors.
-
-  R10000   MIPS Technologies R10000-series processors.
-
-R6000
-CONFIG_CPU_R6000
-  MIPS Technologies R6000-series processors, including the 64474,
-  64475, 64574 and 64575.
-
-R4300
-CONFIG_CPU_R4300
-  MIPS Technologies R4300-series processors.
-
-R4x00
-CONFIG_CPU_R4X00
-  MIPS Technologies R4000-series processors other than 4300, including
-  the 4640, 4650, and 4700.
-
-R5000
-CONFIG_CPU_R5000
-  MIPS Technologies R5000-series processors other than the Nevada.
-
-R52x0
-CONFIG_CPU_NEVADA
-  MIPS Technologies R52x0-series ("Nevada") processors.
-
-R8000
-CONFIG_CPU_R8000
-  MIPS Technologies R8000-series processors.
-
-R10000
-CONFIG_CPU_R10000
-  MIPS Technologies R10000-series processors.
-
-Discontiguous Memory Support
-CONFIG_DISCONTIGMEM
-  Say Y to support efficient handling of discontiguous physical memory,
-  for architectures which are either NUMA (Non-Uniform Memory Access)
-  or have huge holes in the physical address space for other reasons.
-  See <file:Documentation/vm/numa> for more.
-
-Mapped kernel support
-CONFIG_MAPPED_KERNEL
-  Change the way a Linux kernel is loaded unto memory on a MIPS64
-  machine.  This is required in order to support text replication and
-  NUMA.  If you need to understand it, read the source code.
-
-Kernel text replication support
-CONFIG_REPLICATE_KTEXT
-  Say Y here to enable replicating the kernel text across multiple
-  nodes in a NUMA cluster.  This trades memory for speed.
-
-Exception handler replication support
-CONFIG_REPLICATE_EXHANDLERS
-  Say Y here to enable replicating the kernel exception handlers
-  across multiple nodes in a NUMA cluster. This trades memory for
-  speed.
-
-NUMA support?
-CONFIG_NUMA
-  Say Y to compile the kernel to support NUMA (Non-Uniform Memory
-  Access).  This option is for configuring high-end multiprocessor
-  server machines.  If in doubt, say N.
-
-R41xx
-CONFIG_CPU_VR41XX
-  The options selects support for the NEC VR41xx series of processors.
-  Only choose this option if you have one of these processors as a
-  kernel built with this option will not run on any other type of
-  processor or vice versa.
-
-CPU feature configuration
-CONFIG_CPU_ADVANCED
-  Saying yes here allows you to select support for various features
-  your CPU may or may not have.  Most people should say N here.
-
-ll and sc instructions available
-CONFIG_CPU_HAS_LLSC
-  MIPS R4000 series and later provide the Load Linked (ll)
-  and Store Conditional (sc) instructions. More information is
-  available at <http://www.go-ecs.com/mips/miptek1.htm>.
-
-  Say Y here if your CPU has the ll and sc instructions.  Say Y here
-  for better performance, N if you don't know.  You must say Y here
-  for multiprocessor machines.
-
-lld and scd instructions available
-CONFIG_CPU_HAS_LLDSCD
-  Say Y here if your CPU has the lld and scd instructions, the 64-bit
-  equivalents of ll and sc.  Say Y here for better performance, N if
-  you don't know.  You must say Y here for multiprocessor machines.
-
-Writeback Buffer available
-CONFIG_CPU_HAS_WB
-  Say N here for slightly better performance.  You must say Y here for
-  machines which require flushing of write buffers in software.  Saying
-  Y is the safe option; N may result in kernel malfunction and crashes.
-
-Support for large 64-bit configurations
-CONFIG_MIPS_INSANE_LARGE
-  MIPS R10000 does support a 44 bit / 16TB address space as opposed to
-  previous 64-bit processors which only supported 40 bit / 1TB. If you
-  need processes of more than 1TB virtual address space, say Y here.
-  This will result in additional memory usage, so it is not
-  recommended for normal users.
-
-Generate little endian code
-CONFIG_CPU_LITTLE_ENDIAN
-  Some MIPS machines can be configured for either little or big endian
-  byte order. These modes require different kernels. Say Y if your
-  machine is little endian, N if it's a big endian machine.
-
-Use power LED as a heartbeat
-CONFIG_HEARTBEAT
-  Use the power-on LED on your machine as a load meter.  The exact
-  behaviour is platform-dependent, but normally the flash frequency is
-  a hyperbolic function of the 5-minute load average.
-
-Networking support
-CONFIG_NET
-  Unless you really know what you are doing, you should say Y here.
-  The reason is that some programs need kernel networking support even
-  when running on a stand-alone machine that isn't connected to any
-  other computer. If you are upgrading from an older kernel, you
-  should consider updating your networking tools too because changes
-  in the kernel and the tools often go hand in hand. The tools are
-  contained in the package net-tools, the location and version number
-  of which are given in <file:Documentation/Changes>.
-
-  For a general introduction to Linux networking, it is highly
-  recommended to read the NET-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-Socket filtering
-CONFIG_FILTER
-  The Linux Socket Filter is derived from the Berkeley Packet Filter.
-  If you say Y here, user-space programs can attach a filter to any
-  socket and thereby tell the kernel that it should allow or disallow
-  certain types of data to get through the socket.  Linux Socket
-  Filtering works on all socket types except TCP for now.  See the
-  text file <file:Documentation/networking/filter.txt> for more
-  information.
-
-  You need to say Y here if you want to use PPP packet filtering
-  (see the CONFIG_PPP_FILTER option below).
-
-  If unsure, say N.
-
-Network packet filtering (replaces ipchains)
-CONFIG_NETFILTER
-  Netfilter is a framework for filtering and mangling network packets
-  that pass through your Linux box.
-
-  The most common use of packet filtering is to run your Linux box as
-  a firewall protecting a local network from the Internet. The type of
-  firewall provided by this kernel support is called a "packet
-  filter", which means that it can reject individual network packets
-  based on type, source, destination etc. The other kind of firewall,
-  a "proxy-based" one, is more secure but more intrusive and more
-  bothersome to set up; it inspects the network traffic much more
-  closely, modifies it and has knowledge about the higher level
-  protocols, which a packet filter lacks. Moreover, proxy-based
-  firewalls often require changes to the programs running on the local
-  clients. Proxy-based firewalls don't need support by the kernel, but
-  they are often combined with a packet filter, which only works if
-  you say Y here.
-
-  You should also say Y here if you intend to use your Linux box as
-  the gateway to the Internet for a local network of machines without
-  globally valid IP addresses. This is called "masquerading": if one
-  of the computers on your local network wants to send something to
-  the outside, your box can "masquerade" as that computer, i.e. it
-  forwards the traffic to the intended outside destination, but
-  modifies the packets to make it look like they came from the
-  firewall box itself. It works both ways: if the outside host
-  replies, the Linux box will silently forward the traffic to the
-  correct local computer. This way, the computers on your local net
-  are completely invisible to the outside world, even though they can
-  reach the outside and can receive replies. It is even possible to
-  run globally visible servers from within a masqueraded local network
-  using a mechanism called portforwarding. Masquerading is also often
-  called NAT (Network Address Translation).
-
-  Another use of Netfilter is in transparent proxying: if a machine on
-  the local network tries to connect to an outside host, your Linux
-  box can transparently forward the traffic to a local server,
-  typically a caching proxy server.
-
-  Various modules exist for netfilter which replace the previous
-  masquerading (ipmasqadm), packet filtering (ipchains), transparent
-  proxying, and portforwarding mechanisms. Please see
-  <file:Documentation/Changes> under "iptables" for the location of
-  these packages.
-
-  Make sure to say N to "Fast switching" below if you intend to say Y
-  here, as Fast switching currently bypasses netfilter.
-
-  Chances are that you should say Y here if you compile a kernel which
-  will run as a router and N for regular hosts. If unsure, say N.
-
-Network packet filtering debugging
-CONFIG_NETFILTER_DEBUG
-  You can say Y here if you want to get additional messages useful in
-  debugging the netfilter code.
-
-Connection tracking (required for masq/NAT)
-CONFIG_IP_NF_CONNTRACK
-  Connection tracking keeps a record of what packets have passed
-  through your machine, in order to figure out how they are related
-  into connections.
-
-  This is required to do Masquerading or other kinds of Network
-  Address Translation (except for Fast NAT).  It can also be used to
-  enhance packet filtering (see `Connection state match support'
-  below).
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-Amanda protocol support
-CONFIG_IP_NF_AMANDA
-  If you are running the Amanda backup package (http://www.amanda.org/)
-  on this machine or machines that will be MASQUERADED through this
-  machine, then you may want to enable this feature.  This allows the
-  connection tracking and natting code to allow the sub-channels that
-  Amanda requires for communication of the backup data, messages and
-  index.
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-
-IRC Send/Chat protocol support
-CONFIG_IP_NF_IRC
-  There is a commonly-used extension to IRC called
-  Direct Client-to-Client Protocol (DCC).  This enables users to send
-  files to each other, and also chat to each other without the need
-  of a server.  DCC Sending is used anywhere you send files over IRC,
-  and DCC Chat is most commonly used by Eggdrop bots.  If you are
-  using NAT, this extension will enable you to send files and initiate
-  chats.  Note that you do NOT need this extension to get files or
-  have others initiate chats, or everything else in IRC.
-
-  If you want to compile it as a module, say 'M' here and read
-  Documentation/modules.txt.  If unsure, say 'N'.
-
-TFTP protocol support
-CONFIG_IP_NF_TFTP
-  TFTP connection tracking helper, this is required depending
-  on how restrictive your ruleset is.
-  If you are using a tftp client behind -j SNAT or -j MASQUERADING
-  you will need this.
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `Y'.
-
-FTP protocol support
-CONFIG_IP_NF_FTP
-  Tracking FTP connections is problematic: special helpers are
-  required for tracking them, and doing masquerading and other forms
-  of Network Address Translation on them.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `Y'.
-
-User space queueing via NETLINK
-CONFIG_IP_NF_QUEUE
-  Netfilter has the ability to queue packets to user space: the
-  netlink device can be used to access them using this driver.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-IP tables support (required for filtering/masq/NAT)
-CONFIG_IP_NF_IPTABLES
-  iptables is a general, extensible packet identification framework.
-  The packet filtering and full NAT (masquerading, port forwarding,
-  etc) subsystems now use this: say `Y' or `M' here if you want to use
-  either of those.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-limit match support
-CONFIG_IP_NF_MATCH_LIMIT
-  limit matching allows you to control the rate at which a rule can be
-  matched: mainly useful in combination with the LOG target ("LOG
-  target support", below) and to avoid some Denial of Service attacks.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-skb->pkt_type packet match support
-CONFIG_IP_NF_MATCH_PKTTYPE
-  This patch allows you to match packet in accrodance
-  to its "class", eg. BROADCAST, MULTICAST, ...
-  
-  Typical usage:
-  iptables -A INPUT -m pkttype --pkt-type broadcast -j LOG
-  
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-MAC address match support
-CONFIG_IP_NF_MATCH_MAC
-  MAC matching allows you to match packets based on the source
-  Ethernet address of the packet.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-Netfilter MARK match support
-CONFIG_IP_NF_MATCH_MARK
-  Netfilter mark matching allows you to match packets based on the
-  `nfmark' value in the packet.  This can be set by the MARK target
-  (see below).
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-Multiple port match support
-CONFIG_IP_NF_MATCH_MULTIPORT
-  Multiport matching allows you to match TCP or UDP packets based on
-  a series of source or destination ports: normally a rule can only
-  match a single range of ports.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-TTL match support
-CONFIG_IP_NF_MATCH_TTL
-  This adds CONFIG_IP_NF_MATCH_TTL option, which enabled the user
-  to match packets by their TTL value.
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-LENGTH match support
-CONFIG_IP_NF_MATCH_LENGTH
-  This option allows you to match the length of a packet against a
-  specific value or range of values.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-AH/ESP match support
-CONFIG_IP_NF_MATCH_AH_ESP
-  These two match extensions (`ah' and `esp') allow you to match a
-  range of SPIs inside AH or ESP headers of IPSec packets.
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-DSCP match support
-CONFIG_IP_NF_MATCH_DSCP
-  This option adds a `DSCP' match, which allows you to match against
-  the IPv4 header DSCP field (DSCP codepoint).
-
-  The DSCP codepoint can have any value between 0x0 and 0x4f.
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-
-ECN match support
-CONFIG_IP_NF_MATCH_ECN
-  This option adds a `ECN' match, which allows you to match against
-  the IPv4 and TCP header ECN fields.
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-
-TOS match support
-CONFIG_IP_NF_MATCH_TOS
-  TOS matching allows you to match packets based on the Type Of
-  Service fields of the IP packet.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-conntrack match support
-CONFIG_IP_NF_MATCH_CONNTRACK
-  This is a general conntrack match module, a superset of the state match.
-
-  It allows matching on additional conntrack information, which is
-  useful in complex configurations, such as NAT gateways with multiple
-  internet links or tunnels.
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-
-Connection state match support
-CONFIG_IP_NF_MATCH_STATE
-  Connection state matching allows you to match packets based on their
-  relationship to a tracked connection (ie. previous packets).  This
-  is a powerful tool for packet classification.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-Unclean match support
-CONFIG_IP_NF_MATCH_UNCLEAN
-  Unclean packet matching matches any strange or invalid packets, by
-  looking at a series of fields in the IP, TCP, UDP and ICMP headers.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-Owner match support
-CONFIG_IP_NF_MATCH_OWNER
-  Packet owner matching allows you to match locally-generated packets
-  based on who created them: the user, group, process or session.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-Packet filtering
-CONFIG_IP_NF_FILTER
-  Packet filtering defines a table `filter', which has a series of
-  rules for simple packet filtering at local input, forwarding and
-  local output.  See the man page for iptables(8).
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-REJECT target support
-CONFIG_IP_NF_TARGET_REJECT
-  The REJECT target allows a filtering rule to specify that an ICMP
-  error should be issued in response to an incoming packet, rather
-  than silently being dropped.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-MIRROR target support
-CONFIG_IP_NF_TARGET_MIRROR
-  The MIRROR target allows a filtering rule to specify that an
-  incoming packet should be bounced back to the sender.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-Local NAT support
-CONFIG_IP_NF_NAT_LOCAL
-  This option enables support for NAT of locally originated connections. 
-  Enable this if you need to use destination NAT on connections
-  originating from local processes on the nat box itself.
-
-  Please note that you will need a recent version (>= 1.2.6a)
-  of the iptables userspace program in order to use this feature.
-  See <http://www.iptables.org/> for download instructions.
-
-  If unsure, say 'N'.
-
-
-Full NAT (Network Address Translation)
-CONFIG_IP_NF_NAT
-  The Full NAT option allows masquerading, port forwarding and other
-  forms of full Network Address Port Translation.  It is controlled by
-  the `nat' table in iptables: see the man page for iptables(8).
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-MASQUERADE target support
-CONFIG_IP_NF_TARGET_MASQUERADE
-  Masquerading is a special case of NAT: all outgoing connections are
-  changed to seem to come from a particular interface's address, and
-  if the interface goes down, those connections are lost.  This is
-  only useful for dialup accounts with dynamic IP address (ie. your IP
-  address will be different on next dialup).
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-Basic SNMP-ALG support
-CONFIG_IP_NF_NAT_SNMP_BASIC
-
-  This module implements an Application Layer Gateway (ALG) for
-  SNMP payloads.  In conjunction with NAT, it allows a network
-  management system to access multiple private networks with
-  conflicting addresses.  It works by modifying IP addresses
-  inside SNMP payloads to match IP-layer NAT mapping.
-
-  This is the "basic" form of SNMP-ALG, as described in RFC 2962
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-REDIRECT target support
-CONFIG_IP_NF_TARGET_REDIRECT
-  REDIRECT is a special case of NAT: all incoming connections are
-  mapped onto the incoming interface's address, causing the packets to
-  come to the local machine instead of passing through.  This is
-  useful for transparent proxies.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-Packet mangling
-CONFIG_IP_NF_MANGLE
-  This option adds a `mangle' table to iptables: see the man page for
-  iptables(8).  This table is used for various packet alterations
-  which can effect how the packet is routed.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-DSCP target support
-CONFIG_IP_NF_TARGET_DSCP
-  This option adds a `DSCP' target, which allows you to create rules in
-  the iptables mangle table. The selected packet has the DSCP field set
-  to the hex value provided on the command line; unlike the TOS target
-  which will only set the legal values within ip.h.
-
-  The DSCP field can be set to any value between 0x0 and 0x4f. It does
-  take into account that bits 6 and 7 are used by ECN.
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-
-ECN target support
-CONFIG_IP_NF_TARGET_ECN
-  This option adds a `ECN' target, which can be used in the iptables mangle
-  table.  
-
-  You can use this target to remove the ECN bits from the IPv4 header of
-  an IP packet.  This is particularly useful, if you need to work around
-  existing ECN blackholes on the internet, but don't want to disable
-  ECN support in general.
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-
-TOS target support
-CONFIG_IP_NF_TARGET_TOS
-  This option adds a `TOS' target, which allows you to create rules in
-  the `mangle' table which alter the Type Of Service field of an IP
-  packet prior to routing.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-MARK target support
-CONFIG_IP_NF_TARGET_MARK
-  This option adds a `MARK' target, which allows you to create rules
-  in the `mangle' table which alter the netfilter mark (nfmark) field
-  associated with the packet prior to routing. This can change
-  the routing method (see `Use netfilter MARK value as routing
-  key') and can also be used by other subsystems to change their
-  behaviour.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-TCPMSS target support
-CONFIG_IP_NF_TARGET_TCPMSS
-  This option adds a `TCPMSS' target, which allows you to alter the
-  MSS value of TCP SYN packets, to control the maximum size for that
-  connection (usually limiting it to your outgoing interface's MTU
-  minus 40).
-
-  This is used to overcome criminally braindead ISPs or servers which
-  block ICMP Fragmentation Needed packets.  The symptoms of this
-  problem are that everything works fine from your Linux
-  firewall/router, but machines behind it can never exchange large
-  packets:
-       1) Web browsers connect, then hang with no data received.
-       2) Small mail works fine, but large emails hang.
-       3) ssh works fine, but scp hangs after initial handshaking.
-
-  Workaround: activate this option and add a rule to your firewall
-  configuration like:
-
-        iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
-                -j TCPMSS --clamp-mss-to-pmtu
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-Helper match support
-CONFIG_IP_NF_MATCH_HELPER
-  Helper matching allows you to match packets in dynamic connections
-  tracked by a conntrack-helper, ie. ip_conntrack_ftp
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `Y'.
-
-TCPMSS match support
-CONFIG_IP_NF_MATCH_TCPMSS
-  This option adds a `tcpmss' match, which allows you to examine the
-  MSS value of TCP SYN packets, which control the maximum packet size
-  for that connection.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-ULOG target support
-CONFIG_IP_NF_TARGET_ULOG
-  This option adds a `ULOG' target, which allows you to create rules in
-  any iptables table. The packet is passed to a userspace logging
-  daemon using netlink multicast sockets; unlike the LOG target
-  which can only be viewed through syslog.
-
-  The appropriate userspace logging daemon (ulogd) may be obtained from
-  <http://www.gnumonks.org/projects/ulogd>
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-LOG target support
-CONFIG_IP_NF_TARGET_LOG
-  This option adds a `LOG' target, which allows you to create rules in
-  any iptables table which records the packet header to the syslog.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-ipchains (2.2-style) support
-CONFIG_IP_NF_COMPAT_IPCHAINS
-  This option places ipchains (with masquerading and redirection
-  support) back into the kernel, using the new netfilter
-  infrastructure.  It is not recommended for new installations (see
-  `Packet filtering').  With this enabled, you should be able to use
-  the ipchains tool exactly as in 2.2 kernels.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-ipfwadm (2.0-style) support
-CONFIG_IP_NF_COMPAT_IPFWADM
-  This option places ipfwadm (with masquerading and redirection
-  support) back into the kernel, using the new netfilter
-  infrastructure.  It is not recommended for new installations (see
-  `Packet filtering').  With this enabled, you should be able to use
-  the ipfwadm tool exactly as in 2.0 kernels.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-EUI64 address check (EXPERIMENTAL)
-CONFIG_IP6_NF_MATCH_EUI64
-  This module performs checking on the IPv6 source address
-  Compares the last 64 bits with the EUI64 (delivered
-  from the MAC address) address
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-MAC address match support
-CONFIG_IP6_NF_MATCH_MAC
-  mac matching allows you to match packets based on the source
-  Ethernet address of the packet.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-length match support
-CONFIG_IP6_NF_MATCH_LENGTH
-  This option allows you to match the length of a packet against a
-  specific value or range of values.
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt.  If unsure, say `N'.
-
-Netfilter MARK match support
-CONFIG_IP6_NF_MATCH_MARK
-  Netfilter mark matching allows you to match packets based on the
-  `nfmark' value in the packet.  This can be set by the MARK target
-  (see below).
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-Multiple port match support
-CONFIG_IP6_NF_MATCH_MULTIPORT
-  Multiport matching allows you to match TCP or UDP packets based on
-  a series of source or destination ports: normally a rule can only
-  match a single range of ports.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-IPV6 queue handler (EXPERIMENTAL)
-CONFIG_IP6_NF_QUEUE
-
-  This option adds a queue handler to the kernel for IPv6
-  packets which lets us to receive the filtered packets
-  with QUEUE target using libiptc as we can do with
-  the IPv4 now.
-
-  (C) Fernando Anton 2001
-  IPv64 Project - Work based in IPv64 draft by Arturo Azcorra.
-  Universidad Carlos III de Madrid
-  Universidad Politecnica de Alcala de Henares
-  email: fanton@it.uc3m.es
-
-  If you want to compile it as a module, say M here and read
-  Documentation/modules.txt. If unsure, say `N'.
-
-Owner match support
-CONFIG_IP6_NF_MATCH_OWNER
-  Packet owner matching allows you to match locally-generated packets
-  based on who created them: the user, group, process or session.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-Packet filtering
-CONFIG_IP6_NF_FILTER
-  Packet filtering defines a table `filter', which has a series of
-  rules for simple packet filtering at local input, forwarding and
-  local output.  See the man page for iptables(8).
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-Packet mangling
-CONFIG_IP6_NF_MANGLE
-  This option adds a `mangle' table to iptables: see the man page for
-  iptables(8).  This table is used for various packet alterations
-  which can effect how the packet is routed.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-MARK target support
-CONFIG_IP6_NF_TARGET_MARK
-  This option adds a `MARK' target, which allows you to create rules
-  in the `mangle' table which alter the netfilter mark (nfmark) field
-  associated with the packet packet prior to routing. This can change
-  the routing method (see `Use netfilter MARK value as routing
-  key') and can also be used by other subsystems to change their
-  behaviour.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-TCP Explicit Congestion Notification support
-CONFIG_INET_ECN
-  Explicit Congestion Notification (ECN) allows routers to notify
-  clients about network congestion, resulting in fewer dropped packets
-  and increased network performance.  This option adds ECN support to
-  the Linux kernel, as well as a sysctl (/proc/sys/net/ipv4/tcp_ecn)
-  which allows ECN support to be disabled at runtime.
-
-  Note that, on the Internet, there are many broken firewalls which
-  refuse connections from ECN-enabled machines, and it may be a while
-  before these firewalls are fixed.  Until then, to access a site
-  behind such a firewall (some of which are major sites, at the time
-  of this writing) you will have to disable this option, either by
-  saying N now or by using the sysctl.
-
-  If in doubt, say N.
-
-IPv6 tables support (required for filtering/masq/NAT)
-CONFIG_IP6_NF_IPTABLES
-  ip6tables is a general, extensible packet identification framework.
-  Currently only the packet filtering and packet mangling subsystem
-  for IPv6 use this, but connection tracking is going to follow.
-  Say 'Y' or 'M' here if you want to use either of those.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-IPv6 limit match support
-CONFIG_IP6_NF_MATCH_LIMIT
-  limit matching allows you to control the rate at which a rule can be
-  matched: mainly useful in combination with the LOG target ("LOG
-  target support", below) and to avoid some Denial of Service attacks.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-LOG target support
-CONFIG_IP6_NF_TARGET_LOG
-  This option adds a `LOG' target, which allows you to create rules in
-  any iptables table which records the packet header to the syslog.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  If unsure, say `N'.
-
-SYN flood protection
-CONFIG_SYN_COOKIES
-  Normal TCP/IP networking is open to an attack known as "SYN
-  flooding". This denial-of-service attack prevents legitimate remote
-  users from being able to connect to your computer during an ongoing
-  attack and requires very little work from the attacker, who can
-  operate from anywhere on the Internet.
-
-  SYN cookies provide protection against this type of attack. If you
-  say Y here, the TCP/IP stack will use a cryptographic challenge
-  protocol known as "SYN cookies" to enable legitimate users to
-  continue to connect, even when your machine is under attack. There
-  is no need for the legitimate users to change their TCP/IP software;
-  SYN cookies work transparently to them. For technical information
-  about SYN cookies, check out <http://cr.yp.to/syncookies.html>.
-
-  If you are SYN flooded, the source address reported by the kernel is
-  likely to have been forged by the attacker; it is only reported as
-  an aid in tracing the packets to their actual source and should not
-  be taken as absolute truth.
-
-  SYN cookies may prevent correct error reporting on clients when the
-  server is really overloaded. If this happens frequently better turn
-  them off.
-
-  If you say Y here, note that SYN cookies aren't enabled by default;
-  you can enable them by saying Y to "/proc file system support" and
-  "Sysctl support" below and executing the command
-
-    echo 1 >/proc/sys/net/ipv4/tcp_syncookies
-
-  at boot time after the /proc file system has been mounted.
-
-  If unsure, say N.
-
-# Choice: alphatype
-Alpha system type
-CONFIG_ALPHA_GENERIC
-  This is the system type of your hardware.  A "generic" kernel will
-  run on any supported Alpha system. However, if you configure a
-  kernel for your specific system, it will be faster and smaller.
-
-  To find out what type of Alpha system you have, you may want to
-  check out the Linux/Alpha FAQ, accessible on the WWW from
-  <http://www.alphalinux.org/>. In summary:
-
-  Alcor/Alpha-XLT     AS 600
-  Alpha-XL            XL-233, XL-266
-  AlphaBook1          Alpha laptop
-  Avanti              AS 200, AS 205, AS 250, AS 255, AS 300, AS 400
-  Cabriolet           AlphaPC64, AlphaPCI64
-  DP264               DP264
-  EB164               EB164 21164 evaluation board
-  EB64+               EB64+ 21064 evaluation board
-  EB66                EB66 21066 evaluation board
-  EB66+               EB66+ 21066 evaluation board
-  Jensen              DECpc 150, DEC 2000 model 300,
-                      DEC 2000 model 500
-  LX164               AlphaPC164-LX
-  Miata               Personal Workstation 433a, 433au, 500a,
-                      500au, 600a, or 600au
-  Mikasa              AS 1000
-  Noname              AXPpci33, UDB (Multia)
-  Noritake            AS 1000A, AS 600A, AS 800
-  PC164               AlphaPC164
-  Rawhide             AS 1200, AS 4000, AS 4100
-  Ruffian             RPX164-2, AlphaPC164-UX, AlphaPC164-BX
-  SX164               AlphaPC164-SX
-  Sable               AS 2000, AS 2100
-  Shark                      DS 20L
-  Takara              Takara
-  Titan               Privateer
-  Wildfire            AlphaServer GS 40/80/160/320
-
-  If you don't know what to do, choose "generic".
-
-# Most of the information on these variants is from
-# <http://www.alphalinux.org/docs/alpha-howto.html>
-Alcor/Alpha-XLT
-CONFIG_ALPHA_ALCOR
-  For systems using the Digital ALCOR chipset: 5 chips (4, 64-bit data
-  slices (Data Switch, DSW) - 208-pin PQFP and 1 control (Control, I/O
-  Address, CIA) - a 383 pin plastic PGA).  It provides a DRAM
-  controller (256-bit memory bus) and a PCI interface.  It also does
-  all the work required to support an external Bcache and to maintain
-  memory coherence when a PCI device DMAs into (or out of) memory.
-
-Alpha-XL
-CONFIG_ALPHA_XL
-  XL-233 and XL-266-based Alpha systems.
-
-AlphaBook1
-CONFIG_ALPHA_BOOK1
-  Dec AlphaBook1/Burns Alpha-based laptops.
-
-Avanti
-CONFIG_ALPHA_AVANTI
-  Avanti AS 200, AS 205, AS 250, AS 255, AS 300, and AS 400-based
-  Alphas. Info at
-  <http://www.unix-ag.org/Linux-Alpha/Architectures/Avanti.html>.
-
-Cabriolet
-CONFIG_ALPHA_CABRIOLET
-  Cabriolet AlphaPC64, AlphaPCI64 systems.  Derived from EB64+ but now
-  baby-AT with Flash boot ROM, no on-board SCSI or Ethernet. 3 ISA
-  slots, 4 PCI slots (one pair are on a shared slot), uses plug-in
-  Bcache SIMMs.  Requires power supply with 3.3V output.
-
-DP264
-CONFIG_ALPHA_DP264
-  Various 21264 systems with the tsunami core logic chipset.
-  API Networks: 264DP, UP2000(+), CS20;
-  Compaq: DS10(E,L), XP900, XP1000, DS20(E), ES40.
-
-EB164
-CONFIG_ALPHA_EB164
-  EB164 21164 evaluation board from DEC.  Uses 21164 and ALCOR.  Has
-  ISA and PCI expansion (3 ISA slots, 2 64-bit PCI slots (one is
-  shared with an ISA slot) and 2 32-bit PCI slots.  Uses plus-in
-  Bcache SIMMs. I/O sub-system provides SuperI/O (2S, 1P, FD), KBD,
-  MOUSE (PS2 style), RTC/NVRAM.  Boot ROM is Flash.  PC-AT-sized
-  motherboard.  Requires power supply with 3.3V output.
-
-EB64+
-CONFIG_ALPHA_EB64P
-  Uses 21064 or 21064A and APECs.  Has ISA and PCI expansion (3 ISA,
-  2 PCI, one pair are on a shared slot). Supports 36-bit DRAM SIMs.
-  ISA bus generated by Intel SaturnI/O PCI-ISA bridge. On-board SCSI
-  (NCR 810 on PCI) Ethernet (Digital 21040), KBD, MOUSE (PS2 style),
-  SuperI/O (2S, 1P, FD), RTC/NVRAM. Boot ROM is EPROM.  PC-AT size.
-  Runs from standard PC power supply.
-
-EB66
-CONFIG_ALPHA_EB66
-  A Digital DS group board.  Uses 21066 or 21066A.  I/O sub-system is
-  identical to EB64+.  Baby PC-AT size.  Runs from standard PC power
-  supply.  The EB66 schematic was published as a marketing poster
-  advertising the 21066 as "the first microprocessor in the world with
-  embedded PCI".
-
-EB66+
-CONFIG_ALPHA_EB66P
-  Later variant of the EB66 board.
-
-Eiger
-CONFIG_ALPHA_EIGER
-  Apparently an obscure OEM single-board computer based on the
-  Typhoon/Tsunami chipset family. Information on it is scanty.
-
-Jensen
-CONFIG_ALPHA_JENSEN
-  DEC PC 150 AXP (aka Jensen): This is a very old Digital system - one
-  of the first-generation Alpha systems. A number of these systems
-  seem to be available on the second- hand market. The Jensen is a
-  floor-standing tower system which originally used a 150MHz 21064 It
-  used programmable logic to interface a 486 EISA I/O bridge to the
-  CPU.
-
-LX164
-CONFIG_ALPHA_LX164
-  A technical overview of this board is available at
-  <http://www.unix-ag.org/Linux-Alpha/Architectures/LX164.html>.
-
-Miata
-CONFIG_ALPHA_MIATA
-  The Digital PersonalWorkStation (PWS 433a, 433au, 500a, 500au, 600a,
-  or 600au).  There is an Installation HOWTO for this hardware at
-  <http://members.brabant.chello.nl/~s.vandereijk/miata.html>.
-
-Mikasa
-CONFIG_ALPHA_MIKASA
-  AlphaServer 1000-based Alpha systems.
-
-Nautilus
-CONFIG_ALPHA_NAUTILUS
-  Alpha systems based on the AMD 751 & ALI 1543C chipsets.
-
-Noname
-CONFIG_ALPHA_NONAME
-  The AXPpci33 (aka NoName), is based on the EB66 (includes the Multia
-  UDB).  This design was produced by Digital's Technical OEM (TOEM)
-  group. It uses the 21066 processor running at 166MHz or 233MHz. It
-  is a baby-AT size, and runs from a standard PC power supply. It has
-  5 ISA slots and 3 PCI slots (one pair are a shared slot). There are
-  2 versions, with either PS/2 or large DIN connectors for the
-  keyboard.
-
-Noritake
-CONFIG_ALPHA_NORITAKE
-  AlphaServer 1000A, AlphaServer 600A, and AlphaServer 800-based
-  systems.
-
-Rawhide
-CONFIG_ALPHA_RAWHIDE
-  AlphaServer 1200, AlphaServer 4000 and AlphaServer 4100 machines.
-  See HOWTO at
-  <http://www.alphalinux.org/docs/rawhide/4100_install.shtml>.
-
-Ruffian
-CONFIG_ALPHA_RUFFIAN
-  Samsung APC164UX.  There is a page on known problems and workarounds
-  at <http://www.alphalinux.org/faq/FAQ-11.html>.
-
-Sable
-CONFIG_ALPHA_SABLE
-  Digital AlphaServer 2000 and 2100-based systems.
-
-Takara
-CONFIG_ALPHA_TAKARA
-  Alpha 11164-based OEM single-board computer.
-
-Wildfire
-CONFIG_ALPHA_WILDFIRE
-  AlphaServer GS 40/80/160/320 SMP based on the EV67 core.
-
-EV5 CPU daughtercard (model 5/xxx)
-CONFIG_ALPHA_PRIMO
-  Say Y if you have an AS 1000 5/xxx or an AS 1000A 5/xxx.
-
-EV5 CPU(s) (model 5/xxx)
-CONFIG_ALPHA_GAMMA
-  Say Y if you have an AS 2000 5/xxx or an AS 2100 5/xxx.
-
-EV67 (or later) CPU (speed > 600MHz)?
-CONFIG_ALPHA_EV67
-  Is this a machine based on the EV67 core?  If in doubt, select N here
-  and the machine will be treated as an EV6.
-
-Use SRM as bootloader
-CONFIG_ALPHA_SRM
-  There are two different types of booting firmware on Alphas: SRM,
-  which is command line driven, and ARC, which uses menus and arrow
-  keys. Details about the Linux/Alpha booting process are contained in
-  the Linux/Alpha FAQ, accessible on the WWW from
-  <http://www.alphalinux.org/>.
-
-  The usual way to load Linux on an Alpha machine is to use MILO
-  (a bootloader that lets you pass command line parameters to the
-  kernel just like lilo does for the x86 architecture) which can be
-  loaded either from ARC or can be installed directly as a permanent
-  firmware replacement from floppy (which requires changing a certain
-  jumper on the motherboard). If you want to do either of these, say N
-  here. If MILO doesn't work on your system (true for Jensen
-  motherboards), you can bypass it altogether and boot Linux directly
-  from an SRM console; say Y here in order to do that. Note that you
-  won't be able to boot from an IDE disk using SRM.
-
-  If unsure, say N.
-
-Legacy kernel start address
-CONFIG_ALPHA_LEGACY_START_ADDRESS
-  The 2.4 kernel changed the kernel start address from 0x310000
-  to 0x810000 to make room for the Wildfire's larger SRM console.
-
-  If you're using aboot 0.7 or later, the bootloader will examine the
-  ELF headers to determine where to transfer control. Unfortunately,
-  most older bootloaders -- APB or MILO -- hardcoded the kernel start
-  address rather than examining the ELF headers, and the result is a
-  hard lockup.
-
-  Say Y if you have a broken bootloader.  Say N if you do not, or if
-  you wish to run on Wildfire.
-
-Large VMALLOC support
-CONFIG_ALPHA_LARGE_VMALLOC
-  Process creation and other aspects of virtual memory management can
-  be streamlined if we restrict the kernel to one PGD for all vmalloc
-  allocations.  This equates to about 8GB.
-
-  Under normal circumstances, this is so far and above what is needed
-  as to be laughable.  However, there are certain applications (such
-  as benchmark-grade in-kernel web serving) that can make use of as
-  much vmalloc space as is available.
-
-  Say N unless you know you need gobs and gobs of vmalloc space.
-
-Non-standard serial port support
-CONFIG_SERIAL_NONSTANDARD
-  Say Y here if you have any non-standard serial boards -- boards
-  which aren't supported using the standard "dumb" serial driver.
-  This includes intelligent serial boards such as Cyclades,
-  Digiboards, etc. These are usually used for systems that need many
-  serial ports because they serve many terminals or dial-in
-  connections.
-
-  Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause the configurator to skip all
-  the questions about non-standard serial boards.
-
-  Most people can say N here.
-
-Extended dumb serial driver options
-CONFIG_SERIAL_EXTENDED
-  If you wish to use any non-standard features of the standard "dumb"
-  driver, say Y here. This includes HUB6 support, shared serial
-  interrupts, special multiport support, support for more than the
-  four COM 1/2/3/4 boards, etc.
-
-  Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause the configurator to skip all
-  the questions about serial driver options. If unsure, say N.
-
-Support more than 4 serial ports
-CONFIG_SERIAL_MANY_PORTS
-  Say Y here if you have dumb serial boards other than the four
-  standard COM 1/2/3/4 ports. This may happen if you have an AST
-  FourPort, Accent Async, Boca (read the Boca mini-HOWTO, available
-  from <http://www.tldp.org/docs.html#howto>), or other custom
-  serial port hardware which acts similar to standard serial port
-  hardware. If you only use the standard COM 1/2/3/4 ports, you can
-  say N here to save some memory. You can also say Y if you have an
-  "intelligent" multiport card such as Cyclades, Digiboards, etc.
-
-Support for sharing serial interrupts
-CONFIG_SERIAL_SHARE_IRQ
-  Some serial boards have hardware support which allows multiple dumb
-  serial ports on the same board to share a single IRQ. To enable
-  support for this in the serial driver, say Y here.
-
-Auto-detect IRQ on standard ports (unsafe)
-CONFIG_SERIAL_DETECT_IRQ
-  Say Y here if you want the kernel to try to guess which IRQ
-  to use for your serial port.
-
-  This is considered unsafe; it is far better to configure the IRQ in
-  a boot script using the setserial command.
-
-  If unsure, say N.
-
-Support special multiport boards
-CONFIG_SERIAL_MULTIPORT
-  Some multiport serial ports have special ports which are used to
-  signal when there are any serial ports on the board which need
-  servicing. Say Y here to enable the serial driver to take advantage
-  of those special I/O ports.
-
-SGI Zilog85C30 serial support
-CONFIG_SGI_SERIAL
-  If you want to use your SGI's built-in serial ports under Linux,
-  answer Y.
-
-SGI Newport Graphics support
-CONFIG_SGI_NEWPORT_GFX
-  If you have an SGI machine and you want to compile the graphics
-  drivers, say Y here. This will include the code for the
-  /dev/graphics and /dev/gfx drivers into the kernel for supporting
-  virtualized access to your graphics hardware.
-
-SGI Newport Console support
-CONFIG_SGI_NEWPORT_CONSOLE
-  Say Y here if you want the console on the Newport aka XL graphics
-  card of your Indy.  Most people say Y here.
-
-SGI DS1286 RTC support
-CONFIG_SGI_DS1286
-  If you say Y here and create a character special file /dev/rtc with
-  major number 10 and minor number 135 using mknod ("man mknod"), you
-  will get access to the real time clock built into your computer.
-  Every SGI has such a clock built in. It reports status information
-  via the file /proc/rtc and its behaviour is set by various ioctls on
-  /dev/rtc.
-
-Indy/I2 Hardware Watchdog
-CONFIG_INDYDOG
-  Hardwaredriver for the Indy's/I2's watchdog. This is a
-  watchdog timer that will reboot the machine after a 60 second 
-  timer expired and no process has written to /dev/watchdog during
-  that time.
-
-Support the Bell Technologies HUB6 card
-CONFIG_HUB6
-  Say Y here to enable support in the dumb serial driver to support
-  the HUB6 card.
-
-PCMCIA serial device support
-CONFIG_PCMCIA_SERIAL_CS
-  Say Y here to enable support for 16-bit PCMCIA serial devices,
-  including serial port cards, modems, and the modem functions of
-  multi-function Ethernet/modem cards. (PCMCIA- or PC-cards are
-  credit-card size devices often used with laptops.)
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called serial_cs.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-  If unsure, say N.
-
-CONFIG_SYNCLINK_CS
-  Enable support for the SyncLink PC Card serial adapter, running
-  asynchronous and HDLC communications up to 512Kbps. The port is
-  selectable for RS-232, V.35, RS-449, RS-530, and X.21
-
-  This driver may be built as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called synclinkmp.o.  If you want to do that, say M
-  here.
-
-ACP Modem (Mwave) support
-CONFIG_MWAVE
-  The ACP modem (Mwave) for Linux is a WinModem. It is composed of a
-  kernel driver and a user level application. Together these components
-  support direct attachment to public switched telephone networks (PSTNs)
-  and support selected world wide countries.
-
-  This version of the ACP Modem driver supports the IBM Thinkpad 600E,
-  600, and 770 that include on board ACP modem hardware.
-
-  The modem also supports the standard communications port interface
-  (ttySx) and is compatible with the Hayes AT Command Set.
-
-  The user level application needed to use this driver can be found at
-  the IBM Linux Technology Center (LTC) web site:
-  <http://www.ibm.com/linux/ltc/>.
-
-  If you own one of the above IBM Thinkpads which has the Mwave chipset
-  in it, say Y.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called mwave.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
-
-/dev/agpgart (AGP Support)
-CONFIG_AGP
-  AGP (Accelerated Graphics Port) is a bus system mainly used to
-  connect graphics cards to the rest of the system.
-
-  If you have an AGP system and you say Y here, it will be possible to
-  use the AGP features of your 3D rendering video card. This code acts
-  as a sort of "AGP driver" for the motherboard's chipset.
-
-  If you need more texture memory than you can get with the AGP GART
-  (theoretically up to 256 MB, but in practice usually 64 or 128 MB
-  due to kernel allocation issues), you could use PCI accesses
-  and have up to a couple gigs of texture space.
-
-  Note that this is the only means to have XFree4/GLX use
-  write-combining with MTRR support on the AGP bus. Without it, OpenGL
-  direct rendering will be a lot slower but still faster than PIO.
-
-  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
-  use GLX or DRI.  If unsure, say N.
-
-  This driver is available as a module.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.  The
-  module will be called agpgart.o.
-
-Intel 440LX/BX/GX/815/820/830/840/845/850/860 support
-CONFIG_AGP_INTEL
-  This option gives you AGP support for the GLX component of the
-  XFree86 4.x on Intel 440LX/BX/GX, 815, 820, 830, 840, 845, 850 and 860 chipsets.
-
-  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
-  use GLX or DRI.  If unsure, say N.
-
-Intel 460GX support
-CONFIG_AGP_I460
-  This option gives you AGP support for the Intel 460GX chipset.  This
-  chipset, the first to support Intel Itanium processors, is new and
-  this option is correspondingly a little experimental.
-
-  If you don't have a 460GX based machine (such as BigSur) with an AGP 
-  slot then this option isn't going to do you much good.  If you're
-  dying to do Direct Rendering on IA-64, this is what you're looking for.
-
-Intel I810/I815 DC100/I810e support
-CONFIG_AGP_I810
-  This option gives you AGP support for the Xserver on the Intel 810
-  815 and 830m chipset boards for their on-board integrated graphics. This
-  is required to do any useful video modes with these boards.
-
-VIA chipset support
-CONFIG_AGP_VIA
-  This option gives you AGP support for the GLX component of the
-  XFree86 4.x on VIA MPV3/Apollo Pro chipsets.
-
-  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
-  use GLX or DRI.  If unsure, say N.
-
-AMD Irongate, 761, and 762 support
-CONFIG_AGP_AMD
-  This option gives you AGP support for the GLX component of the
-  XFree86 4.x on AMD Irongate, 761, and 762 chipsets.
-
-  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
-  use GLX or DRI.  If unsure, say N.
-
-CONFIG_AGP_AMD_8151
-  This option gives you AGP support for the GLX component of
-  XFree86 on AMD K8 with an AGP 8151 chipset.
-
-  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
-  use GLX or DRI.  If unsure, say N.
-
-Generic SiS support
-CONFIG_AGP_SIS
-  This option gives you AGP support for the GLX component of the "soon
-  to be released" XFree86 4.x on Silicon Integrated Systems [SiS]
-  chipsets.
-
-  Note that 5591/5592 AGP chipsets are NOT supported.
-
-  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
-  use GLX or DRI.  If unsure, say N.
-
-Serverworks LE/HE support
-CONFIG_AGP_SWORKS
-  Say Y here to support the Serverworks AGP card.  See 
-  <http://www.serverworks.com/> for product descriptions and images.
-
-ALI chipset support
-CONFIG_AGP_ALI
-  This option gives you AGP support for the GLX component of the
-  XFree86 4.x on the following ALi chipsets.  The supported chipsets
-  include M1541, M1621, M1631, M1632, M1641,M1647,and M1651.
-  For the ALi-chipset question, ALi suggests you refer to
-  <http://www.ali.com.tw/eng/support/index.shtml>.
-
-  The M1541 chipset can do AGP 1x and 2x, but note that there is an
-  acknowledged incompatibility with Matrox G200 cards. Due to
-  timing issues, this chipset cannot do AGP 2x with the G200.
-  This is a hardware limitation. AGP 1x seems to be fine, though.
-
-  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
-  use GLX or DRI.  If unsure, say N.
-
-CONFIG_AGP_HP_ZX1
-  This option gives you AGP GART support for the HP ZX1 chipset
-  for IA64 processors.
-
-Support for ISA-bus hardware
-CONFIG_ISA
-  Find out whether you have ISA slots on your motherboard.  ISA is the
-  name of a bus system, i.e. the way the CPU talks to the other stuff
-  inside your box.  Other bus systems are PCI, EISA, MicroChannel
-  (MCA) or VESA.  ISA is an older system, now being displaced by PCI;
-  newer boards don't support it.  If you have ISA, say Y, otherwise N.
-
-Support for PCI bus hardware
-CONFIG_PCI
-  Find out whether you have a PCI motherboard. PCI is the name of a
-  bus system, i.e. the way the CPU talks to the other stuff inside
-  your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or
-  VESA. If you have PCI, say Y, otherwise N.
-
-  The PCI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>, contains valuable
-  information about which PCI hardware does work under Linux and which
-  doesn't.
-
-PCI support
-CONFIG_PCI_INTEGRATOR
-  Find out whether you have a PCI motherboard. PCI is the name of a
-  bus system, i.e. the way the CPU talks to the other stuff inside
-  your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or
-  VESA. If you have PCI, say Y, otherwise N.
-
-  The PCI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>, contains valuable
-  information about which PCI hardware does work under Linux and which
-  doesn't.
-
-QSpan PCI
-CONFIG_PCI_QSPAN
-  Find out whether you have a PCI motherboard. PCI is the name of a
-  bus system, i.e. the way the CPU talks to the other stuff inside
-  your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or
-  VESA. If you have PCI, say Y, otherwise N.
-
-  The PCI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>, contains valuable
-  information about which PCI hardware does work under Linux and which
-  doesn't.
-
-# Choice: pci_access
-PCI access mode
-CONFIG_PCI_GOBIOS
-  On PCI systems, the BIOS can be used to detect the PCI devices and
-  determine their configuration. However, some old PCI motherboards
-  have BIOS bugs and may crash if this is done. Also, some embedded
-  PCI-based systems don't have any BIOS at all. Linux can also try to
-  detect the PCI hardware directly without using the BIOS.
-
-  With this option, you can specify how Linux should detect the PCI
-  devices. If you choose "BIOS", the BIOS will be used, if you choose
-  "Direct", the BIOS won't be used, and if you choose "Any", the
-  kernel will try the direct access method and falls back to the BIOS
-  if that doesn't work. If unsure, go with the default, which is
-  "Any".
-
-PCI device name database
-CONFIG_PCI_NAMES
-  By default, the kernel contains a database of all known PCI device
-  names to make the information in /proc/pci, /proc/ioports and
-  similar files comprehensible to the user. This database increases
-  size of the kernel image by about 80KB, but it gets freed after the
-  system boots up, so it doesn't take up kernel memory. Anyway, if you
-  are building an installation floppy or kernel for an embedded system
-  where kernel image size really matters, you can disable this feature
-  and you'll get device ID numbers instead of names.
-
-  When in doubt, say Y.
-
-Generic PCI hotplug support
-CONFIG_HOTPLUG_PCI
-  Say Y here if you have a motherboard with a PCI Hotplug controller.
-  This allows you to add and remove PCI cards while the machine is
-  powered up and running.  The file system pcihpfs must be mounted
-  in order to interact with any PCI Hotplug controllers.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called pci_hotplug.o. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-  When in doubt, say N.
-
-Compaq PCI Hotplug driver
-CONFIG_HOTPLUG_PCI_COMPAQ
-  Say Y here if you have a motherboard with a Compaq PCI Hotplug
-  controller.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called cpqphp.o. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-  When in doubt, say N.
-
-PCI Compaq Hotplug controller NVRAM support
-CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM
-  Say Y here if you have a Compaq server that has a PCI Hotplug
-  controller.  This will allow the PCI Hotplug driver to store the PCI
-  system configuration options in NVRAM.
-
-  When in doubt, say N.
-
-ACPI PCI Hotplug driver
-CONFIG_HOTPLUG_PCI_ACPI
-  Say Y here if you have a system that supports PCI Hotplug using
-  ACPI.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called acpiphp.o. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-MCA support
-CONFIG_MCA
-  MicroChannel Architecture is found in some IBM PS/2 machines and
-  laptops.  It is a bus system similar to PCI or ISA. See
-  <file:Documentation/mca.txt> (and especially the web page given
-  there) before attempting to build an MCA bus kernel.
-
-Support for EISA-bus hardware
-CONFIG_EISA
-  The Extended Industry Standard Architecture (EISA) bus was
-  developed as an open alternative to the IBM MicroChannel bus.
-
-  The EISA bus provided some of the features of the IBM MicroChannel
-  bus while maintaining backward compatibility with cards made for
-  the older ISA bus.  The EISA bus saw limited use between 1988 and
-  1995 when it was made obsolete by the PCI bus.
-
-  Say Y here if you are building a kernel for an EISA-based machine.
-
-  Otherwise, say N.
-
-SGI Visual Workstation support
-CONFIG_VISWS
-  The SGI Visual Workstation series is an IA32-based workstation
-  based on SGI systems chips with some legacy PC hardware attached.
-  Say Y here to create a kernel to run on the SGI 320 or 540.
-  A kernel compiled for the Visual Workstation will not run on other
-  PC boards and vice versa.
-  See <file:Documentation/sgi-visws.txt> for more.
-
-SGI Visual Workstation framebuffer support
-CONFIG_FB_SGIVW
-  SGI Visual Workstation support for framebuffer graphics.
-
-I2O support
-CONFIG_I2O
-  The Intelligent Input/Output (I2O) architecture allows hardware
-  drivers to be split into two parts: an operating system specific
-  module called the OSM and an hardware specific module called the
-  HDM. The OSM can talk to a whole range of HDM's, and ideally the
-  HDM's are not OS dependent. This allows for the same HDM driver to
-  be used under different operating systems if the relevant OSM is in
-  place. In order for this to work, you need to have an I2O interface
-  adapter card in your computer. This card contains a special I/O
-  processor (IOP), thus allowing high speeds since the CPU does not
-  have to deal with I/O.
-
-  If you say Y here, you will get a choice of interface adapter
-  drivers and OSM's with the following questions.
-
-  This support is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  You will get modules called
-  i2o_core.o and i2o_config.o.
-
-  If unsure, say N.
-
-I2O PCI support
-CONFIG_I2O_PCI
-  Say Y for support of PCI bus I2O interface adapters. Currently this
-  is the only variety supported, so you should say Y.
-
-  This support is also available as a module called i2o_pci.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-I2O Block OSM
-CONFIG_I2O_BLOCK
-  Include support for the I2O Block OSM. The Block OSM presents disk
-  and other structured block devices to the operating system.
-
-  This support is also available as a module called i2o_block.o ( =
-  code which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-I2O LAN OSM
-CONFIG_I2O_LAN
-  Include support for the LAN OSM. You will also need to include
-  support for token ring or FDDI if you wish to use token ring or FDDI
-  I2O cards with this driver.
-
-  This support is also available as a module called i2o_lan.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-I2O SCSI OSM
-CONFIG_I2O_SCSI
-  Allows direct SCSI access to SCSI devices on a SCSI or FibreChannel
-  I2O controller. You can use both the SCSI and Block OSM together if
-  you wish.
-
-  This support is also available as a module called i2o_scsi.o ( =
-  code which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-I2O /proc support
-CONFIG_I2O_PROC
-  If you say Y here and to "/proc file system support", you will be
-  able to read I2O related information from the virtual directory
-  /proc/i2o.
-
-  This support is also available as a module called i2o_proc.o ( =
-  code which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Plug and Play support
-CONFIG_PNP
-  Plug and Play (PnP) is a standard for peripherals which allows those
-  peripherals to be configured by software, e.g. assign IRQ's or other
-  parameters. No jumpers on the cards are needed, instead the values
-  are provided to the cards from the BIOS, from the operating system,
-  or using a user-space utility.
-
-  Say Y here if you would like Linux to configure your Plug and Play
-  devices. You should then also say Y to "ISA Plug and Play support",
-  below. Alternatively, you can say N here and configure your PnP
-  devices using the user space utilities contained in the isapnptools
-  package.
-
-  This support is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-ISA Plug and Play support
-CONFIG_ISAPNP
-  Say Y here if you would like support for ISA Plug and Play devices.
-  Some information is in <file:Documentation/isapnp.txt>.
-
-  This support is also available as a module called isapnp.o ( =
-  code which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-  If unsure, say Y.
-
-PNPBIOS support
-CONFIG_PNPBIOS
-  Linux uses the PNPBIOS as defined in "Plug and Play BIOS
-  Specification Version 1.0A May 5, 1994" to autodetect built-in
-  mainboard resources (e.g. parallel port resources).
-
-  Other features (e.g. change resources, ESCD, event notification,
-  Docking station information, ISAPNP services) are not used.
-
-  Note: ACPI is expected to supersede PNPBIOS some day, currently it
-  co-exists nicely.
-
-  See latest pcmcia-cs (stand-alone package) for a nice "lspnp" tools,
-  or have a look at /proc/bus/pnp.
-
-  If unsure, say Y.
-
-Support for hot-pluggable devices
-CONFIG_HOTPLUG
-  Say Y here if you want to plug devices into your computer while
-  the system is running, and be able to use them quickly.  In many
-  cases, the devices can likewise be unplugged at any time too.
-
-  One well known example of this is PCMCIA- or PC-cards, credit-card
-  size devices such as network cards, modems or hard drives which are
-  plugged into slots found on all modern laptop computers.  Another
-  example, used on modern desktops as well as laptops, is USB.
-
-  Enable HOTPLUG and KMOD, and build a modular kernel.  Get agent
-  software (at <http://linux-hotplug.sourceforge.net/>) and install it.
-  Then your kernel will automatically call out to a user mode "policy
-  agent" (/sbin/hotplug) to load modules and set up software needed
-  to use devices as you hotplug them.
-
-PCMCIA/CardBus support
-CONFIG_PCMCIA
-  Say Y here if you want to attach PCMCIA- or PC-cards to your Linux
-  computer.  These are credit-card size devices such as network cards,
-  modems or hard drives often used with laptops computers.  There are
-  actually two varieties of these cards: the older 16 bit PCMCIA cards
-  and the newer 32 bit CardBus cards.  If you want to use CardBus
-  cards, you need to say Y here and also to "CardBus support" below.
-
-  To use your PC-cards, you will need supporting software from David
-  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
-  for location).  Please also read the PCMCIA-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  When compiled this way, there will be modules called pcmcia_core.o
-  and ds.o.  If you want to compile it as a module, say M here and
-  read <file:Documentation/modules.txt>.
-
-CardBus card and (Yenta) bridge support
-CONFIG_CARDBUS
-  CardBus is a bus mastering architecture for PC-cards, which allows
-  for 32 bit PC-cards (the original PCMCIA standard specifies only
-  a 16 bit wide bus). Many newer PC-cards are actually CardBus cards.
-
-  This option enables support for CardBus PC Cards, as well as support
-  for CardBus host bridges.  Virtually all modern PCMCIA bridges are
-  CardBus compatible.  A "bridge" is the hardware inside your computer
-  that PCMCIA cards are plugged into.
-
-  To use your PC-cards, you will need supporting software from David
-  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
-  for location).
-
-  If unsure, say Y.
-
-i82092 compatible bridge support
-CONFIG_I82092
-  This provides support for the Intel I82092AA PCI-to-PCMCIA bridge device,
-  found in some older laptops and more commonly in evaluation boards for the
-  chip.
-
-i82365 compatible host bridge support
-CONFIG_I82365
-  Say Y here to include support for ISA-bus PCMCIA host bridges that
-  are register compatible with the Intel i82365.  These are found on
-  older laptops and ISA-bus card readers for desktop systems.  A
-  "bridge" is the hardware inside your computer that PCMCIA cards are
-  plugged into. If unsure, say N.
-
-Databook TCIC host bridge support
-CONFIG_TCIC
-  Say Y here to include support for the Databook TCIC family of PCMCIA
-  host bridges. These are only found on a handful of old systems.
-  "Bridge" is the name used for the hardware inside your computer that
-  PCMCIA cards are plugged into. If unsure, say N.
-
-System V IPC
-CONFIG_SYSVIPC
-  Inter Process Communication is a suite of library functions and
-  system calls which let processes (running programs) synchronize and
-  exchange information. It is generally considered to be a good thing,
-  and some programs won't run unless you say Y here. In particular, if
-  you want to run the DOS emulator dosemu under Linux (read the
-  DOSEMU-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>), you'll need to say Y
-  here.
-
-  You can find documentation about IPC with "info ipc" and also in
-  section 6.4 of the Linux Programmer's Guide, available from
-  <http://www.tldp.org/docs.html#guide>.
-
-BSD Process Accounting
-CONFIG_BSD_PROCESS_ACCT
-  If you say Y here, a user level program will be able to instruct the
-  kernel (via a special system call) to write process accounting
-  information to a file: whenever a process exits, information about
-  that process will be appended to the file by the kernel.  The
-  information includes things such as creation time, owning user,
-  command name, memory usage, controlling terminal etc. (the complete
-  list is in the struct acct in <file:include/linux/acct.h>).  It is
-  up to the user level program to do useful things with this
-  information.  This is generally a good idea, so say Y.
-
-Sysctl support
-CONFIG_SYSCTL
-  The sysctl interface provides a means of dynamically changing
-  certain kernel parameters and variables on the fly without requiring
-  a recompile of the kernel or reboot of the system.  The primary
-  interface consists of a system call, but if you say Y to "/proc
-  file system support", a tree of modifiable sysctl entries will be
-  generated beneath the /proc/sys directory. They are explained in the
-  files in <file:Documentation/sysctl/>.  Note that enabling this
-  option will enlarge the kernel by at least 8 KB.
-
-  As it is generally a good thing, you should say Y here unless
-  building a kernel for install/rescue disks or your system is very
-  limited in memory.
-
-# Choice: kcore
-Kernel core (/proc/kcore) format
-CONFIG_KCORE_ELF
-  If you enabled support for /proc file system then the file
-  /proc/kcore will contain the kernel core image. This can be used
-  in gdb:
-
-  $ cd /usr/src/linux ; gdb vmlinux /proc/kcore
-
-  You have two choices here: ELF and A.OUT. Selecting ELF will make
-  /proc/kcore appear in ELF core format as defined by the Executable
-  and Linking Format specification. Selecting A.OUT will choose the
-  old "a.out" format which may be necessary for some old versions
-  of binutils or on some architectures.
-
-  This is especially useful if you have compiled the kernel with the
-  "-g" option to preserve debugging information. It is mainly used
-  for examining kernel data structures on the live kernel so if you
-  don't understand what this means or are not a kernel hacker, just
-  leave it at its default value ELF.
-
-Select a.out format for /proc/kcore
-CONFIG_KCORE_AOUT
-  Not necessary unless you're using a very out-of-date binutils
-  version.  You probably want KCORE_ELF.
-
-Kernel support for ELF binaries
-CONFIG_BINFMT_ELF
-  ELF (Executable and Linkable Format) is a format for libraries and
-  executables used across different architectures and operating
-  systems. Saying Y here will enable your kernel to run ELF binaries
-  and enlarge it by about 13 KB. ELF support under Linux has now all
-  but replaced the traditional Linux a.out formats (QMAGIC and ZMAGIC)
-  because it is portable (this does *not* mean that you will be able
-  to run executables from different architectures or operating systems
-  however) and makes building run-time libraries very easy. Many new
-  executables are distributed solely in ELF format. You definitely
-  want to say Y here.
-
-  Information about ELF is contained in the ELF HOWTO available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  If you find that after upgrading from Linux kernel 1.2 and saying Y
-  here, you still can't run any ELF binaries (they just crash), then
-  you'll have to install the newest ELF runtime libraries, including
-  ld.so (check the file <file:Documentation/Changes> for location and
-  latest version).
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called binfmt_elf.o. Saying M or N here is dangerous because
-  some crucial programs on your system might be in ELF format.
-
-Kernel support for a.out binaries
-CONFIG_BINFMT_AOUT
-  A.out (Assembler.OUTput) is a set of formats for libraries and
-  executables used in the earliest versions of UNIX. Linux used the
-  a.out formats QMAGIC and ZMAGIC until they were replaced with the
-  ELF format.
-
-  As more and more programs are converted to ELF, the use for a.out
-  will gradually diminish. If you disable this option it will reduce
-  your kernel by one page. This is not much and by itself does not
-  warrant removing support. However its removal is a good idea if you
-  wish to ensure that absolutely none of your programs will use this
-  older executable format. If you don't know what to answer at this
-  point then answer Y. If someone told you "You need a kernel with
-  QMAGIC support" then you'll have to say Y here. You may answer M to
-  compile a.out support as a module and later load the module when you
-  want to use a program or library in a.out format. The module will be
-  called binfmt_aout.o. Saying M or N here is dangerous though,
-  because some crucial programs on your system might still be in A.OUT
-  format.
-
-OSF/1 v4 readv/writev compatibility
-CONFIG_OSF4_COMPAT
-  Say Y if you are using OSF/1 binaries (like Netscape and Acrobat)
-  with v4 shared libraries freely available from Compaq. If you're
-  going to use shared libraries from Tru64 version 5.0 or later, say N.
-
-Kernel support for Linux/Intel ELF binaries
-CONFIG_BINFMT_EM86
-  Say Y here if you want to be able to execute Linux/Intel ELF
-  binaries just like native Alpha binaries on your Alpha machine. For
-  this to work, you need to have the emulator /usr/bin/em86 in place.
-
-  You can get the same functionality by saying N here and saying Y to
-  "Kernel support for MISC binaries".
-
-  You may answer M to compile the emulation support as a module and
-  later load the module when you want to use a Linux/Intel binary. The
-  module will be called binfmt_em86.o. If unsure, say Y.
-
-Kernel support for SOM binaries
-CONFIG_BINFMT_SOM
-  SOM is a binary executable format inherited from HP/UX.  Say Y here
-  to be able to load and execute SOM binaries directly.
-
-Kernel support for MISC binaries
-CONFIG_BINFMT_MISC
-  If you say Y here, it will be possible to plug wrapper-driven binary
-  formats into the kernel. You will like this especially when you use
-  programs that need an interpreter to run like Java, Python or
-  Emacs-Lisp. It's also useful if you often run DOS executables under
-  the Linux DOS emulator DOSEMU (read the DOSEMU-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>). Once you have
-  registered such a binary class with the kernel, you can start one of
-  those programs simply by typing in its name at a shell prompt; Linux
-  will automatically feed it to the correct interpreter.
-
-  You can do other nice things, too. Read the file
-  <file:Documentation/binfmt_misc.txt> to learn how to use this
-  feature, and <file:Documentation/java.txt> for information about how
-  to include Java support.
-
-  You must say Y to "/proc file system support" (CONFIG_PROC_FS) to
-  use this part of the kernel.
-
-  You may say M here for module support and later load the module when
-  you have use for it; the module is called binfmt_misc.o. If you
-  don't know what to answer at this point, say Y.
-
-Kernel support for JAVA binaries
-CONFIG_BINFMT_JAVA
-  If you say Y here, the kernel will load and execute Java J-code
-  binaries directly.  Note: this option is obsolete and scheduled for
-  removal, use CONFIG_BINFMT_MISC instead.
-
-Solaris binary emulation
-CONFIG_SOLARIS_EMUL
-  This is experimental code which will enable you to run (many)
-  Solaris binaries on your SPARC Linux machine.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called solaris.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-SUN SME environment monitoring
-CONFIG_ENVCTRL
-  Kernel support for temperature and fan monitoring on Sun SME
-  machines.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called envctrl.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-# Choice: x86type
-Processor family
-CONFIG_M386
-  This is the processor type of your CPU. This information is used for
-  optimizing purposes. In order to compile a kernel that can run on
-  all x86 CPU types (albeit not optimally fast), you can specify
-  "386" here.
-
-  The kernel will not necessarily run on earlier architectures than
-  the one you have chosen, e.g. a Pentium optimized kernel will run on
-  a PPro, but not necessarily on a i486.
-
-  Here are the settings recommended for greatest speed:
-   - "386" for the AMD/Cyrix/Intel 386DX/DXL/SL/SLC/SX, Cyrix/TI
-     486DLC/DLC2, UMC 486SX-S and NexGen Nx586.  Only "386" kernels
-     will run on a 386 class machine.
-   - "486" for the AMD/Cyrix/IBM/Intel 486DX/DX2/DX4 or
-     SL/SLC/SLC2/SLC3/SX/SX2 and UMC U5D or U5S.
-   - "586" for generic Pentium CPUs, possibly lacking the TSC
-     (time stamp counter) register.
-   - "Pentium-Classic" for the Intel Pentium.
-   - "Pentium-MMX" for the Intel Pentium MMX.
-   - "Pentium-Pro" for the Intel Pentium Pro/Celeron/Pentium II.
-   - "Pentium-III" for the Intel Pentium III
-     and Celerons based on the Coppermine core.
-   - "Pentium-4" for the Intel Pentium 4.
-   - "K6" for the AMD K6, K6-II and K6-III (aka K6-3D).
-   - "Athlon" for the AMD K7 family (Athlon/Duron/Thunderbird).
-   - "Elan" for the AMD Elan family (Elan SC400/SC410).
-   - "Crusoe" for the Transmeta Crusoe series.
-   - "Winchip-C6" for original IDT Winchip.
-   - "Winchip-2" for IDT Winchip 2.
-   - "Winchip-2A" for IDT Winchips with 3dNow! capabilities.
-   - "CyrixIII" for VIA Cyrix III or VIA C3.
-   - "VIA C3-2 for VIA C3-2 "Nehemiah" (model 9 and above).
-
-  If you don't know what to do, choose "386".
-
-486
-CONFIG_M486
-  Select this for a x486 processor, ether Intel or one of the
-  compatible processors from AMD, Cyrix, IBM, or Intel.  Includes DX,
-  DX2, and DX4 variants; also SL/SLC/SLC2/SLC3/SX/SX2 and UMC U5D or
-  U5S.
-
-586/K5/5x86/6x86/6x86MX
-CONFIG_M586
-  Select this for an x586 or x686 processor such as the AMD K5, the
-  Intel 5x86 or 6x86, or the Intel 6x86MX.  This choice does not
-  assume the RDTSC instruction.
-
-Pentium Classic
-CONFIG_M586TSC
-  Select this for a Pentium Classic processor with the RDTSC (Read
-  Time Stamp Counter) instruction for benchmarking.
-
-VIA C3-2 (Nehemiah)
-CONFIG_MVIAC3_2
-  Select this for a VIA C3 "Nehemiah". Selecting this enables usage of SSE
-  and tells gcc to treat the CPU as a 686.
-
-  Note, this kernel will not boot on older (pre model 9) C3s.
-
-32-bit PDC
-CONFIG_PDC_NARROW
-  Saying Y here will allow developers with a C180, C200, C240, C360,
-  J200, J210, and/or a J2240 to test 64-bit kernels by providing a
-  wrapper for the 32-bit PDC calls.  Since the machines which require
-  this option do not support over 4G of RAM, this option is targeted
-  for developers of these machines wishing to test changes on both
-  32-bit and 64-bit configurations.
-
-  If unsure, say N.
-
-VGA text console
-CONFIG_VGA_CONSOLE
-  Saying Y here will allow you to use Linux in text mode through a
-  display that complies with the generic VGA standard. Virtually
-  everyone wants that.
-
-  The program SVGATextMode can be used to utilize SVGA video cards to
-  their full potential in text mode. Download it from
-  <ftp://ibiblio.org/pub/Linux/utils/console/>.
-
-  Say Y.
-
-Distribute interrupts on all CPUs by default
-CONFIG_IRQ_ALL_CPUS
-  This option gives the kernel permission to distribute IRQs across
-  multiple CPUs.  Saying N here will route all IRQs to the first
-  CPU. Generally SMP PowerMacs can answer Y. SMP IBM CHRP boxes or
-  Power3 boxes should say N for now.
-
-Video mode selection support
-CONFIG_VIDEO_SELECT
-  This enables support for text mode selection on kernel startup. If
-  you want to take advantage of some high-resolution text mode your
-  card's BIOS offers, but the traditional Linux utilities like
-  SVGATextMode don't, you can say Y here and set the mode using the
-  "vga=" option from your boot loader (lilo or loadlin) or set
-  "vga=ask" which brings up a video mode menu on kernel startup. (Try
-  "man bootparam" or see the documentation of your boot loader about
-  how to pass options to the kernel.)
-
-  Read the file <file:Documentation/svga.txt> for more information
-  about the Video mode selection support. If unsure, say N.
-
-Support for frame buffer devices
-CONFIG_FB
-  The frame buffer device provides an abstraction for the graphics
-  hardware. It represents the frame buffer of some video hardware and
-  allows application software to access the graphics hardware through
-  a well-defined interface, so the software doesn't need to know
-  anything about the low-level (hardware register) stuff.
-
-  Frame buffer devices work identically across the different
-  architectures supported by Linux and make the implementation of
-  application programs easier and more portable; at this point, an X
-  server exists which uses the frame buffer device exclusively.
-  On several non-X86 architectures, the frame buffer device is the
-  only way to use the graphics hardware.
-
-  The device is accessed through special device nodes, usually located
-  in the /dev directory, i.e. /dev/fb*.
-
-  You need an utility program called fbset to make full use of frame
-  buffer devices. Please read <file:Documentation/fb/framebuffer.txt>
-  and the Framebuffer-HOWTO at
-  <http://www.tahallah.demon.co.uk/programming/prog.html> for more
-  information.
-
-  Say Y here and to the driver for your graphics board below if you
-  are compiling a kernel for a non-x86 architecture.
-
-  If you are compiling for the x86 architecture, you can say Y if you
-  want to play with it, but it is not essential. Please note that
-  running graphical applications that directly touch the hardware
-  (e.g. an accelerated X server) and that are not frame buffer
-  device-aware may cause unexpected results. If unsure, say N.
-
-Acorn VIDC support
-CONFIG_FB_ACORN
-  This is the frame buffer device driver for the Acorn VIDC graphics
-  hardware found in Acorn RISC PCs and other ARM-based machines.  If
-  unsure, say N.
-
-Permedia2 support
-CONFIG_FB_PM2
-  This is the frame buffer device driver for the Permedia2 AGP frame
-  buffer card from ASK, aka `Graphic Blaster Exxtreme'.  There is a
-  product page at
-  <http://www.ask.com.hk/product/Permedia%202/permedia2.htm>.
-
-Enable FIFO disconnect feature
-CONFIG_FB_PM2_FIFO_DISCONNECT
-  Support the Permedia2 FIFOI disconnect feature (see CONFIG_FB_PM2).
-
-Generic Permedia2 PCI board support
-CONFIG_FB_PM2_PCI
-  Say Y to enable support for Permedia2 AGP frame buffer card from
-  3Dlabs (aka `Graphic Blaster Exxtreme') on the PCI bus.
-
-Phase5 CVisionPPC/BVisionPPC support
-CONFIG_FB_PM2_CVPPC
-  Say Y to enable support for the Amiga Phase 5 CVisionPPC BVisionPPC
-  framebuffer cards.  Phase 5 is no longer with us, alas.
-
-Amiga native chipset support
-CONFIG_FB_AMIGA
-  This is the frame buffer device driver for the builtin graphics
-  chipset found in Amigas.
-
-  The driver is also available as a module ( = code which can be
-  inserted and removed from the running kernel whenever you want). The
-  module will be called amifb.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Amiga OCS chipset support
-CONFIG_FB_AMIGA_OCS
-  This enables support for the original Agnus and Denise video chips,
-  found in the Amiga 1000 and most A500's and A2000's. If you intend
-  to run Linux on any of these systems, say Y; otherwise say N.
-
-Amiga ECS chipset support
-CONFIG_FB_AMIGA_ECS
-  This enables support for the Enhanced Chip Set, found in later
-  A500's, later A2000's, the A600, the A3000, the A3000T and CDTV. If
-  you intend to run Linux on any of these systems, say Y; otherwise
-  say N.
-
-Amiga AGA chipset support
-CONFIG_FB_AMIGA_AGA
-  This enables support for the Advanced Graphics Architecture (also
-  known as the AGA or AA) Chip Set, found in the A1200, A4000, A4000T
-  and CD32. If you intend to run Linux on any of these systems, say Y;
-  otherwise say N.
-
-Amiga CyberVision support
-CONFIG_FB_CYBER
-  This enables support for the Cybervision 64 graphics card from
-  Phase5. Please note that its use is not all that intuitive (i.e. if
-  you have any questions, be sure to ask!). Say N unless you have a
-  Cybervision 64 or plan to get one before you next recompile the
-  kernel. Please note that this driver DOES NOT support the
-  Cybervision 64 3D card, as they use incompatible video chips.
-
-CyberPro 20x0 support
-CONFIG_FB_CYBER2000
-  This enables support for the Integraphics CyberPro 20x0 and 5000
-  VGA chips used in the Rebel.com Netwinder and other machines.
-  Say Y if you have a NetWinder or a graphics card containing this
-  device, otherwise say N.
-
-Amiga CyberVision3D support
-CONFIG_FB_VIRGE
-  This enables support for the Cybervision 64/3D graphics card from
-  Phase5. Please note that its use is not all that intuitive (i.e. if
-  you have any questions, be sure to ask!). Say N unless you have a
-  Cybervision 64/3D or plan to get one before you next recompile the
-  kernel. Please note that this driver DOES NOT support the older
-  Cybervision 64 card, as they use incompatible video chips.
-
-Amiga RetinaZ3 support
-CONFIG_FB_RETINAZ3
-  This enables support for the Retina Z3 graphics card. Say N unless
-  you have a Retina Z3 or plan to get one before you next recompile
-  the kernel.
-
-Cirrus Logic generic driver
-CONFIG_FB_CLGEN
-  This enables support for Cirrus Logic GD542x/543x based boards on
-  Amiga: SD64, Piccolo, Picasso II/II+, Picasso IV, or EGS Spectrum.
-
-  If you have a PCI-based system, this enables support for these
-  chips: GD-543x, GD-544x, GD-5480.
-
-  Please read the file <file:Documentation/fb/clgenfb.txt>.
-
-  Say N unless you have such a graphics board or plan to get one
-  before you next recompile the kernel.
-
-Apollo support
-CONFIG_APOLLO
-  Say Y here if you want to run Linux on an MC680x0-based Apollo
-  Domain workstation such as the DN3500.
-
-Apollo 3c505 "EtherLink Plus" support
-CONFIG_APOLLO_ELPLUS
-  Say Y or M here if your Apollo has a 3Com 3c505 ISA Ethernet card.
-  If you don't have one made for Apollos, you can use one from a PC,
-  except that your Apollo won't be able to boot from it (because the
-  code in the ROM will be for a PC).
-
-Atari native chipset support
-CONFIG_FB_ATARI
-  This is the frame buffer device driver for the builtin graphics
-  chipset found in Ataris.
-
-Amiga FrameMaster II/Rainbow II support
-CONFIG_FB_FM2
-  This is the frame buffer device driver for the Amiga FrameMaster
-  card from BSC (exhibited 1992 but not shipped as a CBM product).
-
-Open Firmware frame buffer device support
-CONFIG_FB_OF
-  Say Y if you want support with Open Firmware for your graphics
-  board.
-
-S3 Trio frame buffer device support
-CONFIG_FB_S3TRIO
-  If you have a S3 Trio say Y. Say N for S3 Virge.
-
-3Dfx Banshee/Voodoo3 display support
-CONFIG_FB_3DFX
-  This driver supports graphics boards with the 3Dfx Banshee/Voodoo3
-  chips. Say Y if you have such a graphics board.
-
-  The driver is also available as a module ( = code which can be
-  inserted and removed from the running kernel whenever you want). The
-  module will be called tdfxfb.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-nVidia Riva support
-CONFIG_FB_RIVA
-  This driver supports graphics boards with the nVidia Riva/Geforce
-  chips.
-  Say Y if you have such a graphics board.
-
-  The driver is also available as a module ( = code which can be
-  inserted and removed from the running kernel whenever you want). The
-  module will be called rivafb.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Trident Blade/Image support
-CONFIG_FB_TRIDENT
-  This driver is supposed to support graphics boards with the
-  Trident CyberXXXX/Image/CyberBlade chips mostly found in laptops
-  but also on some motherboards.Read <file:Documentation/fb/tridentfb.txt>
-
-  Say Y if you have such a graphics board.
-
-  The driver is also available as a module ( = code which can be
-  inserted and removed from the running kernel whenever you want). The
-  module will be called tridentfb.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-ATI Mach64 display support
-CONFIG_FB_ATY
-  This driver supports graphics boards with the ATI Mach64 chips.
-  Say Y if you have such a graphics board.
-
-  The driver is also available as a module ( = code which can be
-  inserted and removed from the running kernel whenever you want). The
-  module will be called atyfb.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-ATI Rage128 display support
-CONFIG_FB_ATY128
-  This driver supports graphics boards with the ATI Rage128 chips.
-  Say Y if you have such a graphics board and read
-  <file:Documentation/fb/aty128fb.txt>.
-
-  The driver is also available as a module ( = code which can be
-  inserted and removed from the running kernel whenever you want). The
-  module will be called aty128fb.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Maxine (Personal DECstation) onboard framebuffer support
-CONFIG_FB_MAXINE
-  Say Y here to directly support the on-board framebuffer in the
-  Maxine (5000/20, /25, /33) version of the DECstation.  There is a
-  page dedicated to Linux on DECstations at <http://decstation.unix-ag.org/>.
-
-PMAG-BA TURBOchannel framebuffer support
-CONFIG_FB_PMAG_BA
-  Say Y here to directly support the on-board PMAG-BA framebuffer in
-  the 5000/1xx versions of the DECstation.  There is a page dedicated
-  to Linux on DECstations at <http://decstation.unix-ag.org/>.
-
-PMAGB-B TURBOchannel framebuffer support
-CONFIG_FB_PMAGB_B
-  Say Y here to directly support the on-board PMAGB-B framebuffer in
-  the 5000/1xx versions of the DECstation.  There is a page dedicated
-  to Linux on DECstations at <http://decstation.unix-ag.org/>.
-
-FutureTV PCI card
-CONFIG_ARCH_FTVPCI
-  Say Y here if you intend to run this kernel on a FutureTV (nee Nexus
-  Electronics) StrongARM PCI card.
-
-ANAKIN Vehicle Telematics Platform
-CONFIG_ARCH_ANAKIN
-  The Anakin is a StrongArm based SA110 - 2 DIN Vehicle Telematics Platform.
-  64MB SDRAM - 4 Mb Flash - Compact Flash Interface - 1 MB VRAM
-
-  On board peripherals:
-        * Front display: 400x234 16 bit TFT touchscreen
-        * External independent second screen interface
-        * CAN controller SJA1000
-        * USB host controller
-        * 6 channel video codec with hardware overlay
-        * Smartcard reader
-        * IrDa
-
-  Modules interfaced over the Multi Media Extension slots:
-        * A communication card
-                Wavecom GPRS modem
-                uBlock GPS
-                Bosch DAB module
-        * An audio card ( 4 * 40W, AC97 Codec, I2S)
-
-Altera Excalibur XA10 Dev Board
-ARCH_CAMELOT
-  This enables support for Altera's Excalibur XA10 development board.
-  If you would like to build your kernel to run on one of these boards
-  then you must say 'Y' here. Otherwise say 'N'
-
-Link-Up Systems LCD support
-CONFIG_FB_L7200
-  This driver supports the L7200 Color LCD.
-  Say Y if you want graphics support.
-
-NeoMagic display support (EXPERIMENTAL)
-CONFIG_FB_NEOMAGIC
-  This driver supports notebooks with NeoMagic PCI chips.
-  Say Y if you have such a graphics card. 
-
-  The driver is also available as a module ( = code which can be
-  inserted and removed from the running kernel whenever you want). The
-  module will be called neofb.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
-
-PowerMac "control" frame buffer device support
-CONFIG_FB_CONTROL
-  This driver supports a frame buffer for the graphics adapter in the
-  Power Macintosh 7300 and others.
-
-PowerMac "platinum" frame buffer device support
-CONFIG_FB_PLATINUM
-  This driver supports a frame buffer for the "platinum" graphics
-  adapter in some Power Macintoshes.
-
-PowerMac "valkyrie" frame buffer device support
-CONFIG_FB_VALKYRIE
-  This driver supports a frame buffer for the "valkyrie" graphics
-  adapter in some Power Macintoshes.
-
-Chips 65550 display support
-CONFIG_FB_CT65550
-  This is the frame buffer device driver for the Chips & Technologies
-  65550 graphics chip in PowerBooks.
-
-TGA frame buffer support
-CONFIG_FB_TGA
-  This is the frame buffer device driver for generic TGA graphic
-  cards. Say Y if you have one of those.
-
-VESA VGA graphics console
-CONFIG_FB_VESA
-  This is the frame buffer device driver for generic VESA 2.0
-  compliant graphic cards. The older VESA 1.2 cards are not supported.
-  You will get a boot time penguin logo at no additional cost. Please
-  read <file:Documentation/fb/vesafb.txt>. If unsure, say Y.
-
-VGA 16-color planar support
-CONFIG_FBCON_VGA_PLANES
-  This low level frame buffer console driver enable the kernel to use
-  the 16-color planar modes of the old VGA cards where the bits of
-  each pixel are separated into 4 planes.
-
-  Only answer Y here if you have a (very old) VGA card that isn't VESA
-  2 compatible.
-
-VGA 16-color graphics console
-CONFIG_FB_VGA16
-  This is the frame buffer device driver for VGA 16 color graphic
-  cards. Say Y if you have such a card.
-
-  This code is also available as a module. If you want to compile it
-  as a module ( = code which can be inserted in and removed from the
-  running kernel whenever you want), say M here and read
-  <file:Documentation/modules.txt>.  The module will be called
-  vga16fb.o.
-
-Generic STI frame buffer device support
-CONFIG_FB_STI
-  STI refers to the HP "Standard Text Interface" which is a set of
-  BIOS routines contained in a ROM chip in HP PA-RISC based machines.
-  Enabling this option will implement the linux framebuffer device and
-  an fbcon color text console using calls to the STI BIOS routines.
-  The HP framebuffer device is sometimes planar, using a strange memory
-  layout, and changing the plane mask to create colored pixels
-  can require a call to the STI routines, so /dev/fb may not actually 
-  be useful.  However, on some systems packed pixel formats are supported.  
-  It is sufficient for basic text console functions, including fonts.
-
-  You should probably enable this option, unless you are having
-  trouble getting video when booting the kernel (make sure it isn't
-  just that you are running the console on the serial port, though).
-  Really old HP boxes may not have STI, and must use the PDC BIOS
-  console or the IODC BIOS.
-
-Select other compiled-in fonts
-CONFIG_FBCON_FONTS
-  Say Y here if you would like to use fonts other than the default
-  your frame buffer console usually use.
-
-  Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause the configurator to skip all
-  the questions about foreign fonts.
-
-  If unsure, say N (the default choices are safe).
-
-VGA 8x16 font
-CONFIG_FONT_8x16
-  This is the "high resolution" font for the VGA frame buffer (the one
-  provided by the VGA text console 80x25 mode.
-
-  If unsure, say Y.
-
-Support only 8 pixels wide fonts
-CONFIG_FBCON_FONTWIDTH8_ONLY
-  Answer Y here will make the kernel provide only the 8x8 fonts (these
-  are the less readable).
-
-  If unsure, say N.
-
-Sparc console 8x16 font
-CONFIG_FONT_SUN8x16
-  This is the high resolution console font for Sun machines. Say Y.
-
-Sparc console 12x22 font (not supported by all drivers)
-CONFIG_FONT_SUN12x22
-  This is the high resolution console font for Sun machines with very
-  big letters (like the letters used in the SPARC PROM). If the
-  standard font is unreadable for you, say Y, otherwise say N.
-
-VGA 8x8 font
-CONFIG_FONT_8x8
-  This is the "high resolution" font for the VGA frame buffer (the one
-  provided by the text console 80x50 (and higher) modes).
-
-  Note that this is a poor quality font. The VGA 8x16 font is quite a
-  lot more readable.
-
-  Given the resolution provided by the frame buffer device, answer N
-  here is safe.
-
-Mac console 6x11 font (not supported by all drivers)
-CONFIG_FONT_6x11
-  Small console font with Macintosh-style high-half glyphs.  Some Mac
-  framebuffer drivers don't support this one at all.
-
-Pearl (old m68k) console 8x8 font
-CONFIG_FONT_PEARL_8x8
-  Small console font with PC-style control-character and high-half
-  glyphs.
-
-Acorn console 8x8 font
-CONFIG_FONT_ACORN_8x8
-  Small console font with PC-style control characters and high-half
-  glyphs.
-
-Backward compatibility mode for Xpmac
-CONFIG_FB_COMPAT_XPMAC
-  If you use the Xpmac X server (common with mklinux), you'll need to
-  say Y here to use X. You should consider changing to XFree86 which
-  includes a server that supports the frame buffer device directly
-  (XF68_FBDev).
-
-Hercules (HGA) mono graphics support
-CONFIG_FB_HGA
-  Say Y here if you have a Hercules mono graphics card.
-
-  This driver is also available as a module ( = code which can be
-  inserted and removed from the running kernel whenever you want).
-  The module will be called hgafb.o. If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-  As this card technology is 15 years old, most people will answer N
-  here.
-
-Epson 1355 framebuffer support
-CONFIG_FB_E1355
-  Build in support for the SED1355 Epson Research Embedded RAMDAC
-  LCD/CRT Controller (since redesignated as the S1D13505) as a
-  framebuffer.  Product specs at
-  <http://www.erd.epson.com/vdc/html/products.htm>.
-
-Dreamcast Frame Buffer support
-CONFIG_FB_DC
-  Say Y here to enable support for the framebuffer on the Sega
-  Dreamcast.  This driver is also available as a module, dcfb.o.
-
-Register Base Address
-CONFIG_E1355_REG_BASE
-  Epson SED1355/S1D13505 LCD/CRT controller register base address.
-  See the manuals at
-  <http://www.erd.epson.com/vdc/html/contents/S1D13505.htm> for
-  discussion.
-
-Framebuffer Base Address
-CONFIG_E1355_FB_BASE
-  Epson SED1355/S1D13505 LCD/CRT controller memory base address.  See
-  the manuals at
-  <http://www.erd.epson.com/vdc/html/contents/S1D13505.htm> for
-  discussion.
-
-NEC PowerVR 2 display support
-CONFIG_FB_PVR2
-  Say Y here if you have a PowerVR 2 card in your box.  If you plan to
-  run linux on your Dreamcast, you will have to say Y here.
-  This driver may or may not work on other PowerVR 2 cards, but is
-  totally untested.  Use at your own risk.  If unsure, say N.
-
-  This driver is also available as a module ( = code which can be
-  inserted and removed from the running kernel whenever you want).
-  The module will be called pvr2fb.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-  You can pass several parameters to the driver at boot time or at
-  module load time.  The parameters look like "video=pvr2:XXX", where
-  the meaning of XXX can be found at the end of the main source file
-  (<file:drivers/video/pvr2fb.c>). Please see the file
-  <file:Documentation/fb/pvr2fb.txt>.
-
-Debug pvr2fb
-CONFIG_FB_PVR2_DEBUG
-  Say Y here if you wish for the pvr2fb driver to print out debugging
-  messages. Most people will want to say N here. If unsure, you will
-  also want to say N.
-
-Matrox unified accelerated driver
-CONFIG_FB_MATROX
-  Say Y here if you have a Matrox Millennium, Millennium II, Mystique,
-  Mystique 220, Productiva G100, Mystique G200, Millennium G200,
-  Matrox G400, G450 or G550 card in your box. At this time, support for 
-  the G-series digital output is almost non-existant.
-
-  This driver is also available as a module ( = code which can be
-  inserted and removed from the running kernel whenever you want).
-  The module will be called matroxfb.o. If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-  You can pass several parameters to the driver at boot time or at
-  module load time. The parameters look like "video=matrox:XXX", and
-  are described in <file:Documentation/fb/matroxfb.txt>.
-
-Matrox Millennium I/II support
-CONFIG_FB_MATROX_MILLENIUM
-  Say Y here if you have a Matrox Millennium or Matrox Millennium II
-  video card. If you select "Advanced lowlevel driver options" below,
-  you should check 4 bpp packed pixel, 8 bpp packed pixel, 16 bpp
-  packed pixel, 24 bpp packed pixel and 32 bpp packed pixel. You can
-  also use font widths different from 8.
-
-Matrox Mystique support
-CONFIG_FB_MATROX_MYSTIQUE
-  Say Y here if you have a Matrox Mystique or Matrox Mystique 220
-  video card. If you select "Advanced lowlevel driver options" below,
-  you should check 8 bpp packed pixel, 16 bpp packed pixel, 24 bpp
-  packed pixel and 32 bpp packed pixel. You can also use font widths
-  different from 8.
-
-Matrox G100/G200/G400/G450/G550 support
-CONFIG_FB_MATROX_G100
-  Say Y here if you have a Matrox G100, G200, G400, G450, or G550
-  based video card. If you select "Advanced lowlevel driver options",
-  you should check 8 bpp packed pixel, 16 bpp packed pixel, 24 bpp
-  packed pixel and 32 bpp packed pixel. You can also use font widths
-  different from 8.
-
-  If you need support for G400 secondary head, you must first say Y to
-  "I2C support" and "I2C bit-banging support" in the character devices
-  section, and then to "Matrox I2C support" and "G400 second head
-  support" here in the framebuffer section.
-  
-  If you have G550, you must also compile support for G450/G550 secondary
-  head into kernel, otherwise picture will be shown only on the output you
-  are probably not using...
-
-  If you need support for G450 or G550 secondary head, say Y to
-  "Matrox G450/G550 second head support" below.
-
-Matrox I2C support
-CONFIG_FB_MATROX_I2C
-  This drivers creates I2C buses which are needed for accessing the
-  DDC (I2C) bus present on all Matroxes, an I2C bus which
-  interconnects Matrox optional devices, like MGA-TVO on G200 and
-  G400, and the secondary head DDC bus, present on G400 only.
-
-  You can say Y or M here if you want to experiment with monitor
-  detection code. You must say Y or M here if you want to use either
-  second head of G400 or MGA-TVO on G200 or G400.
-
-  If you compile it as module, it will create a module named
-  i2c-matroxfb.o.
-
-Matrox G400 second head support
-CONFIG_FB_MATROX_MAVEN
-  WARNING !!! This support does not work with G450 !!!
-
-  Say Y or M here if you want to use a secondary head (meaning two
-  monitors in parallel) on G400 or MGA-TVO add-on on G200. Secondary
-  head is not compatible with accelerated XFree 3.3.x SVGA servers -
-  secondary head output is blanked while you are in X. With XFree
-  3.9.17 preview you can use both heads if you use SVGA over fbdev or
-  the fbdev driver on first head and the fbdev driver on second head.
-
-  If you compile it as module, two modules are created,
-  matroxfb_crtc2.o and matroxfb_maven.o. Matroxfb_maven is needed for
-  both G200 and G400, matroxfb_crtc2 is needed only by G400. You must
-  also load i2c-matroxfb to get it to run.
-
-  The driver starts in monitor mode and you must use the matroxset
-  tool (available at
-  <ftp://platan.vc.cvut.cz/pub/linux/matrox-latest/>) to switch it to
-  PAL or NTSC or to swap primary and secondary head outputs.
-  Secondary head driver also always start in 640x480 resolution, you
-  must use fbset to change it.
-
-  Also do not forget that second head supports only 16 and 32 bpp
-  packed pixels, so it is a good idea to compile them into the kernel
-  too.  You can use only some font widths, as the driver uses generic
-  painting procedures (the secondary head does not use acceleration
-  engine).
-
-Matrox G450 second head support
-CONFIG_FB_MATROX_G450
-  Say Y or M here if you want to use a secondary head (meaning two
-  monitors in parallel) on G450, or if you are using analog output
-  of G550.
-
-  If you compile it as module, two modules are created,
-  matroxfb_crtc2.o and matroxfb_g450.o. Both modules are needed if you
-  want two independent display devices.
-
-  The driver starts in monitor mode and currently does not support
-  output in TV modes.  You must use the matroxset tool (available
-  at <ftp://platan.vc.cvut.cz/pub/linux/matrox-latest/>) to swap
-  primary and secondary head outputs.  Secondary head driver always
-  start in 640x480 resolution and you must use fbset to change it.
-
-  Note on most G550 cards the analog output is the secondary head,
-  so you will need to say Y here to use it.
-
-  Also do not forget that second head supports only 16 and 32 bpp
-  packed pixels, so it is a good idea to compile them into the kernel
-  too. You can use only some font widths, as the driver uses generic
-  painting procedures (the secondary head does not use acceleration
-  engine).
-
-Matrox unified driver multihead support
-CONFIG_FB_MATROX_MULTIHEAD
-  Say Y here if you have more than one (supported) Matrox device in
-  your computer and you want to use all of them for different monitors
-  ("multihead"). If you have only one device, you should say N because
-  the driver compiled with Y is larger and a bit slower, especially on
-  ia32 (ix86).
-
-  If you said M to "Matrox unified accelerated driver" and N here, you
-  will still be able to use several Matrox devices simultaneously:
-  insert several instances of the module matroxfb.o into the kernel
-  with insmod, supplying the parameter "dev=N" where N is 0, 1, etc.
-  for the different Matrox devices. This method is slightly faster but
-  uses 40 KB of kernel memory per Matrox card.
-
-  There is no need for enabling 'Matrox multihead support' if you have
-  only one Matrox card in the box.
-
-3Dfx Voodoo Graphics / Voodoo2 frame buffer support
-CONFIG_FB_VOODOO1
-  Say Y here if you have a 3Dfx Voodoo Graphics (Voodoo1/sst1) or 
-  Voodoo2 (cvg) based graphics card.
-
-  This driver is also available as a module ( = code which can be 
-  inserted and removed from the running kernel whenever you want).
-  The module will be called sstfb.o. If you want to compile it as
-  a module, say M here and read Documentation/modules.txt.
-
-  WARNING: Do not use any application that uses the 3D engine
-  (namely glide) while using this driver.
-  Please read the file Documentation/fb/README-sstfb.txt for supported
-  options and other important info  support.
-
-MDA text console (dual-headed)
-CONFIG_MDA_CONSOLE
-  Say Y here if you have an old MDA or monochrome Hercules graphics
-  adapter in your system acting as a second head ( = video card). You
-  will then be able to use two monitors with your Linux system. Do not
-  say Y here if your MDA card is the primary card in your system; the
-  normal VGA driver will handle it.
-
-  This driver is also available as a module ( = code which can be
-  inserted and removed from the running kernel whenever you want).
-  The module will be called mdacon.o. If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-  If unsure, say N.
-
-SBUS and UPA framebuffers
-CONFIG_FB_SBUS
-  Say Y if you want support for SBUS or UPA based frame buffer device.
-
-Creator/Creator3D support
-CONFIG_FB_CREATOR
-  This is the frame buffer device driver for the Creator and Creator3D
-  graphics boards.
-
-CGsix (GX,TurboGX) support
-CONFIG_FB_CGSIX
-  This is the frame buffer device driver for the CGsix (GX, TurboGX)
-  frame buffer.
-
-BWtwo support
-CONFIG_FB_BWTWO
-  This is the frame buffer device driver for the BWtwo frame buffer.
-
-CGthree support
-CONFIG_FB_CGTHREE
-  This is the frame buffer device driver for the CGthree frame buffer.
-
-CGfourteen (SX) support
-CONFIG_FB_CGFOURTEEN
-  This is the frame buffer device driver for the CGfourteen frame
-  buffer on Desktop SPARCsystems with the SX graphics option.
-
-P9100 (Sparcbook 3 only) support
-CONFIG_FB_P9100
-  This is the frame buffer device driver for the P9100 card
-  supported on Sparcbook 3 machines.
-
-Leo (ZX) support
-CONFIG_FB_LEO
-  This is the frame buffer device driver for the SBUS-based Sun ZX
-  (leo) frame buffer cards.
-
-IGA 168x display support
-CONFIG_FB_IGA
-  This is the framebuffer device for the INTERGRAPHICS 1680 and
-  successor frame buffer cards.
-
-TCX (SS4/SS5 only) support
-CONFIG_FB_TCX
-  This is the frame buffer device driver for the TCX 24/8bit frame
-  buffer.
-
-HD64461 Frame Buffer support
-CONFIG_FB_HIT
-  This is the frame buffer device driver for the Hitachi HD64461 LCD
-  frame buffer card.
-
-SIS acceleration
-CONFIG_FB_SIS
-  This is the frame buffer device driver for the SiS 630 and 640 Super
-  Socket 7 UMA cards.  Specs available at <http://www.sis.com.tw/>.
-
-SIS 630/540/730 support
-CONFIG_FB_SIS_300
-  This is the frame buffer device driver for the SiS 630 and related
-  Super Socket 7 UMA cards.  Specs available at
-  <http://www.sis.com.tw/>.
-
-SIS 315H/315 support
-CONFIG_FB_SIS_315
-  This is the frame buffer device driver for the SiS 315 graphics
-  card.  Specs available at <http://www.sis.com.tw/>.
-
-IMS Twin Turbo display support
-CONFIG_FB_IMSTT
-  The IMS Twin Turbo is a PCI-based frame buffer card bundled with
-  many Macintosh and compatible computers.
-
-CONFIG_FB_TX3912
-  The TX3912 is a Toshiba RISC processor based on the MIPS 3900 core;
-  see <http://www.toshiba.com/taec/components/Generic/risc/tx3912.htm>.
-
-  Say Y here to enable kernel support for the on-board framebuffer.
-
-Virtual Frame Buffer support (ONLY FOR TESTING!)
-CONFIG_FB_VIRTUAL
-  This is a `virtual' frame buffer device. It operates on a chunk of
-  unswappable kernel memory instead of on the memory of a graphics
-  board. This means you cannot see any output sent to this frame
-  buffer device, while it does consume precious memory. The main use
-  of this frame buffer device is testing and debugging the frame
-  buffer subsystem. Do NOT enable it for normal systems! To protect
-  the innocent, it has to be enabled explicitly at boot time using the
-  kernel option `video=vfb:'.
-
-  This driver is also available as a module ( = code which can be
-  inserted and removed from the running kernel whenever you want). The
-  module will be called vfb.o. If you want to compile it as a module,
-  say M here and read <file:Documentation/modules.txt>.
-
-  If unsure, say N.
-
-Mach64 CT/VT/GT/LT (incl. 3D RAGE) support
-CONFIG_FB_ATY_CT
-  Say Y here to support use of ATI's 64-bit Rage boards (or other
-  boards based on the Mach64 CT, VT, GT, and LT chipsets) as a
-  framebuffer device.  The ATI product support page for these boards
-  is at <http://support.ati.com/products/pc/mach64/>.
-
-Sony Vaio Picturebook laptop LCD panel support
-CONFIG_FB_ATY_CT_VAIO_LCD
-  Say Y here if you want to use the full width of the Sony Vaio 
-  Picturebook laptops LCD panels (you will get a 128x30 console).
-
-  Note that you need to activate this mode using the 'vga=0x301'
-  option from your boot loader (lilo or loadlin).  See the
-  documentation of your boot loader about how to pass options to the
-  kernel.
-  
-Mach64 GX support
-CONFIG_FB_ATY_GX
-  Say Y here to support use of the ATI Mach64 Graphics Expression
-  board (or other boards based on the Mach64 GX chipset) as a
-  framebuffer device.  The ATI product support page for these boards
-  is at
-  <http://support.ati.com/products/pc/mach64/graphics_xpression.html>.
-
-ATI Radeon display support
-CONFIG_FB_RADEON
-  Choose this option if you want to use an ATI Radeon graphics card as
-  a framebuffer device.  There are both PCI and AGP versions.  You
-  don't need to choose this to run the Radeon in plain VGA mode.
-  There is a product page at
-  <http://www.ati.com/na/pages/products/pc/radeon32/index.html>.
-
-SA-1100 LCD support
-CONFIG_FB_SA1100
-  This is a framebuffer device for the SA-1100 LCD Controller.
-  See <http://www.linux-fbdev.org/> for information on framebuffer
-  devices.
-
-  If you plan to use the LCD display with your SA-1100 system, say
-  Y here.
-
-Advanced low level driver options
-CONFIG_FBCON_ADVANCED
-  The frame buffer console uses character drawing routines that are
-  tailored to the specific organization of pixels in the memory of
-  your graphics hardware. These are called the low level frame buffer
-  console drivers. Note that they are used for text console output
-  only; they are NOT needed for graphical applications.
-
-  If you say N here, the needed low level drivers are automatically
-  enabled, depending on what frame buffer devices you selected above.
-  This is recommended for most users.
-
-  If you say Y here, you have more fine-grained control over which low
-  level drivers are enabled. You can e.g. leave out low level drivers
-  for color depths you do not intend to use for text consoles.
-
-  Low level frame buffer console drivers can be modules ( = code which
-  can be inserted and removed from the running kernel whenever you
-  want). The modules will be called fbcon-*.o. If you want to compile
-  (some of) them as modules, read <file:Documentation/modules.txt>.
-
-  If unsure, say N.
-
-Monochrome support
-CONFIG_FBCON_MFB
-  This is the low level frame buffer console driver for monochrome
-  (2 colors) packed pixels.
-
-2 bpp packed pixels support
-CONFIG_FBCON_CFB2
-  This is the low level frame buffer console driver for 2 bits per
-  pixel (4 colors) packed pixels.
-
-4 bpp packed pixels support
-CONFIG_FBCON_CFB4
-  This is the low level frame buffer console driver for 4 bits per
-  pixel (16 colors) packed pixels.
-
-8 bpp packed pixels support
-CONFIG_FBCON_CFB8
-  This is the low level frame buffer console driver for 8 bits per
-  pixel (256 colors) packed pixels.
-
-16 bpp packed pixels support
-CONFIG_FBCON_CFB16
-  This is the low level frame buffer console driver for 15 or 16 bits
-  per pixel (32K or 64K colors, also known as `hicolor') packed
-  pixels.
-
-24 bpp packed pixels support
-CONFIG_FBCON_CFB24
-  This is the low level frame buffer console driver for 24 bits per
-  pixel (16M colors, also known as `truecolor') packed pixels. It is
-  NOT for `sparse' 32 bits per pixel mode.
-
-32 bpp packed pixels support
-CONFIG_FBCON_CFB32
-  This is the low level frame buffer console driver for 32 bits per
-  pixel (16M colors, also known as `truecolor') sparse packed pixels.
-
-Amiga bitplanes support
-CONFIG_FBCON_AFB
-  This is the low level frame buffer console driver for 1 to 8
-  bitplanes (2 to 256 colors) on Amiga.
-
-Amiga interleaved bitplanes support
-CONFIG_FBCON_ILBM
-  This is the low level frame buffer console driver for 1 to 8
-  interleaved bitplanes (2 to 256 colors) on Amiga.
-
-Atari interleaved bitplanes (2 planes) support
-CONFIG_FBCON_IPLAN2P2
-  This is the low level frame buffer console driver for 2 interleaved
-  bitplanes (4 colors) on Atari.
-
-Atari interleaved bitplanes (4 planes) support
-CONFIG_FBCON_IPLAN2P4
-  This is the low level frame buffer console driver for 4 interleaved
-  bitplanes (16 colors) on Atari.
-
-Atari interleaved bitplanes (8 planes) support
-CONFIG_FBCON_IPLAN2P8
-  This is the low level frame buffer console driver for 8 interleaved
-  bitplanes (256 colors) on Atari.
-
-Mac variable bpp packed pixels support
-CONFIG_FBCON_MAC
-  This is the low level frame buffer console driver for 1/2/4/8/16/32
-  bits per pixel packed pixels on Mac. It supports variable font
-  widths for low resolution screens.
-
-Permedia3 support (EXPERIMENTAL)
-CONFIG_FB_PM3
-  This is the frame buffer device driver for the 3DLabs Permedia3
-  chipset, used in Formac ProFormance III, 3DLabs Oxygen VX1 &
-  similar boards, 3DLabs Permedia3 Create!, Appian Jeronimo 2000
-  and maybe other boards.
-
-HGA monochrome support
-CONFIG_FBCON_HGA
-  This is the low level frame buffer console driver for Hercules mono
-  graphics cards.
-
-VGA characters/attributes support
-CONFIG_FBCON_VGA
-  This is the low level frame buffer console driver for VGA text mode;
-  it is used by frame buffer device drivers that support VGA text
-  mode.
-
-Parallel-port support
-CONFIG_PARPORT
-  If you want to use devices connected to your machine's parallel port
-  (the connector at the computer with 25 holes), e.g. printer, ZIP
-  drive, PLIP link (Parallel Line Internet Protocol is mainly used to
-  create a mini network by connecting the parallel ports of two local
-  machines) etc., then you need to say Y here; please read
-  <file:Documentation/parport.txt> and
-  <file:drivers/parport/BUGS-parport>.
-
-  For extensive information about drivers for many devices attaching
-  to the parallel port see <http://www.torque.net/linux-pp.html> on
-  the WWW.
-
-  It is possible to share a single parallel port among several devices
-  and it is safe to compile all the corresponding drivers into the
-  kernel.  If you want to compile parallel port support as a module
-  ( = code which can be inserted in and removed from the running
-  kernel whenever you want), say M here and read
-  <file:Documentation/modules.txt>.  The module will be called
-  parport.o.  If you have more than one parallel port and want to
-  specify which port and IRQ to be used by this driver at module load
-  time, take a look at <file:Documentation/parport.txt>.
-
-  If unsure, say Y.
-
-PC-style hardware
-CONFIG_PARPORT_PC
-  You should say Y here if you have a PC-style parallel port. All IBM
-  PC compatible computers and some Alphas have PC-style parallel
-  ports.
-
-  This code is also available as a module.  If you want to compile it
-  as a module ( = code which can be inserted in and removed from the
-  running kernel whenever you want), say M here and read
-  <file:Documentation/modules.txt>.  The module will be called
-  parport_pc.o.
-
-  If unsure, say Y.
-
-Parallel+serial PCI multi-IO card support
-CONFIG_PARPORT_SERIAL
-  This adds support for multi-IO PCI cards that have parallel and
-  serial ports.  You should say Y or M here.  If you say M, the module
-  will be called parport_serial.o.
-
-Use FIFO/DMA if available
-CONFIG_PARPORT_PC_FIFO
-  Many parallel port chipsets provide hardware that can speed up
-  printing. Say Y here if you want to take advantage of that.
-
-  As well as actually having a FIFO, or DMA capability, the kernel
-  will need to know which IRQ the parallel port has.  By default,
-  parallel port interrupts will not be used, and so neither will the
-  FIFO.  See <file:Documentation/parport.txt> to find out how to
-  specify which IRQ/DMA to use.
-
-SuperIO chipset support
-CONFIG_PARPORT_PC_SUPERIO
-  Saying Y here enables some probes for Super-IO chipsets in order to
-  find out things like base addresses, IRQ lines and DMA channels.  It
-  is safe to say N.
-
-Support for PCMCIA management for PC-style ports
-CONFIG_PARPORT_PC_PCMCIA
-  Say Y here if you need PCMCIA support for your PC-style parallel
-  ports. If unsure, say N.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  parport_cs.o
-
-Support foreign hardware
-CONFIG_PARPORT_OTHER
-  Say Y here if you want to be able to load driver modules to support
-  other non-standard types of parallel ports. This causes a
-  performance loss, so most people say N.
-
-Amiga built-in parallel port support
-CONFIG_PARPORT_AMIGA
-  Say Y here if you need support for the parallel port hardware on
-  Amiga machines. This code is also available as a module (say M),
-  called parport_amiga.o. If in doubt, saying N is the safe plan.
-
-Atari built-in parallel port support
-CONFIG_PARPORT_ATARI
-  Say Y here if you need support for the parallel port hardware on
-  Atari machines. This code is also available as a module (say M),
-  called parport_atari.o. If in doubt, saying N is the safe plan.
-
-Multiface III parallel port support
-CONFIG_PARPORT_MFC3
-  Say Y here if you need parallel port support for the MFC3 card.
-  This code is also available as a module (say M), called
-  parport_mfc3.o. If in doubt, saying N is the safe plan.
-
-Support IEEE 1284 status readback
-CONFIG_PRINTER_READBACK
-  If you have a device on your parallel port that support this
-  protocol, this option will allow the device to report its status. It
-  is safe to say Y.
-
-IEEE 1284 transfer modes
-CONFIG_PARPORT_1284
-  If you have a printer that supports status readback or device ID, or
-  want to use a device that uses enhanced parallel port transfer modes
-  such as EPP and ECP, say Y here to enable advanced IEEE 1284
-  transfer modes. Also say Y if you want device ID information to
-  appear in /proc/sys/dev/parport/*/autoprobe*. It is safe to say N.
-
-Enable loadable module support
-CONFIG_MODULES
-  Kernel modules are small pieces of compiled code which can be
-  inserted in or removed from the running kernel, using the programs
-  insmod and rmmod. This is described in the file
-  <file:Documentation/modules.txt>, including the fact that you have
-  to say "make modules" in order to compile the modules that you chose
-  during kernel configuration.  Modules can be device drivers, file
-  systems, binary executable formats, and so on. If you think that you
-  may want to make use of modules with this kernel in the future, then
-  say Y here.  If unsure, say Y.
-
-Set version information on all symbols for modules
-CONFIG_MODVERSIONS
-  Usually, modules have to be recompiled whenever you switch to a new
-  kernel.  Saying Y here makes it possible, and safe, to use the
-  same modules even after compiling a new kernel; this requires the
-  program modprobe. All the software needed for module support is in
-  the modutils package (check the file <file:Documentation/Changes>
-  for location and latest version).  NOTE: if you say Y here but don't
-  have the program genksyms (which is also contained in the above
-  mentioned modutils package), then the building of your kernel will
-  fail.  If you are going to use modules that are generated from
-  non-kernel sources, you would benefit from this option.  Otherwise
-  it's not that important.  So, N ought to be a safe bet.
-
-Kernel module loader support
-CONFIG_KMOD
-  Normally when you have selected some drivers and/or file systems to
-  be created as loadable modules, you also have the responsibility to
-  load the corresponding modules (using the programs insmod or
-  modprobe) before you can use them. If you say Y here however, the
-  kernel will be able to load modules for itself: when a part of the
-  kernel needs a module, it runs modprobe with the appropriate
-  arguments, thereby loading the module if it is available. (This is a
-  replacement for kerneld.) Say Y here and read about configuring it
-  in <file:Documentation/kmod.txt>.
-
-ARP daemon support
-CONFIG_ARPD
-  Normally, the kernel maintains an internal cache which maps IP
-  addresses to hardware addresses on the local network, so that
-  Ethernet/Token Ring/ etc. frames are sent to the proper address on
-  the physical networking layer. For small networks having a few
-  hundred directly connected hosts or less, keeping this address
-  resolution (ARP) cache inside the kernel works well. However,
-  maintaining an internal ARP cache does not work well for very large
-  switched networks, and will use a lot of kernel memory if TCP/IP
-  connections are made to many machines on the network.
-
-  If you say Y here, the kernel's internal ARP cache will never grow
-  to more than 256 entries (the oldest entries are expired in a LIFO
-  manner) and communication will be attempted with the user space ARP
-  daemon arpd. Arpd then answers the address resolution request either
-  from its own cache or by asking the net.
-
-  This code is experimental and also obsolete. If you want to use it,
-  you need to find a version of the daemon arpd on the net somewhere,
-  and you should also say Y to "Kernel/User network link driver",
-  below. If unsure, say N.
-
-TCP/IP networking
-CONFIG_INET
-  These are the protocols used on the Internet and on most local
-  Ethernets. It is highly recommended to say Y here (this will enlarge
-  your kernel by about 144 KB), since some programs (e.g. the X window
-  system) use TCP/IP even if your machine is not connected to any
-  other computer. You will get the so-called loopback device which
-  allows you to ping yourself (great fun, that!).
-
-  For an excellent introduction to Linux networking, please read the
-  NET-3-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This option is also necessary if you want to use the full power of
-  term (term is a program which gives you almost full Internet
-  connectivity if you have a regular dial up shell account on some
-  Internet connected Unix computer; for more information, read
-  <http://www.bart.nl/~patrickr/term-howto/Term-HOWTO.html>).
-
-  If you say Y here and also to "/proc file system support" and
-  "Sysctl support" below, you can change various aspects of the
-  behaviour of the TCP/IP code by writing to the (virtual) files in
-  /proc/sys/net/ipv4/*; the options are explained in the file
-  <file:Documentation/networking/ip-sysctl.txt>.
-
-  Short answer: say Y.
-
-IP multicasting
-CONFIG_IP_MULTICAST
-  This is code for addressing several networked computers at once,
-  enlarging your kernel by about 2 KB. You need multicasting if you
-  intend to participate in the MBONE, a high bandwidth network on top
-  of the Internet which carries audio and video broadcasts. More
-  information about the MBONE is on the WWW at
-  <http://www-itg.lbl.gov/mbone/>. Information about the multicast
-  capabilities of the various network cards is contained in
-  <file:Documentation/networking/multicast.txt>. For most people, it's
-  safe to say N.
-
-Advanced router
-CONFIG_IP_ADVANCED_ROUTER
-  If you intend to run your Linux box mostly as a router, i.e. as a
-  computer that forwards and redistributes network packets, say Y; you
-  will then be presented with several options that allow more precise
-  control about the routing process.
-
-  The answer to this question won't directly affect the kernel:
-  answering N will just cause the configurator to skip all the
-  questions about advanced routing.
-
-  Note that your box can only act as a router if you enable IP
-  forwarding in your kernel; you can do that by saying Y to "/proc
-  file system support" and "Sysctl support" below and executing the
-  line
-
-    echo "1" > /proc/sys/net/ipv4/ip_forward
-
-  at boot time after the /proc file system has been mounted.
-
-  If you turn on IP forwarding, you will also get the rp_filter, which
-  automatically rejects incoming packets if the routing table entry
-  for their source address doesn't match the network interface they're
-  arriving on. This has security advantages because it prevents the
-  so-called IP spoofing, however it can pose problems if you use
-  asymmetric routing (packets from you to a host take a different path
-  than packets from that host to you) or if you operate a non-routing
-  host which has several IP addresses on different interfaces. To turn
-  rp_filter off use:
-
-        echo 0 > /proc/sys/net/ipv4/conf/<device>/rp_filter
-  or
-        echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
-
-  If unsure, say N here.
-
-Policy routing
-CONFIG_IP_MULTIPLE_TABLES
-  Normally, a router decides what to do with a received packet based
-  solely on the packet's final destination address. If you say Y here,
-  the Linux router will also be able to take the packet's source
-  address into account. Furthermore, if you also say Y to "Use TOS
-  value as routing key" below, the TOS (Type-Of-Service) field of the
-  packet can be used for routing decisions as well. In addition, if
-  you say Y here and to "Fast network address translation" below,
-  the router will also be able to modify source and destination
-  addresses of forwarded packets.
-
-  If you are interested in this, please see the preliminary
-  documentation at <http://www.compendium.com.ar/policy-routing.txt>
-  and <ftp://post.tepkom.ru/pub/vol2/Linux/docs/advanced-routing.tex>.
-  You will need supporting software from
-  <ftp://ftp.inr.ac.ru/ip-routing/>.
-
-  If unsure, say N.
-
-Equal cost multipath
-CONFIG_IP_ROUTE_MULTIPATH
-  Normally, the routing tables specify a single action to be taken in
-  a deterministic manner for a given packet. If you say Y here
-  however, it becomes possible to attach several actions to a packet
-  pattern, in effect specifying several alternative paths to travel
-  for those packets. The router considers all these paths to be of
-  equal "cost" and chooses one of them in a non-deterministic fashion
-  if a matching packet arrives.
-
-Use TOS value as routing key
-CONFIG_IP_ROUTE_TOS
-  The header of every IP packet carries a TOS (Type Of Service) value
-  with which the packet requests a certain treatment, e.g. low
-  latency (for interactive traffic), high throughput, or high
-  reliability.  If you say Y here, you will be able to specify
-  different routes for packets with different TOS values.
-
-Use netfilter MARK value as routing key
-CONFIG_IP_ROUTE_FWMARK
-  If you say Y here, you will be able to specify different routes for
-  packets with different mark values (see iptables(8), MARK target).
-
-Verbose route monitoring
-CONFIG_IP_ROUTE_VERBOSE
-  If you say Y here, which is recommended, then the kernel will print
-  verbose messages regarding the routing, for example warnings about
-  received packets which look strange and could be evidence of an
-  attack or a misconfigured system somewhere. The information is
-  handled by the klogd daemon which is responsible for kernel messages
-  ("man klogd").
-
-Large routing tables
-CONFIG_IP_ROUTE_LARGE_TABLES
-  If you have routing zones that grow to more than about 64 entries,
-  you may want to say Y here to speed up the routing process.
-
-Fast network address translation
-CONFIG_IP_ROUTE_NAT
-  If you say Y here, your router will be able to modify source and
-  destination addresses of packets that pass through it, in a manner
-  you specify.  General information about Network Address Translation
-  can be gotten from the document
-  <http://www.csn.tu-chemnitz.de/~mha/linux-ip-nat/diplom/nat.html>.
-
-Kernel level IP autoconfiguration
-CONFIG_IP_PNP
-  This enables automatic configuration of IP addresses of devices and
-  of the routing table during kernel boot, based on either information
-  supplied on the kernel command line or by BOOTP or RARP protocols.
-  You need to say Y only for diskless machines requiring network
-  access to boot (in which case you want to say Y to "Root file system
-  on NFS" as well), because all other machines configure the network
-  in their startup scripts.
-
-BOOTP support
-CONFIG_IP_PNP_BOOTP
-  If you want your Linux box to mount its whole root file system (the
-  one containing the directory /) from some other computer over the
-  net via NFS and you want the IP address of your computer to be
-  discovered automatically at boot time using the BOOTP protocol (a
-  special protocol designed for doing this job), say Y here. In case
-  the boot ROM of your network card was designed for booting Linux and
-  does BOOTP itself, providing all necessary information on the kernel
-  command line, you can say N here. If unsure, say Y. Note that if you
-  want to use BOOTP, a BOOTP server must be operating on your network.
-  Read <file:Documentation/nfsroot.txt> for details.
-
-DHCP support
-CONFIG_IP_PNP_DHCP
-  If you want your Linux box to mount its whole root file system (the
-  one containing the directory /) from some other computer over the
-  net via NFS and you want the IP address of your computer to be
-  discovered automatically at boot time using the DHCP protocol (a
-  special protocol designed for doing this job), say Y here. In case
-  the boot ROM of your network card was designed for booting Linux and
-  does DHCP itself, providing all necessary information on the kernel
-  command line, you can say N here.
-
-  If unsure, say Y. Note that if you want to use DHCP, a DHCP server
-  must be operating on your network.  Read
-  <file:Documentation/nfsroot.txt> for details.
-
-RARP support
-CONFIG_IP_PNP_RARP
-  If you want your Linux box to mount its whole root file system (the
-  one containing the directory /) from some other computer over the
-  net via NFS and you want the IP address of your computer to be
-  discovered automatically at boot time using the RARP protocol (an
-  older protocol which is being obsoleted by BOOTP and DHCP), say Y
-  here. Note that if you want to use RARP, a RARP server must be
-  operating on your network. Read <file:Documentation/nfsroot.txt> for
-  details.
-
-IP tunneling
-CONFIG_NET_IPIP
-  Tunneling means encapsulating data of one protocol type within
-  another protocol and sending it over a channel that understands the
-  encapsulating protocol. This particular tunneling driver implements
-  encapsulation of IP within IP, which sounds kind of pointless, but
-  can be useful if you want to make your (or some other) machine
-  appear on a different network than it physically is, or to use
-  mobile-IP facilities (allowing laptops to seamlessly move between
-  networks without changing their IP addresses; check out
-  <http://anchor.cs.binghamton.edu/~mobileip/LJ/index.html>).
-
-  Saying Y to this option will produce two modules ( = code which can
-  be inserted in and removed from the running kernel whenever you
-  want). Most people won't need this and can say N.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  ipip.o
-
-GRE tunnels over IP
-CONFIG_NET_IPGRE
-  Tunneling means encapsulating data of one protocol type within
-  another protocol and sending it over a channel that understands the
-  encapsulating protocol. This particular tunneling driver implements
-  GRE (Generic Routing Encapsulation) and at this time allows
-  encapsulating of IPv4 or IPv6 over existing IPv4 infrastructure.
-  This driver is useful if the other endpoint is a Cisco router: Cisco
-  likes GRE much better than the other Linux tunneling driver ("IP
-  tunneling" above). In addition, GRE allows multicast redistribution
-  through the tunnel.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  ip_gre.o
-
-Broadcast GRE over IP
-CONFIG_NET_IPGRE_BROADCAST
-  One application of GRE/IP is to construct a broadcast WAN (Wide Area
-  Network), which looks like a normal Ethernet LAN (Local Area
-  Network), but can be distributed all over the Internet. If you want
-  to do that, say Y here and to "IP multicast routing" below.
-
-IP multicast routing
-CONFIG_IP_MROUTE
-  This is used if you want your machine to act as a router for IP
-  packets that have several destination addresses. It is needed on the
-  MBONE, a high bandwidth network on top of the Internet which carries
-  audio and video broadcasts. In order to do that, you would most
-  likely run the program mrouted. Information about the multicast
-  capabilities of the various network cards is contained in
-  <file:Documentation/networking/multicast.txt>. If you haven't heard
-  about it, you don't need it.
-
-PIM-SM version 1 support
-CONFIG_IP_PIMSM_V1
-  Kernel side support for Sparse Mode PIM (Protocol Independent
-  Multicast) version 1. This multicast routing protocol is used widely
-  because Cisco supports it. You need special software to use it
-  (pimd-v1). Please see <http://netweb.usc.edu/pim/> for more
-  information about PIM.
-
-  Say Y if you want to use PIM-SM v1. Note that you can say N here if
-  you just want to use Dense Mode PIM.
-
-PIM-SM version 2 support
-CONFIG_IP_PIMSM_V2
-  Kernel side support for Sparse Mode PIM version 2. In order to use
-  this, you need an experimental routing daemon supporting it (pimd or
-  gated-5). This routing protocol is not used widely, so say N unless
-  you want to play with it.
-
-Unix domain sockets
-CONFIG_UNIX
-  If you say Y here, you will include support for Unix domain sockets;
-  sockets are the standard Unix mechanism for establishing and
-  accessing network connections.  Many commonly used programs such as
-  the X Window system and syslog use these sockets even if your
-  machine is not connected to any network.  Unless you are working on
-  an embedded system or something similar, you therefore definitely
-  want to say Y here.
-
-  However, the socket support is also available as a module ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want).  If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>. The module will be
-  called unix.o.  If you try building this as a module and you have
-  said Y to "Kernel module loader support" above, be sure to add
-  'alias net-pf-1 unix' to your /etc/modules.conf file. Note that
-  several important services won't work correctly if you say M here
-  and then neglect to load the module.
-
-  Say Y unless you know what you are doing.
-
-The IPv6 protocol
-CONFIG_IPV6
-  This is experimental support for the next version of the Internet
-  Protocol: IP version 6 (also called IPng "IP next generation").
-  Features of this new protocol include: expanded address space,
-  authentication and privacy, and seamless interoperability with the
-  current version of IP (IP version 4). For general information about
-  IPv6, see <http://playground.sun.com/pub/ipng/html/ipng-main.html>;
-  for specific information about IPv6 under Linux read the HOWTO at
-  <http://www.bieringer.de/linux/IPv6/> and the file net/ipv6/README
-  in the kernel source.
-
-  If you want to use IPv6, please upgrade to the newest net-tools as
-  given in <file:Documentation/Changes>. You will still be able to do
-  regular IPv4 networking as well.
-
-  This protocol support is also available as a module ( = code which
-  can be inserted in and removed from the running kernel whenever you
-  want). The module will be called ipv6.o. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-  It is safe to say N here for now.
-
-Kernel httpd acceleration
-CONFIG_KHTTPD
-  The kernel httpd acceleration daemon (kHTTPd) is a (limited) web
-  server built into the kernel. It is limited since it can only serve
-  files from the file system and cannot deal with executable content
-  such as CGI scripts. Serving files is sped up if you use kHTTPd.
-  If kHTTPd is not able to fulfill a request, it can transparently
-  pass it through to a user space web server such as apache.
-
-  Saying "M" here builds the kHTTPd module; this is NOT enough to have
-  a working kHTTPd. For safety reasons, the module has to be activated
-  by doing a "echo 1 > /proc/sys/net/khttpd/start" after inserting the
-  module.
-
-  Before using this, read the README in net/khttpd !
-
-  The kHTTPd is experimental. Be careful when using it on a production
-  machine. Also note that kHTTPd doesn't support virtual servers yet.
-
-The IPX protocol
-CONFIG_IPX
-  This is support for the Novell networking protocol, IPX, commonly
-  used for local networks of Windows machines.  You need it if you
-  want to access Novell NetWare file or print servers using the Linux
-  Novell client ncpfs (available from
-  <ftp://platan.vc.cvut.cz/pub/linux/ncpfs/>) or from
-  within the Linux DOS emulator DOSEMU (read the DOSEMU-HOWTO,
-  available from <http://www.tldp.org/docs.html#howto>).  In order
-  to do the former, you'll also have to say Y to "NCP file system
-  support", below.
-
-  IPX is similar in scope to IP, while SPX, which runs on top of IPX,
-  is similar to TCP. There is also experimental support for SPX in
-  Linux (see "SPX networking", below).
-
-  To turn your Linux box into a fully featured NetWare file server and
-  IPX router, say Y here and fetch either lwared from
-  <ftp://ibiblio.org/pub/Linux/system/network/daemons/> or
-  mars_nwe from <ftp://www.compu-art.de/mars_nwe/>. For more
-  information, read the IPX-HOWTO available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  General information about how to connect Linux, Windows machines and
-  Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>.
-
-  The IPX driver would enlarge your kernel by about 16 KB. This driver
-  is also available as a module ( = code which can be inserted in and
-  removed from the running kernel whenever you want).  The module will
-  be called ipx.o.  If you want to compile it as a module, say M here
-  and read <file:Documentation/modules.txt>.  Unless you want to
-  integrate your Linux box with a local Novell network, say N.
-
-Full internal IPX network
-CONFIG_IPX_INTERN
-  Every IPX network has an address that identifies it. Sometimes it is
-  useful to give an IPX "network" address to your Linux box as well
-  (for example if your box is acting as a file server for different
-  IPX networks: it will then be accessible from everywhere using the
-  same address). The way this is done is to create a virtual internal
-  "network" inside your box and to assign an IPX address to this
-  network. Say Y here if you want to do this; read the IPX-HOWTO at
-  <http://www.tldp.org/docs.html#howto> for details.
-
-  The full internal IPX network enables you to allocate sockets on
-  different virtual nodes of the internal network. This is done by
-  evaluating the field sipx_node of the socket address given to the
-  bind call. So applications should always initialize the node field
-  to 0 when binding a socket on the primary network. In this case the
-  socket is assigned the default node that has been given to the
-  kernel when the internal network was created. By enabling the full
-  internal IPX network the cross-forwarding of packets targeted at
-  'special' sockets to sockets listening on the primary network is
-  disabled. This might break existing applications, especially RIP/SAP
-  daemons. A RIP/SAP daemon that works well with the full internal net
-  can be found on <ftp://ftp.gwdg.de/pub/linux/misc/ncpfs/>.
-
-  If you don't know what you are doing, say N.
-
-#(We're told this will come back someday)
-
-SPX networking
-CONFIG_SPX
-  * Orphaned entry retained 20 April 2001 by Petr Vandrovec     *
-  * If you read this note from the configurator, please contact *
-  * the Configure.help maintainers.                             *
-  The Sequenced Packet eXchange protocol is a transport layer protocol
-  built on top of IPX. It is used in Novell NetWare systems for
-  client-server applications and is similar to TCP (which runs on top
-  of IP).
-
-  Note that Novell NetWare file sharing does not use SPX; it uses a
-  protocol called NCP, for which separate Linux support is available
-  ("NCP file system support" below for the client side, and the user
-  space programs lwared or mars_nwe for the server side).
-
-  Say Y here if you have use for SPX; read the IPX-HOWTO at
-  <http://www.tldp.org/docs.html#howto> for details.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called af_spx.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-DECnet networking
-CONFIG_DECNET
-  The DECnet networking protocol was used in many products made by
-  Digital (now Compaq).  It provides reliable stream and sequenced
-  packet communications over which run a variety of services similar
-  to those which run over TCP/IP.
-
-  To find some tools to use with the kernel layer support, please
-  look at Patrick Caulfield's web site:
-  <http://linux.dreamtime.org/decnet/>.
-
-  More detailed documentation is available in
-  <file:Documentation/networking/decnet.txt>.
-
-  Be sure to say Y to "/proc file system support" and "Sysctl support"
-  below when using DECnet, since you will need sysctl support to aid
-  in configuration at run time.
-
-  The DECnet code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module is called decnet.o.
-
-DECnet SIOCFIGCONF support
-CONFIG_DECNET_SIOCGIFCONF
-  This option should only be turned on if you are really sure that
-  you know what you are doing. It can break other applications which
-  use this system call and the proper way to get the information
-  provided by this call is to use rtnetlink.
-
-  If unsure, say N.
-
-DECnet router support
-CONFIG_DECNET_ROUTER
-  Add support for turning your DECnet Endnode into a level 1 or 2
-  router.  This is an unfinished option for developers only.  If you
-  do say Y here, then make sure that you also say Y to "Kernel/User
-  network link driver", "Routing messages" and "Network packet
-  filtering".  The first two are required to allow configuration via
-  rtnetlink (currently you need Alexey Kuznetsov's iproute2 package
-  from <ftp://ftp.inr.ac.ru/>). The "Network packet filtering" option
-  will be required for the forthcoming routing daemon to work.
-
-  See <file:Documentation/networking/decnet.txt> for more information.
-
-Use FWMARK value as DECnet routing key
-CONFIG_DECNET_ROUTE_FWMARK
-  If you say Y here, you will be able to specify different routes for
-  packets with different FWMARK ("firewalling mark") values
-  (see ipchains(8), "-m" argument).
-
-AppleTalk interfaces support
-CONFIG_DEV_APPLETALK
-  AppleTalk is the protocol that Apple computers can use to communicate
-  on a network.  If your Linux box is connected to such a network, and wish
-  to do IP over it, or you have a LocalTalk card and wish to use it to
-  connect to the AppleTalk network, say Y.
-
-AppleTalk protocol support
-CONFIG_ATALK
-  AppleTalk is the protocol that Apple computers can use to communicate
-  on a network.  If your Linux box is connected to such a network and you
-  wish to connect to it, say Y.  You will need to use the netatalk package
-  so that your Linux box can act as a print and file server for Macs as
-  well as access AppleTalk printers.  Check out
-  <http://www.zettabyte.net/netatalk/> on the WWW for details.
-  EtherTalk is the name used for AppleTalk over Ethernet and the
-  cheaper and slower LocalTalk is AppleTalk over a proprietary Apple
-  network using serial links.  EtherTalk and LocalTalk are fully
-  supported by Linux.
-
-  General information about how to connect Linux, Windows machines and
-  Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>.  The
-  NET-3-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>, contains valuable
-  information as well.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module is called appletalk.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.  You
-  almost certainly want to compile it as a module so you can restart
-  your AppleTalk stack without rebooting your machine.  I hear that
-  the GNU boycott of Apple is over, so even politically correct people
-  are allowed to say Y here.
-
-AppleTalk-IP driver support
-CONFIG_IPDDP
-  This allows IP networking for users who only have AppleTalk
-  networking available. This feature is experimental. With this
-  driver, you can encapsulate IP inside AppleTalk (e.g. if your Linux
-  box is stuck on an AppleTalk only network) or decapsulate (e.g. if
-  you want your Linux box to act as an Internet gateway for a zoo of
-  AppleTalk connected Macs). Please see the file
-  <file:Documentation/networking/ipddp.txt> for more information.
-
-  If you say Y here, the AppleTalk-IP support will be compiled into
-  the kernel. In this case, you can either use encapsulation or
-  decapsulation, but not both. With the following two questions, you
-  decide which one you want.
-
-  If you say M here, the AppleTalk-IP support will be compiled as a
-  module ( = code which can be inserted in and removed from the
-  running kernel whenever you want, read
-  <file:Documentation/modules.txt>).  The module is called ipddp.o.
-  In this case, you will be able to use both encapsulation and
-  decapsulation simultaneously, by loading two copies of the module
-  and specifying different values for the module option ipddp_mode.
-
-IP to AppleTalk-IP Encapsulation support
-CONFIG_IPDDP_ENCAP
-  If you say Y here, the AppleTalk-IP code will be able to encapsulate
-  IP packets inside AppleTalk frames; this is useful if your Linux box
-  is stuck on an AppleTalk network (which hopefully contains a
-  decapsulator somewhere). Please see
-  <file:Documentation/networking/ipddp.txt> for more information. If
-  you said Y to "AppleTalk-IP driver support" above and you say Y
-  here, then you cannot say Y to "AppleTalk-IP to IP Decapsulation
-  support", below.
-
-AppleTalk-IP to IP Decapsulation support
-CONFIG_IPDDP_DECAP
-  If you say Y here, the AppleTalk-IP code will be able to decapsulate
-  AppleTalk-IP frames to IP packets; this is useful if you want your
-  Linux box to act as an Internet gateway for an AppleTalk network.
-  Please see <file:Documentation/networking/ipddp.txt> for more
-  information.  If you said Y to "AppleTalk-IP driver support" above
-  and you say Y here, then you cannot say Y to "IP to AppleTalk-IP
-  Encapsulation support", above.
-
-Apple/Farallon LocalTalk PC card support
-CONFIG_LTPC
-  This allows you to use the AppleTalk PC card to connect to LocalTalk
-  networks. The card is also known as the Farallon PhoneNet PC card.
-  If you are in doubt, this card is the one with the 65C02 chip on it.
-  You also need version 1.3.3 or later of the netatalk package.
-  This driver is experimental, which means that it may not work.
-  See the file <file:Documentation/networking/ltpc.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  ltpc.o
-
-COPS LocalTalk PC card support
-CONFIG_COPS
-  This allows you to use COPS AppleTalk cards to connect to LocalTalk
-  networks. You also need version 1.3.3 or later of the netatalk
-  package. This driver is experimental, which means that it may not
-  work. This driver will only work if you choose "AppleTalk DDP"
-  networking support, above.
-  Please read the file <file:Documentation/networking/cops.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  cops.o
-
-Dayna firmware support
-CONFIG_COPS_DAYNA
-  Support COPS compatible cards with Dayna style firmware (Dayna
-  DL2000/ Daynatalk/PC (half length), COPS LT-95, Farallon PhoneNET PC
-  III, Farallon PhoneNET PC II).
-
-Tangent firmware support
-CONFIG_COPS_TANGENT
-  Support COPS compatible cards with Tangent style firmware (Tangent
-  ATB_II, Novell NL-1000, Daystar Digital LT-200.
-
-Amateur Radio support
-CONFIG_HAMRADIO
-  If you want to connect your Linux box to an amateur radio, answer Y
-  here. You want to read <http://www.tapr.org/tapr/html/pkthome.html> and
-  the AX25-HOWTO, available from <http://www.tldp.org/docs.html#howto>.
-
-  Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause the configurator to skip all
-  the questions about amateur radio.
-
-Amateur Radio AX.25 Level 2 protocol
-CONFIG_AX25
-  This is the protocol used for computer communication over amateur
-  radio. It is either used by itself for point-to-point links, or to
-  carry other protocols such as tcp/ip. To use it, you need a device
-  that connects your Linux box to your amateur radio. You can either
-  use a low speed TNC (a Terminal Node Controller acts as a kind of
-  modem connecting your computer's serial port to your radio's
-  microphone input and speaker output) supporting the KISS protocol or
-  one of the various SCC cards that are supported by the generic Z8530
-  or the DMA SCC driver. Another option are the Baycom modem serial
-  and parallel port hacks or the sound card modem (supported by their
-  own drivers). If you say Y here, you also have to say Y to one of
-  those drivers.
-
-  Information about where to get supporting software for Linux amateur
-  radio as well as information about how to configure an AX.25 port is
-  contained in the AX25-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>. You might also want to
-  check out the file <file:Documentation/networking/ax25.txt> in the
-  kernel source. More information about digital amateur radio in
-  general is on the WWW at
-  <http://www.tapr.org/tapr/html/pkthome.html>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ax25.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-AX.25 DAMA Slave support
-CONFIG_AX25_DAMA_SLAVE
-  DAMA is a mechanism to prevent collisions when doing AX.25
-  networking. A DAMA server (called "master") accepts incoming traffic
-  from clients (called "slaves") and redistributes it to other slaves.
-  If you say Y here, your Linux box will act as a DAMA slave; this is
-  transparent in that you don't have to do any special DAMA
-  configuration. (Linux cannot yet act as a DAMA server.) If unsure,
-  say N.
-
-AX.25 DAMA Master support
-CONFIG_AX25_DAMA_MASTER
-  DAMA is a mechanism to prevent collisions when doing AX.25
-  networking. A DAMA server (called "master") accepts incoming traffic
-  from clients (called "slaves") and redistributes it to other
-  slaves. If you say Y here, your Linux box will act as a DAMA server.
-  If unsure, say N.
-
-Amateur Radio NET/ROM support
-CONFIG_NETROM
-  NET/ROM is a network layer protocol on top of AX.25 useful for
-  routing.
-
-  A comprehensive listing of all the software for Linux amateur radio
-  users as well as information about how to configure an AX.25 port is
-  contained in the AX25-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>. You also might want to
-  check out the file <file:Documentation/networking/ax25.txt>. More
-  information about digital amateur radio in general is on the WWW at
-  <http://www.tapr.org/tapr/html/pkthome.html>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called netrom.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Amateur Radio X.25 PLP (Rose)
-CONFIG_ROSE
-  The Packet Layer Protocol (PLP) is a way to route packets over X.25
-  connections in general and amateur radio AX.25 connections in
-  particular, essentially an alternative to NET/ROM.
-
-  A comprehensive listing of all the software for Linux amateur radio
-  users as well as information about how to configure an AX.25 port is
-  contained in the AX25-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.  You also might want to
-  check out the file <file:Documentation/networking/ax25.txt>. More
-  information about digital amateur radio in general is on the WWW at
-  <http://www.tapr.org/tapr/html/pkthome.html>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called rose.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Serial port KISS driver for AX.25
-CONFIG_MKISS
-  KISS is a protocol used for the exchange of data between a computer
-  and a Terminal Node Controller (a small embedded system commonly
-  used for networking over AX.25 amateur radio connections; it
-  connects the computer's serial port with the radio's microphone
-  input and speaker output).
-
-  Although KISS is less advanced than the 6pack protocol, it has
-  the advantage that it is already supported by most modern TNCs
-  without the need for a firmware upgrade.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called mkiss.o.
-
-Serial port 6PACK driver for AX.25
-CONFIG_6PACK
-  6pack is a transmission protocol for the data exchange between your
-  PC and your TNC (the Terminal Node Controller acts as a kind of
-  modem connecting your computer's serial port to your radio's
-  microphone input and speaker output). This protocol can be used as
-  an alternative to KISS for networking over AX.25 amateur radio
-  connections, but it has some extended functionality.
-
-  Note that this driver is still experimental and might cause
-  problems. For details about the features and the usage of the
-  driver, read <file:Documentation/networking/6pack.txt>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called 6pack.o.
-
-BPQ Ethernet driver
-CONFIG_BPQETHER
-  AX.25 is the protocol used for computer communication over amateur
-  radio. If you say Y here, you will be able to send and receive AX.25
-  traffic over Ethernet (also called "BPQ AX.25"), which could be
-  useful if some other computer on your local network has a direct
-  amateur radio connection.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called bpqether.o.
-
-High-speed (DMA) SCC driver for AX.25
-CONFIG_DMASCC
-  This is a driver for high-speed SCC boards, i.e. those supporting
-  DMA on one port. You usually use those boards to connect your
-  computer to an amateur radio modem (such as the WA4DSY 56kbps
-  modem), in order to send and receive AX.25 packet radio network
-  traffic.
-
-  Currently, this driver supports Ottawa PI/PI2, Paccomm/Gracilis
-  PackeTwin, and S5SCC/DMA boards. They are detected automatically.
-  If you have one of these cards, say Y here and read the AX25-HOWTO,
-  available from <http://www.tldp.org/docs.html#howto>.
-
-  This driver can operate multiple boards simultaneously. If you
-  compile it as a module (by saying M instead of Y), it will be called
-  dmascc.o. If you don't pass any parameter to the driver, all
-  possible I/O addresses are probed. This could irritate other devices
-  that are currently not in use. You may specify the list of addresses
-  to be probed by "dmascc=addr1,addr2,..." (when compiled into the
-  kernel image) or "io=addr1,addr2,..." (when loaded as a module). The
-  network interfaces will be called dmascc0 and dmascc1 for the board
-  detected first, dmascc2 and dmascc3 for the second one, and so on.
-
-  Before you configure each interface with ifconfig, you MUST set
-  certain parameters, such as channel access timing, clock mode, and
-  DMA channel. This is accomplished with a small utility program,
-  dmascc_cfg, available at
-  <http://www.nt.tuwien.ac.at/~kkudielk/Linux/>. Please be sure to get
-  at least version 1.27 of dmascc_cfg, as older versions will not
-  work with the current driver.
-
-Z8530 SCC driver for AX.25
-CONFIG_SCC
-  These cards are used to connect your Linux box to an amateur radio
-  in order to communicate with other computers. If you want to use
-  this, read <file:Documentation/networking/z8530drv.txt> and the
-  AX25-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>. Also make sure to say Y
-  to "Amateur Radio AX.25 Level 2" support.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called scc.o.
-
-Support for TRX that feedback the tx signal to rx
-CONFIG_SCC_TRXECHO
-  Some transmitters feed the transmitted signal back to the receive
-  line.  Say Y here to foil this by explicitly disabling the receiver
-  during data transmission.  If in doubt, say Y.
-
-Additional delay for PA0HZP OptoSCC compatible boards
-CONFIG_SCC_DELAY
-  Say Y here if you experience problems with the SCC driver not
-  working properly; please read
-  <file:Documentation/networking/z8530drv.txt> for details. If unsure,
-  say N.
-
-YAM driver for AX.25
-CONFIG_YAM
-  The YAM is a modem for packet radio which connects to the serial
-  port and includes some of the functions of a Terminal Node
-  Controller. If you have one of those, say Y here.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called yam.o.
-
-BAYCOM picpar and par96 driver for AX.25
-CONFIG_BAYCOM_PAR
-  This is a driver for Baycom style simple amateur radio modems that
-  connect to a parallel interface. The driver supports the picpar and
-  par96 designs. To configure the driver, use the sethdlc utility
-  available in the standard ax25 utilities package. For information on
-  the modems, see <http://www.baycom.de/> and the file
-  <file:Documentation/networking/baycom.txt>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  This is
-  recommended.  The module will be called baycom_par.o.
-
-BAYCOM EPP driver for AX.25
-CONFIG_BAYCOM_EPP
-  This is a driver for Baycom style simple amateur radio modems that
-  connect to a parallel interface. The driver supports the EPP
-  designs. To configure the driver, use the sethdlc utility available
-  in the standard ax25 utilities package. For information on the
-  modems, see <http://www.baycom.de/> and the file
-  <file:Documentation/networking/baycom.txt>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  This is
-  recommended.  The module will be called baycom_par.o.
-
-BAYCOM ser12 full-duplex driver for AX.25
-CONFIG_BAYCOM_SER_FDX
-  This is one of two drivers for Baycom style simple amateur radio
-  modems that connect to a serial interface. The driver supports the
-  ser12 design in full-duplex mode. In addition, it allows the
-  baudrate to be set between 300 and 4800 baud (however not all modems
-  support all baudrates). This is the preferred driver. The next
-  driver, "BAYCOM ser12 half-duplex driver for AX.25" is the old
-  driver and still provided in case this driver does not work with
-  your serial interface chip. To configure the driver, use the sethdlc
-  utility available in the standard ax25 utilities package. For
-  information on the modems, see <http://www.baycom.de/> and
-  <file:Documentation/networking/baycom.txt>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  This is
-  recommended.  The module will be called baycom_ser_fdx.o.
-
-BAYCOM ser12 half-duplex driver for AX.25
-CONFIG_BAYCOM_SER_HDX
-  This is one of two drivers for Baycom style simple amateur radio
-  modems that connect to a serial interface. The driver supports the
-  ser12 design in full-duplex mode. This is the old driver.  It is
-  still provided in case your serial interface chip does not work with
-  the full-duplex driver. This driver is depreciated.  To configure
-  the driver, use the sethdlc utility available in the standard ax25
-  utilities package. For information on the modems, see
-  <http://www.baycom.de/> and
-  <file:Documentation/networking/baycom.txt>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  This is
-  recommended.  The module will be called baycom_ser_hdx.o.
-
-Sound card modem driver for AX.25
-CONFIG_SOUNDMODEM
-  This experimental driver allows a standard Sound Blaster or
-  WindowsSoundSystem compatible sound card to be used as a packet
-  radio modem (NOT as a telephone modem!), to send digital traffic
-  over amateur radio.
-
-  To configure the driver, use the sethdlc, smdiag and smmixer
-  utilities available in the standard ax25 utilities package. For
-  information on how to key the transmitter, see
-  <http://www.ife.ee.ethz.ch/~sailer/pcf/ptt_circ/ptt.html> and
-  <file:Documentation/networking/soundmodem.txt>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  This is
-  recommended.  The module will be called soundmodem.o.
-
-Sound card modem support for Sound Blaster and compatible cards
-CONFIG_SOUNDMODEM_SBC
-  This option enables the soundmodem driver to use Sound Blaster and
-  compatible cards. If you have a dual mode card (i.e. a WSS cards
-  with a Sound Blaster emulation) you should say N here and Y to
-  "Sound card modem support for WSS and Crystal cards", below, because
-  this usually results in better performance. This option also
-  supports SB16/32/64 in full-duplex mode.
-
-Sound card modem support for WSS and Crystal cards
-CONFIG_SOUNDMODEM_WSS
-  This option enables the soundmodem driver to use WindowsSoundSystem
-  compatible cards. These cards feature a codec chip from either
-  Analog Devices (such as AD1848, AD1845, AD1812) or Crystal
-  Semiconductors (such as CS4248, CS423x). This option also supports
-  the WSS full-duplex operation which currently works with Crystal
-  CS423x chips. If you don't need full-duplex operation, do not enable
-  it to save performance.
-
-Sound card modem support for 1200 baud AFSK modulation
-CONFIG_SOUNDMODEM_AFSK1200
-  This option enables the soundmodem driver 1200 baud AFSK modem,
-  compatible to popular modems using TCM3105 or AM7911. The
-  demodulator requires about 12% of the CPU power of a Pentium 75 CPU
-  per channel.
-
-Sound card modem support for 2400 baud AFSK modulation (7.3728MHz crystal)
-CONFIG_SOUNDMODEM_AFSK2400_7
-  This option enables the soundmodem driver 2400 baud AFSK modem,
-  compatible to TCM3105 modems (over-)clocked with a 7.3728MHz
-  crystal. Note that the availability of this driver does _not_ imply
-  that I recommend building such links. It is only here since users
-  especially in eastern Europe have asked me to do so. In fact this
-  modulation scheme has many disadvantages, mainly its incompatibility
-  with many transceiver designs and the fact that the TCM3105 (if
-  used) is operated widely outside its specifications.
-
-Sound card modem support for 2400 baud AFSK modulation (8MHz crystal)
-CONFIG_SOUNDMODEM_AFSK2400_8
-  This option enables the soundmodem driver 2400 baud AFSK modem,
-  compatible to TCM3105 modems (over-)clocked with an 8MHz crystal.
-  Note that the availability of this driver does _not_ imply that I
-  recommend building such links. It is only here since users
-  especially in eastern Europe have asked me to do so. In fact this
-  modulation scheme has many disadvantages, mainly its incompatibility
-  with many transceiver designs and the fact that the TCM3105 (if
-  used) is operated widely outside its specifications.
-
-Sound card modem support for 2666 baud AFSK modulation
-CONFIG_SOUNDMODEM_AFSK2666
-  This option enables the soundmodem driver 2666 baud AFSK modem.
-  This modem is experimental, and not compatible to anything
-  else I know of.
-
-Sound card modem support for 4800 baud 8PSK modulation
-CONFIG_SOUNDMODEM_PSK4800
-  This option enables the soundmodem driver 4800 baud 8PSK modem.
-  This modem is experimental, and not compatible to anything
-  else I know of.
-
-Sound card modem support for 4800 baud HAPN-1 modulation
-CONFIG_SOUNDMODEM_HAPN4800
-  This option enables the soundmodem driver 4800 baud HAPN-1
-  compatible modem. This modulation seems to be widely used 'down
-  under' and in the Netherlands. Here, nobody uses it, so I could not
-  test if it works. It is compatible to itself, however :-)
-
-Sound card modem support for 9600 baud FSK G3RUH modulation
-CONFIG_SOUNDMODEM_FSK9600
-  This option enables the soundmodem driver 9600 baud FSK modem,
-  compatible to the G3RUH standard. The demodulator requires about 4%
-  of the CPU power of a Pentium 75 CPU per channel. You can say Y to
-  both 1200 baud AFSK and 9600 baud FSK if you want (but obviously you
-  can only use one protocol at a time, depending on what the other end
-  can understand).
-
-CCITT X.25 Packet Layer
-CONFIG_X25
-  X.25 is a set of standardized network protocols, similar in scope to
-  frame relay; the one physical line from your box to the X.25 network
-  entry point can carry several logical point-to-point connections
-  (called "virtual circuits") to other computers connected to the X.25
-  network. Governments, banks, and other organizations tend to use it
-  to connect to each other or to form Wide Area Networks (WANs). Many
-  countries have public X.25 networks. X.25 consists of two
-  protocols: the higher level Packet Layer Protocol (PLP) (say Y here
-  if you want that) and the lower level data link layer protocol LAPB
-  (say Y to "LAPB Data Link Driver" below if you want that).
-
-  You can read more about X.25 at <http://www.sangoma.com/x25.htm> and
-  <http://www.cisco.com/univercd/data/doc/software/11_0/rpcg/cx25.htm>.
-  Information about X.25 for Linux is contained in the files
-  <file:Documentation/networking/x25.txt> and
-  <file:Documentation/networking/x25-iface.txt>.
-
-  One connects to an X.25 network either with a dedicated network card
-  using the X.21 protocol (not yet supported by Linux) or one can do
-  X.25 over a standard telephone line using an ordinary modem (say Y
-  to "X.25 async driver" below) or over Ethernet using an ordinary
-  Ethernet card and either the 802.2 LLC protocol (say Y to "802.2
-  LLC" below) or LAPB over Ethernet (say Y to "LAPB Data Link Driver"
-  and "LAPB over Ethernet driver" below).
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called x25.o. If unsure, say N.
-
-LAPB Data Link Driver
-CONFIG_LAPB
-  Link Access Procedure, Balanced (LAPB) is the data link layer (i.e.
-  the lower) part of the X.25 protocol. It offers a reliable
-  connection service to exchange data frames with one other host, and
-  it is used to transport higher level protocols (mostly X.25 Packet
-  Layer, the higher part of X.25, but others are possible as well).
-  Usually, LAPB is used with specialized X.21 network cards, but Linux
-  currently supports LAPB only over Ethernet connections. If you want
-  to use LAPB connections over Ethernet, say Y here and to "LAPB over
-  Ethernet driver" below. Read
-  <file:Documentation/networking/lapb-module.txt> for technical
-  details.
-
-  If you want to compile this driver as a module though ( = code which
-  can be inserted in and removed from the running kernel whenever you
-  want), say M here and read <file:Documentation/modules.txt>.  The
-  module will be called lapb.o.  If unsure, say N.
-
-802.2 LLC
-CONFIG_LLC
-  This is a Logical Link Layer protocol used for X.25 connections over
-  Ethernet, using ordinary Ethernet cards.
-
-Frame Diverter
-CONFIG_NET_DIVERT
-  The Frame Diverter allows you to divert packets from the
-  network, that are not aimed at the interface receiving it (in
-  promisc. mode). Typically, a Linux box setup as an Ethernet bridge
-  with the Frames Diverter on, can do some *really* transparent www
-  caching using a Squid proxy for example.
-
-  This is very useful when you don't want to change your router's
-  config (or if you simply don't have access to it).
-
-  The other possible usages of diverting Ethernet Frames are
-  numberous:
-   - reroute smtp traffic to another interface
-   - traffic-shape certain network streams
-   - transparently proxy smtp connections
-   - etc...
-
-  For more informations, please refer to:
-    <http://diverter.sourceforge.net/>
-    <http://perso.wanadoo.fr/magpie/EtherDivert.html>
-
-  If unsure, say N.
-
-802.1d Ethernet Bridging
-CONFIG_BRIDGE
-  If you say Y here, then your Linux box will be able to act as an
-  Ethernet bridge, which means that the different Ethernet segments it
-  is connected to will appear as one Ethernet to the participants.
-  Several such bridges can work together to create even larger
-  networks of Ethernets using the IEEE 802.1 spanning tree algorithm.
-  As this is a standard, Linux bridges will cooperate properly with
-  other third party bridge products.
-
-  In order to use the Ethernet bridge, you'll need the bridge
-  configuration tools; see <file:Documentation/networking/bridge.txt>
-  for location. Please read the Bridge mini-HOWTO for more
-  information.
-
-  Note that if your box acts as a bridge, it probably contains several
-  Ethernet devices, but the kernel is not able to recognize more than
-  one at boot time without help; for details read the Ethernet-HOWTO,
-  available from in <http://www.tldp.org/docs.html#howto>.
-
-  If you want to compile this code as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called bridge.o.
-
-  If unsure, say N.
-
-Packet socket
-CONFIG_PACKET
-  The Packet protocol is used by applications which communicate
-  directly with network devices without an intermediate network
-  protocol implemented in the kernel, e.g. tcpdump.  If you want them
-  to work, choose Y.
-
-  This driver is also available as a module called af_packet.o ( =
-  code which can be inserted in and removed from the running kernel
-  whenever you want).  If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>; if you use modprobe
-  or kmod, you may also want to add "alias net-pf-17 af_packet" to
-  /etc/modules.conf.
-
-  If unsure, say Y.
-
-Packet socket: mmapped IO
-CONFIG_PACKET_MMAP
-  If you say Y here, the Packet protocol driver will use an IO
-  mechanism that results in faster communication.
-
-  If unsure, say N.
-
-Netlink device emulation
-CONFIG_NETLINK_DEV
-  This option will be removed soon. Any programs that want to use
-  character special nodes like /dev/tap0 or /dev/route (all with major
-  number 36) need this option, and need to be rewritten soon to use
-  the real netlink socket.
-  This is a backward compatibility option, choose Y for now.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  netlink_dev.o
-
-Asynchronous Transfer Mode (ATM)
-CONFIG_ATM
-  ATM is a high-speed networking technology for Local Area Networks
-  and Wide Area Networks.  It uses a fixed packet size and is
-  connection oriented, allowing for the negotiation of minimum
-  bandwidth requirements.
-
-  In order to participate in an ATM network, your Linux box needs an
-  ATM networking card. If you have that, say Y here and to the driver
-  of your ATM card below.
-
-  Note that you need a set of user-space programs to actually make use
-  of ATM.  See the file <file:Documentation/networking/atm.txt> for
-  further details.
-
-Classical IP over ATM
-CONFIG_ATM_CLIP
-  Classical IP over ATM for PVCs and SVCs, supporting InARP and
-  ATMARP. If you want to communication with other IP hosts on your ATM
-  network, you will typically either say Y here or to "LAN Emulation
-  (LANE)" below.
-
-Do NOT send ICMP if no neighbour
-CONFIG_ATM_CLIP_NO_ICMP
-  Normally, an "ICMP host unreachable" message is sent if a neighbour
-  cannot be reached because there is no VC to it in the kernel's
-  ATMARP table. This may cause problems when ATMARP table entries are
-  briefly removed during revalidation. If you say Y here, packets to
-  such neighbours are silently discarded instead.
-
-RFC1483/2684 Bridged protocols
-CONFIG_ATM_BR2684
-  ATM PVCs can carry ethernet PDUs according to rfc2684 (formerly 1483)
-  This device will act like an ethernet from the kernels point of view,
-  with the traffic being carried by ATM PVCs (currently 1 PVC/device).
-  This is sometimes used over DSL lines.  If in doubt, say N.
-
-Per-VC IP filter kludge
-CONFIG_ATM_BR2684_IPFILTER
-  This is an experimental mechanism for users who need to terminating a
-  large number of IP-only vcc's.  Do not enable this unless you are sure
-  you know what you are doing.
-
-LAN Emulation (LANE) support
-CONFIG_ATM_LANE
-  LAN Emulation emulates services of existing LANs across an ATM
-  network. Besides operating as a normal ATM end station client, Linux
-  LANE client can also act as an proxy client bridging packets between
-  ELAN and Ethernet segments. You need LANE if you want to try MPOA.
-
-Multi-Protocol Over ATM (MPOA) support
-CONFIG_ATM_MPOA
-  Multi-Protocol Over ATM allows ATM edge devices such as routers,
-  bridges and ATM attached hosts establish direct ATM VCs across
-  subnetwork boundaries. These shortcut connections bypass routers
-  enhancing overall network performance.
-
-ATM over TCP
-CONFIG_ATM_TCP
-  ATM over TCP driver. Useful mainly for development and for
-  experiments. If unsure, say N.
-
-Efficient Networks ENI155P
-CONFIG_ATM_ENI
-  Driver for the Efficient Networks ENI155p series and SMC ATM
-  Power155 155 Mbps ATM adapters. Both, the versions with 512KB and
-  2MB on-board RAM (Efficient calls them "C" and "S", respectively),
-  and the FPGA and the ASIC Tonga versions of the board are supported.
-  The driver works with MMF (-MF or ...F) and UTP-5 (-U5 or ...D)
-  adapters.
-
-  This driver is also available as a module.  If you want to compile
-  it as a module, say M here and read
-  <file:Documentation/modules.txt>.  The module will be called eni.o.
-
-Enable extended debugging
-CONFIG_ATM_ENI_DEBUG
-  Extended debugging records various events and displays that list
-  when an inconsistency is detected. This mechanism is faster than
-  generally using printks, but still has some impact on performance.
-  Note that extended debugging may create certain race conditions
-  itself. Enable this ONLY if you suspect problems with the driver.
-
-Fine-tune burst settings
-CONFIG_ATM_ENI_TUNE_BURST
-  In order to obtain good throughput, the ENI NIC can transfer
-  multiple words of data per PCI bus access cycle. Such a multi-word
-  transfer is called a burst.
-
-  The default settings for the burst sizes are suitable for most PCI
-  chipsets. However, in some cases, large bursts may overrun buffers
-  in the PCI chipset and cause data corruption. In such cases, large
-  bursts must be disabled and only (slower) small bursts can be used.
-  The burst sizes can be set independently in the send (TX) and
-  receive (RX) direction.
-
-  Note that enabling many different burst sizes in the same direction
-  may increase the cost of setting up a transfer such that the
-  resulting throughput is lower than when using only the largest
-  available burst size.
-
-  Also, sometimes larger bursts lead to lower throughput, e.g. on an
-  Intel 440FX board, a drop from 135 Mbps to 103 Mbps was observed
-  when going from 8W to 16W bursts.
-
-Enable 16W TX bursts (discouraged)
-CONFIG_ATM_ENI_BURST_TX_16W
-  Burst sixteen words at once in the send direction. This may work
-  with recent PCI chipsets, but is known to fail with older chipsets.
-
-Enable 8W TX bursts (recommended)
-CONFIG_ATM_ENI_BURST_TX_8W
-  Burst eight words at once in the send direction. This is the default
-  setting.
-
-Enable 4W TX bursts (optional)
-CONFIG_ATM_ENI_BURST_TX_4W
-  Burst four words at once in the send direction. You may want to try
-  this if you have disabled 8W bursts. Enabling 4W if 8W is also set
-  may or may not improve throughput.
-
-Enable 2W TX bursts (optional)
-CONFIG_ATM_ENI_BURST_TX_2W
-  Burst two words at once in the send direction. You may want to try
-  this if you have disabled 4W and 8W bursts. Enabling 2W if 4W or 8W
-  are also set may or may not improve throughput.
-
-Enable 16W RX bursts (discouraged)
-CONFIG_ATM_ENI_BURST_RX_16W
-  Burst sixteen words at once in the receive direction. This may work
-  with recent PCI chipsets, but is known to fail with older chipsets.
-
-Enable 8W RX bursts (discouraged)
-CONFIG_ATM_ENI_BURST_RX_8W
-  Burst eight words at once in the receive direction. This may work
-  with recent PCI chipsets, but is known to fail with older chipsets,
-  such as the Intel Neptune series.
-
-Enable 4W RX bursts (recommended)
-CONFIG_ATM_ENI_BURST_RX_4W
-  Burst four words at once in the receive direction. This is the
-  default setting. Enabling 4W if 8W is also set may or may not
-  improve throughput.
-
-Enable 2W RX bursts (optional)
-CONFIG_ATM_ENI_BURST_RX_2W
-  Burst two words at once in the receive direction. You may want to
-  try this if you have disabled 4W and 8W bursts. Enabling 2W if 4W or
-  8W are also set may or may not improve throughput.
-
-ZeitNet ZN1221/ZN1225
-CONFIG_ATM_ZATM
-  Driver for the ZeitNet ZN1221 (MMF) and ZN1225 (UTP-5) 155 Mbps ATM
-  adapters.
-
-  This driver is also available as a module.  If you want to compile
-  it as a module, say M here and read
-  <file:Documentation/modules.txt>.  The module will be called zatm.o.
-
-Enable extended debugging
-CONFIG_ATM_ZATM_DEBUG
-  Extended debugging records various events and displays that list
-  when an inconsistency is detected. This mechanism is faster than
-  generally using printks, but still has some impact on performance.
-  Note that extended debugging may create certain race conditions
-  itself. Enable this ONLY if you suspect problems with the driver.
-
-Fujitsu FireStream (FS50/FS155)
-CONFIG_ATM_FIRESTREAM
-  Driver for the Fujitsu FireStream 155 (MB86697) and
-  FireStream 50 (MB86695) ATM PCI chips.
-
-  This driver is also available as a module.  If you want to compile
-  it as a module, say M here and read
-  <file:Documentation/modules.txt>.  The module will be called
-  firestream.o.
-
-Enable usec resolution timestamps
-CONFIG_ATM_ZATM_EXACT_TS
-  The uPD98401 SAR chip supports a high-resolution timer (approx. 30
-  MHz) that is used for very accurate reception timestamps. Because
-  that timer overflows after 140 seconds, and also to avoid timer
-  drift, time measurements need to be periodically synchronized with
-  the normal system time. Enabling this feature will add some general
-  overhead for timer synchronization and also per-packet overhead for
-  time conversion.
-
-IDT 77201/11 (NICStAR) (ForeRunnerLE)
-CONFIG_ATM_NICSTAR
-  The NICStAR chipset family is used in a large number of ATM NICs for
-  25 and for 155 Mbps, including IDT cards and the Fore ForeRunnerLE
-  series. Say Y if you have one of those.
-
-  This driver is also available as a module.  If you want to compile
-  it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  nicstar.o.
-
-Use suni PHY driver (155Mbps)
-CONFIG_ATM_NICSTAR_USE_SUNI
-  Support for the S-UNI and compatible PHYsical layer chips. These are
-  found in most 155Mbps NICStAR based ATM cards, namely in the
-  ForeRunner LE155 cards. This driver provides detection of cable~
-  removal and reinsertion and provides some statistics. This driver
-  doesn't have removal capability when compiled as a module, so if you
-  need that capability don't include S-UNI support (it's not needed to
-  make the card work).
-
-Use IDT77015 PHY driver (25Mbps)
-CONFIG_ATM_NICSTAR_USE_IDT77105
-  Support for the PHYsical layer chip in ForeRunner LE25 cards. In
-  addition to cable removal/reinsertion detection, this driver allows
-  you to control the loopback mode of the chip via a dedicated IOCTL.
-  This driver is required for proper handling of temporary carrier
-  loss, so if you have a 25Mbps NICStAR based ATM card you must say Y.
-
-IDT 77252 (NICStAR II)
-CONFIG_ATM_IDT77252
-  Driver for the IDT 77252 ATM PCI chips.
-
-  This driver is also available as a module.  If you want to compile
-  it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called idt77252.o
-
-Enable debugging messages
-CONFIG_ATM_IDT77252_DEBUG
-  Somewhat useful debugging messages are available. The choice of
-  messages is controlled by a bitmap.  This may be specified as a
-  module argument.  See the file <file:drivers/atm/idt77252.h> for
-  the meanings of the bits in the mask.
-
-  When active, these messages can have a significant impact on the
-  speed of the driver, and the size of your syslog files! When
-  inactive, they will have only a modest impact on performance.
-
-Receive ALL cells in raw queue
-CONFIG_ATM_IDT77252_RCV_ALL
-  Enable receiving of all cells on the ATM link, that do not match
-  an open connection in the raw cell queue of the driver.  Useful
-  for debugging or special applications only, so the safe answer is N.
-
-Madge Ambassador (Collage PCI 155 Server)
-CONFIG_ATM_AMBASSADOR
-  This is a driver for ATMizer based ATM card produced by Madge
-  Networks Ltd. Say Y (or M to compile as a module named ambassador.o)
-  here if you have one of these cards.
-
-Enable debugging messages
-CONFIG_ATM_AMBASSADOR_DEBUG
-  Somewhat useful debugging messages are available. The choice of
-  messages is controlled by a bitmap.  This may be specified as a
-  module argument (kernel command line argument as well?), changed
-  dynamically using an ioctl (not yet) or changed by sending the
-  string "Dxxxx" to VCI 1023 (where x is a hex digit).  See the file
-  <file:drivers/atm/ambassador.h> for the meanings of the bits in the
-  mask.
-
-  When active, these messages can have a significant impact on the
-  speed of the driver, and the size of your syslog files! When
-  inactive, they will have only a modest impact on performance.
-
-Madge Horizon [Ultra] (Collage PCI 25 and Collage PCI 155 Client)
-CONFIG_ATM_HORIZON
-  This is a driver for the Horizon chipset ATM adapter cards once
-  produced by Madge Networks Ltd. Say Y (or M to compile as a module
-  named horizon.o) here if you have one of these cards.
-
-Enable debugging messages
-CONFIG_ATM_HORIZON_DEBUG
-  Somewhat useful debugging messages are available. The choice of
-  messages is controlled by a bitmap.  This may be specified as a
-  module argument (kernel command line argument as well?), changed
-  dynamically using an ioctl (not yet) or changed by sending the
-  string "Dxxxx" to VCI 1023 (where x is a hex digit).  See the file
-  <file:drivers/atm/horizon.h> for the meanings of the bits in the
-  mask.
-
-  When active, these messages can have a significant impact on the
-  speed of the driver, and the size of your syslog files! When
-  inactive, they will have only a modest impact on performance.
-
-Interphase ATM PCI x575/x525/x531
-CONFIG_ATM_IA
-  This is a driver for the Interphase (i)ChipSAR adapter cards
-  which include a variety of variants in term of the size of the
-  control memory (128K-1KVC, 512K-4KVC), the size of the packet
-  memory (128K, 512K, 1M), and the PHY type (Single/Multi mode OC3,
-  UTP155, UTP25, DS3 and E3). Go to:
-       <http://www.iphase.com/products/ClassSheet.cfm?ClassID=ATM>
-  for more info about the cards. Say Y (or M to compile as a module
-  named iphase.o) here if you have one of these cards.
-
-  See the file <file:Documentation/networking/iphase.txt> for further
-  details.
-
-Enable debugging messages
-CONFIG_ATM_IA_DEBUG
-  Somewhat useful debugging messages are available. The choice of
-  messages is controlled by a bitmap. This may be specified as a
-  module argument (kernel command line argument as well?), changed
-  dynamically using an ioctl (Get the debug utility, iadbg, from
-  <ftp://ftp.iphase.com/pub/atm/pci/>).
-
-  See the file <file:drivers/atm/iphase.h> for the meanings of the
-  bits in the mask.
-
-  When active, these messages can have a significant impact on the
-  speed of the driver, and the size of your syslog files! When
-  inactive, they will have only a modest impact on performance.
-
-Efficient Networks Speedstream 3010
-CONFIG_ATM_LANAI
-  Supports ATM cards based on the Efficient Networks "Lanai"
-  chipset such as the Speedstream 3010 and the ENI-25p.  The
-  Speedstream 3060 is currently not supported since we don't
-  have the code to drive the on-board Alcatel DSL chipset (yet).
-
-Linux telephony support
-CONFIG_PHONE
-  Say Y here if you have a telephony card, which for example allows
-  you to use a regular phone for voice-over-IP applications.
-
-  Note: this has nothing to do with modems.  You do not need to say Y
-  here in order to be able to use a modem under Linux.
-
-  This support is also available as a module.  If you want to compile
-  it as a module, say M here and read
-  <file:Documentation/modules.txt>.  The module will be called
-  phonedev.o.
-
-Compaq Smart Array support
-CONFIG_BLK_CPQ_CISS_DA
-  This is the driver for Compaq Smart Array 5xxx controllers.
-  Everyone using these boards should say Y here.
-  See <file:Documentation/cciss.txt> for the current list of
-  boards supported by this driver, and for further information
-  on the use of this driver.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  cciss.o
-
-SCSI tape drive support for Smart Array 5xxx
-CONFIG_CISS_SCSI_TAPE
-  When enabled (Y), this option allows SCSI tape drives and SCSI medium
-  changers (tape robots) to be accessed via a Compaq 5xxx array
-  controller.  (See Documentation/cciss.txt for more details.)
-
-  "SCSI support" and "SCSI tape support" must also be enabled for this
-  option to work.
-
-  When this option is disabled (N), the SCSI portion of the driver
-  is not compiled.
-
-QuickNet Internet LineJack/PhoneJack support
-CONFIG_PHONE_IXJ
-  Say M if you have a telephony card manufactured by Quicknet
-  Technologies, Inc.  These include the Internet PhoneJACK and
-  Internet LineJACK Telephony Cards. You will get a module called
-  ixj.o.
-
-  For the ISA versions of these products, you can configure the
-  cards using the isapnp tools (pnpdump/isapnp) or you can use the
-  isapnp support.  Please read <file:Documentation/telephony/ixj.txt>.
-
-  For more information on these cards, see Quicknet's web site at:
-  <http://www.quicknet.net/>.
-
-  If you do not have any Quicknet telephony cards, you can safely
-  say N here.
-
-QuickNet Internet LineJack/PhoneJack PCMCIA support
-CONFIG_PHONE_IXJ_PCMCIA
-  Say Y here to configure in PCMCIA service support for the Quicknet
-  cards manufactured by Quicknet Technologies, Inc.  This builds an
-  additional support module for the PCMCIA version of the card.
-
-FORE Systems 200E-series
-CONFIG_ATM_FORE200E_MAYBE
-  This is a driver for the FORE Systems 200E-series ATM adapter
-  cards. It simultaneously supports PCA-200E and SBA-200E models
-  on PCI and SBUS hosts. Say Y (or M to compile as a module
-  named fore_200e.o) here if you have one of these ATM adapters.
-
-  Note that the driver will actually be compiled only if you
-  additionally enable the support for PCA-200E and/or SBA-200E
-  cards.
-
-  See the file <file:Documentation/networking/fore200e.txt> for
-  further details.
-
-Enable PCA-200E card support on PCI-based hosts
-CONFIG_ATM_FORE200E_PCA
-  Say Y here if you want your PCA-200E cards to be probed.
-
-Use default PCA-200E firmware
-CONFIG_ATM_FORE200E_PCA_DEFAULT_FW
-  Use the default PCA-200E firmware data shipped with the driver.
-
-  Normal users do not have to deal with the firmware stuff, so
-  they should say Y here.
-
-Pathname of user-supplied binary firmware
-CONFIG_ATM_FORE200E_PCA_FW
-  This defines the pathname of an alternative PCA-200E binary
-  firmware image supplied by the user. This pathname may be
-  absolute or relative to the drivers/atm directory.
-
-  The driver comes with an adequate firmware image, so normal users do
-  not have to supply an alternative one. They just say Y to "Use
-  default PCA-200E firmware" instead.
-
-Enable SBA-200E card support on SBUS-based hosts
-CONFIG_ATM_FORE200E_SBA
-  Say Y here if you want your SBA-200E cards to be probed.
-
-Use default SBA-200E firmware
-CONFIG_ATM_FORE200E_SBA_DEFAULT_FW
-  Use the default SBA-200E firmware data shipped with the driver.
-
-  Normal users do not have to deal with the firmware stuff, so
-  they should say Y here.
-
-Pathname of user-supplied binary firmware
-CONFIG_ATM_FORE200E_SBA_FW
-  This defines the pathname of an alternative SBA-200E binary
-  firmware image supplied by the user. This pathname may be
-  absolute or relative to the drivers/atm directory.
-
-  The driver comes with an adequate firmware image, so normal users do
-  not have to supply an alternative one. They just say Y to "Use
-  default SBA-200E firmware", above.
-
-Maximum number of tx retries
-CONFIG_ATM_FORE200E_TX_RETRY
-  Specifies the number of times the driver attempts to transmit
-  a message before giving up, if the transmit queue of the ATM card
-  is transiently saturated.
-
-  Saturation of the transmit queue may occur only under extreme
-  conditions, e.g. when a fast host continuously submits very small
-  frames (<64 bytes) or raw AAL0 cells (48 bytes) to the ATM adapter.
-
-  Note that under common conditions, it is unlikely that you encounter
-  a saturation of the transmit queue, so the retry mechanism never
-  comes into play.
-
-Debugging level (0-3)
-CONFIG_ATM_FORE200E_DEBUG
-  Specifies the level of debugging messages issued by the driver.
-  The verbosity of the driver increases with the value of this
-  parameter.
-
-  When active, these messages can have a significant impact on
-  the performances of the driver, and the size of your syslog files!
-  Keep the debugging level to 0 during normal operations.
-
-PPP over ATM
-CONFIG_PPPOATM
-  Support PPP (Point to Point Protocol) encapsulated in ATM frames.
-  This implementation does not yet comply with section 8 of RFC2364,
-  which can lead to bad results idf the ATM peer loses state and 
-  changes its encapsulation unilaterally.
-
-Fusion MPT device support
-CONFIG_FUSION
-  LSI Logic Fusion(TM) Message Passing Technology (MPT) device support
-  provides high performance SCSI host initiator, and LAN [1] interface
-  services to a host system.  The Fusion architecture is capable of
-  duplexing these protocols on high-speed Fibre Channel
-  (up to 2 GHz x 2 ports = 4 GHz) and parallel SCSI (up to Ultra-320)
-  physical medium.
-
-          [1] LAN is not supported on parallel SCSI medium.
-
-  These drivers require a Fusion MPT compatible PCI adapter installed
-  in the host system.  MPT adapters contain specialized I/O processors
-  to handle I/O workload, and more importantly to offload this work
-  from the host CPU(s).
-
-  If you have Fusion MPT hardware and want to use it, you can say
-  Y or M here to add MPT (base + ScsiHost) drivers.
-    <Y> = build lib (fusion.o), and link [static] into the kernel [2]
-          proper
-    <M> = compiled as [dynamic] modules [3] named: (mptbase.o,
-          mptscsih.o)
-
-          [2] In order enable capability to boot the linux kernel
-              natively from a Fusion MPT target device, you MUST
-               answer Y here! (currently requires CONFIG_BLK_DEV_SD)
-          [3] This support is also available as a module ( = code
-              which can be inserted in and removed from the running
-              kernel whenever you want).  If you want to compile as
-              modules, say M here and read
-              <file:Documentation/modules.txt>.
-
-  If unsure, say N.
-
-  If you say Y or M here you will get a choice of these
-  additional protocol and support module options:         Module Name:
-    <M>   Enhanced SCSI error reporting                     (isense.o)
-    <M>   Fusion MPT misc device (ioctl) driver             (mptctl.o)
-    <M>   Fusion MPT LAN driver                             (mptlan.o)
-
-  ---
-  Fusion MPT is trademark of LSI Logic Corporation, and its
-  architecture is based on LSI Logic's Message Passing Interface (MPI)
-  specification.
-
-Fusion MPT enhanced SCSI error reporting [optional] module
-CONFIG_FUSION_ISENSE
-  The isense module (roughly stands for Interpret SENSE data) is
-  completely optional.  It simply provides extra English readable
-  strings in SCSI Error Report(s) that might be generated from the
-  Fusion MPT SCSI Host driver, for example when a target device
-  returns a SCSI check condition on a I/O.  Without this module
-  loaded you might see:
-
-    SCSI Error Report =-=-= (ioc0,scsi5:0)
-      SCSI_Status=02h (CHECK_CONDITION)
-      Original_CDB[]: 2A 00 00 00 00 41 00 00 02 00
-      SenseData[12h]: 70 00 02 00 00 00 00 0A 00 00 00 00 04 02 02 00 00 00
-      SenseKey=2h (NOT READY); FRU=02h
-      ASC/ASCQ=29h/00h
-
-  Where otherwise, if this module had been loaded, you would see:
-
-    SCSI Error Report =-=-= (ioc0,scsi5:0)
-      SCSI_Status=02h (CHECK_CONDITION)
-      Original_CDB[]: 2A 00 00 00 00 41 00 00 02 00 - "WRITE(10)"
-      SenseData[12h]: 70 00 02 00 00 00 00 0A 00 00 00 00 04 02 02 00 00 00
-      SenseKey=2h (NOT READY); FRU=02h
-      ASC/ASCQ=29h/00h "LOGICAL UNIT NOT READY, INITIALIZING CMD. REQUIRED"
-
-  Say M for "Enhanced SCSI error reporting" to compile this optional module,
-  creating a driver named: isense.o.
-
-  NOTE: Support for building this feature into the kernel is not
-  available, due to kernel size considerations.
-
-Fusion MPT misc device (ioctl) driver [optional] module
-CONFIG_FUSION_CTL
-  The Fusion MPT misc device driver provides specialized control
-  of MPT adapters via system ioctl calls.  Use of ioctl calls to
-  the MPT driver requires that you create and use a misc device
-  node ala:
-    mknod /dev/mptctl c 10 240
-
-  One use of this ioctl interface is to perform an upgrade (reflash)
-  of the MPT adapter firmware.  Refer to readme file(s) distributed
-  with the Fusion MPT linux driver for additional details.
-
-  If enabled by saying M to this, a driver named: mptctl.o
-  will be compiled.
-
-  If unsure whether you really want or need this, say N.
-
-Fusion MPT LAN driver [optional]
-CONFIG_FUSION_LAN
-  This module supports LAN IP traffic over Fibre Channel port(s)
-  on Fusion MPT compatible hardware (LSIFC9xx chips).
-  The physical interface used is defined in RFC 2625.
-  Please refer to that document for details.
-
-  Installing this driver requires the knowledge to configure and
-  activate a new network interface, "fc0", using standard Linux tools.
-
-  If enabled by saying M to this, a driver named: mptlan.o
-  will be compiled.
-
-  If unsure whether you really want or need this, say N.
-
-  NOTES: This feature is NOT available nor supported for linux-2.2.x
-  kernels.  You must be building a linux-2.3.x or linux-2.4.x kernel
-  in order to configure this option.
-  Support for building this feature into the linux kernel is not
-  yet available.
-
-SCSI support
-CONFIG_SCSI
-  If you want to use a SCSI hard disk, SCSI tape drive, SCSI CD-ROM or
-  any other SCSI device under Linux, say Y and make sure that you know
-  the name of your SCSI host adapter (the card inside your computer
-  that "speaks" the SCSI protocol, also called SCSI controller),
-  because you will be asked for it.
-
-  You also need to say Y here if you want support for the parallel
-  port version of the 100 MB IOMEGA ZIP drive.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called scsi_mod.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt> and
-  <file:Documentation/scsi.txt>.  However, do not compile this as a
-  module if your root file system (the one containing the directory /)
-  is located on a SCSI device.
-
-SCSI disk support
-CONFIG_BLK_DEV_SD
-  If you want to use a SCSI hard disk or the SCSI or parallel port
-  version of the IOMEGA ZIP drive under Linux, say Y and read the
-  SCSI-HOWTO, the Disk-HOWTO and the Multi-Disk-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>. This is NOT for SCSI
-  CD-ROMs.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called sd_mod.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> and
-  <file:Documentation/scsi.txt>.  Do not compile this driver as a
-  module if your root file system (the one containing the directory /)
-  is located on a SCSI disk. In this case, do not compile the driver
-  for your SCSI host adapter (below) as a module either.
-
-Maximum number of SCSI disks that can be loaded as modules
-CONFIG_SD_EXTRA_DEVS
-  This controls the amount of additional space allocated in tables for
-  drivers that are loaded as modules after the kernel is booted.  In
-  the event that the SCSI core itself was loaded as a module, this
-  value is the number of additional disks that can be loaded after the
-  first host driver is loaded.
-
-  Admittedly this isn't pretty, but there are tons of race conditions
-  involved with resizing the internal arrays on the fly.  Someday this
-  flag will go away, and everything will work automatically.
-
-  If you don't understand what's going on, go with the default.
-
-Maximum number of SCSI tapes that can be loaded as modules
-CONFIG_ST_EXTRA_DEVS
-  This controls the amount of additional space allocated in tables for
-  drivers that are loaded as modules after the kernel is booted.  In
-  the event that the SCSI core itself was loaded as a module, this
-  value is the number of additional tapes that can be loaded after the
-  first host driver is loaded.
-
-  Admittedly this isn't pretty, but there are tons of race conditions
-  involved with resizing the internal arrays on the fly.  Someday this
-  flag will go away, and everything will work automatically.
-
-  If you don't understand what's going on, go with the default.
-
-SCSI tape support
-CONFIG_CHR_DEV_ST
-  If you want to use a SCSI tape drive under Linux, say Y and read the
-  SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>, and
-  <file:drivers/scsi/README.st> in the kernel source.  This is NOT for
-  SCSI CD-ROMs.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called st.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> and
-  <file:Documentation/scsi.txt>.
-
-OnStream SC-x0 SCSI tape support
-CONFIG_CHR_DEV_OSST
-  The OnStream SC-x0 SCSI tape drives can not be driven by the
-  standard st driver, but instead need this special osst driver and
-  use the  /dev/osstX char device nodes (major 206).  Via usb-storage
-  and ide-scsi, you may be able to drive the USB-x0 and DI-x0 drives
-  as well.  Note that there is also a second generation of OnStream
-  tape drives (ADR-x0) that supports the standard SCSI-2 commands for
-  tapes (QIC-157) and can be driven by the standard driver st.
-  For more information, you may have a look at the SCSI-HOWTO
-  <http://www.tldp.org/docs.html#howto>  and
-  <file:drivers/scsi/README.osst>  in the kernel source.
-  More info on the OnStream driver may be found on
-  <http://linux1.onstream.nl/test/>
-  Please also have a look at the standard st docu, as most of it
-  applies to osst as well.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called osst.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> and
-  <file:Documentation/scsi.txt>.
-
-SCSI CD-ROM support
-CONFIG_BLK_DEV_SR
-  If you want to use a SCSI CD-ROM under Linux, say Y and read the
-  SCSI-HOWTO and the CD-ROM-HOWTO at
-  <http://www.tldp.org/docs.html#howto>. Also make sure to say Y
-  or M to "ISO 9660 CD-ROM file system support" later.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called sr_mod.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> and
-  <file:Documentation/scsi.txt>.
-
-Maximum number of CD-ROM devices that can be loaded as modules
-CONFIG_SR_EXTRA_DEVS
-  This controls the amount of additional space allocated in tables for
-  drivers that are loaded as modules after the kernel is booted. In
-  the event that the SCSI core itself was loaded as a module, this
-  value is the number of additional CD-ROMs that can be loaded after
-  the first host driver is loaded.
-
-  Admittedly this isn't pretty, but there are tons of race conditions
-  involved with resizing the internal arrays on the fly.  Someday this
-  flag will go away, and everything will work automatically.
-
-  If you don't understand what's going on, go with the default.
-
-Enable vendor-specific extensions (for SCSI CD-ROM)
-CONFIG_BLK_DEV_SR_VENDOR
-  This enables the usage of vendor specific SCSI commands. This is
-  required to support multisession CDs with old NEC/TOSHIBA cdrom
-  drives (and HP Writers). If you have such a drive and get the first
-  session only, try saying Y here; everybody else says N.
-
-SCSI generic support
-CONFIG_CHR_DEV_SG
-  If you want to use SCSI scanners, synthesizers or CD-writers or just
-  about anything having "SCSI" in its name other than hard disks,
-  CD-ROMs or tapes, say Y here. These won't be supported by the kernel
-  directly, so you need some additional software which knows how to
-  talk to these devices using the SCSI protocol:
-
-  For scanners, look at SANE (<http://www.mostang.com/sane/>). For CD
-  writer software look at Cdrtools
-  (<http://www.fokus.gmd.de/research/cc/glone/employees/joerg.schilling/private/cdrecord.html>)
-  and for burning a "disk at once": CDRDAO
-  (<http://cdrdao.sourceforge.net/>). Cdparanoia is a high
-  quality digital reader of audio CDs (<http://www.xiph.org/paranoia/>).
-  For other devices, it's possible that you'll have to write the
-  driver software yourself. Please read the file
-  <file:Documentation/scsi-generic.txt> for more information.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt> and
-  <file:Documentation/scsi.txt>. The module will be called sg.o. If unsure,
-  say N.
-
-Probe all LUNs on each SCSI device
-CONFIG_SCSI_MULTI_LUN
-  If you have a SCSI device that supports more than one LUN (Logical
-  Unit Number), e.g. a CD jukebox, and only one LUN is detected, you
-  can say Y here to force the SCSI driver to probe for multiple LUNs.
-  A SCSI device with multiple LUNs acts logically like multiple SCSI
-  devices. The vast majority of SCSI devices have only one LUN, and
-  so most people can say N here and should in fact do so, because it
-  is safer.
-
-Verbose SCSI error reporting (kernel size +=12K)
-CONFIG_SCSI_CONSTANTS
-  The error messages regarding your SCSI hardware will be easier to
-  understand if you say Y here; it will enlarge your kernel by about
-  12 KB. If in doubt, say Y.
-
-SCSI logging facility
-CONFIG_SCSI_LOGGING
-  This turns on a logging facility that can be used to debug a number
-  of SCSI related problems.
-
-  If you say Y here, no logging output will appear by default, but you
-  can enable logging by saying Y to "/proc file system support" and
-  "Sysctl support" below and executing the command
-
-     echo "scsi log token [level]" > /proc/scsi/scsi
-
-  at boot time after the /proc file system has been mounted.
-
-  There are a number of things that can be used for 'token' (you can
-  find them in the source: <file:drivers/scsi/scsi.c>), and this
-  allows you to select the types of information you want, and the
-  level allows you to select the level of verbosity.
-
-  If you say N here, it may be harder to track down some types of SCSI
-  problems. If you say Y here your kernel will be somewhat larger, but
-  there should be no noticeable performance impact as long as you have
-  logging turned off.
-
-SGI WD93C93 SCSI Driver
-CONFIG_SCSI_SGIWD93
-  Say Y here to support the on-board WD93C93 SCSI controller found (a)
-  on the Indigo2 and other MIPS-based SGI machines, and (b) on ARCS
-  ARM-based machines.
-
-DEC NCR53C94 SCSI Driver
-CONFIG_SCSI_DECNCR
-  Say Y here to support the NCR53C94 SCSI controller chips on IOASIC
-  based TURBOchannel DECstations and TURBOchannel PMAZ-A cards.
-
-AdvanSys SCSI support
-CONFIG_SCSI_ADVANSYS
-  This is a driver for all SCSI host adapters manufactured by
-  AdvanSys. It is documented in the kernel source in
-  <file:drivers/scsi/advansys.c>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  The module will be called
-  advansys.o.
-
-Adaptec AHA152X/2825 support
-CONFIG_SCSI_AHA152X
-  This is a driver for the AHA-1510, AHA-1520, AHA-1522, and AHA-2825
-  SCSI host adapters. It also works for the AVA-1505, but the IRQ etc.
-  must be manually specified in this case.
-
-  It is explained in section 3.3 of the SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>. You might also want to
-  read the file <file:drivers/scsi/README.aha152x>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called aha152x.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Adaptec AHA1542 support
-CONFIG_SCSI_AHA1542
-  This is support for a SCSI host adapter.  It is explained in section
-  3.4 of the SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.  Note that Trantor was
-  purchased by Adaptec, and some former Trantor products are being
-  sold under the Adaptec name.  If it doesn't work out of the box, you
-  may have to change some settings in <file:drivers/scsi/aha1542.h>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called aha1542.o.
-
-Adaptec AHA1740 support
-CONFIG_SCSI_AHA1740
-  This is support for a SCSI host adapter.  It is explained in section
-  3.5 of the SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.  If it doesn't work out
-  of the box, you may have to change some settings in
-  <file:drivers/scsi/aha1740.h>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called aha1740.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Adaptec AIC7xxx support
-CONFIG_SCSI_AIC7XXX
-  This driver supports all of Adaptec's PCI based SCSI controllers
-  (not the hardware RAID controllers though) as well as the aic7770
-  based EISA and VLB SCSI controllers (the 274x and 284x series).
-  This is an Adaptec sponsored driver written by Justin Gibbs.  It is
-  intended to replace the previous aic7xxx driver maintained by Doug
-  Ledford since Doug is no longer maintaining that driver.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called aic7xxx.o.
-
-Adaptec I2O RAID support
-CONFIG_SCSI_DPT_I2O
-  This driver supports all of Adaptec's I2O based RAID controllers as 
-  well as the DPT SmartRaid V cards.  This is an Adaptec maintained
-  driver by Deanna Bonds.  See <file:drivers/scsi/README.dpti>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  The module will be called
-  dpt_i2o.o.
-
-Default number of TCQ commands per device
-CONFIG_AIC7XXX_CMDS_PER_DEVICE
-  Specify the number of commands you would like to allocate per SCSI
-  device when Tagged Command Queueing (TCQ) is enabled on that device.
-
-  This is an upper bound value for the number of tagged transactions
-  to be used for any device.  The aic7xxx driver will automatically
-  vary this number based on device behaviour.  For devices with a
-  fixed maximum, the driver will eventually lock to this maximum
-  and display a console message indicating this value.
-
-  Note: Unless you experience some type of device failure, the default
-       value, no enforced limit, should work for you.
-
-  Default: 253
-
-Delay in seconds after SCSI bus reset
-CONFIG_AIC7XXX_RESET_DELAY_MS
-  The number of milliseconds to delay after an initial bus reset.
-  The bus settle delay following all error recovery actions is
-  dictated by the SCSI layer and is not affected by this value.
-
-  Default: 15000 (15 seconds)
-
-Build Adapter Firmware with Kernel Build
-CONFIG_AIC7XXX_BUILD_FIRMWARE
-  This option should only be enabled if you are modifying the firmware
-  source to the aic7xxx driver and wish to have the generated firmware
-  include files updated during a normal kernel build.  The assembler
-  for the firmware requires lex and yacc or their equivalents, as well
-  as the db v1 library.  You may have to install additional packages
-  or modify the assembler make file or the files it includes if your
-  build environment is different than that of the author.
-
-Old Adaptec AIC7xxx support
-CONFIG_SCSI_AIC7XXX_OLD
-  WARNING This driver is an older aic7xxx driver and is no longer
-  under active development.  Adaptec, Inc. is writing a new driver to
-  take the place of this one, and it is recommended that whenever
-  possible, people should use the new Adaptec written driver instead
-  of this one.  This driver will eventually be phased out entirely.
-
-  This is support for the various aic7xxx based Adaptec SCSI
-  controllers. These include the 274x EISA cards; 284x VLB cards;
-  2902, 2910, 293x, 294x, 394x, 3985 and several other PCI and
-  motherboard based SCSI controllers from Adaptec. It does not support
-  the AAA-13x RAID controllers from Adaptec, nor will it likely ever
-  support them. It does not support the 2920 cards from Adaptec that
-  use the Future Domain SCSI controller chip. For those cards, you
-  need the "Future Domain 16xx SCSI support" driver.
-
-  In general, if the controller is based on an Adaptec SCSI controller
-  chip from the aic777x series or the aic78xx series, this driver
-  should work. The only exception is the 7810 which is specifically
-  not supported (that's the RAID controller chip on the AAA-13x
-  cards).
-
-  Note that the AHA2920 SCSI host adapter is *not* supported by this
-  driver; choose "Future Domain 16xx SCSI support" instead if you have
-  one of those.
-
-  Information on the configuration options for this controller can be
-  found by checking the help file for each of the available
-  configuration options. You should read
-  <file:drivers/scsi/aic7xxx_old/README.aic7xxx> at a minimum before
-  contacting the maintainer with any questions.  The SCSI-HOWTO,
-  available from <http://www.tldp.org/docs.html#howto>, can also
-  be of great help.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called aic7xxx_old.o.
-
-Enable tagged command queueing (TCQ) by default
-CONFIG_AIC7XXX_OLD_TCQ_ON_BY_DEFAULT
-  This option causes the aic7xxx driver to attempt to use Tagged
-  Command Queueing (TCQ) on all devices that claim to support it.
-
-  TCQ is a feature of SCSI-2 which improves performance: the host
-  adapter can send several SCSI commands to a device's queue even if
-  previous commands haven't finished yet.  Because the device is
-  intelligent, it can optimize its operations (like head positioning)
-  based on its own request queue.  Not all devices implement this
-  correctly.
-
-  If you say Y here, you can still turn off TCQ on troublesome devices
-  with the use of the tag_info boot parameter.  See the file
-  <file:drivers/scsi/README.aic7xxx> for more information on that and
-  other aic7xxx setup commands.  If this option is turned off, you may
-  still enable TCQ on known good devices by use of the tag_info boot
-  parameter.
-
-  If you are unsure about your devices then it is safest to say N
-  here.
-
-  However, TCQ can increase performance on some hard drives by as much
-  as 50% or more, so it is recommended that if you say N here, you
-  should at least read the <file:drivers/scsi/README.aic7xxx> file so
-  you will know how to enable this option manually should your drives
-  prove to be safe in regards to TCQ.
-
-  Conversely, certain drives are known to lock up or cause bus resets
-  when TCQ is enabled on them.  If you have a Western Digital
-  Enterprise SCSI drive for instance, then don't even bother to enable
-  TCQ on it as the drive will become unreliable, and it will actually
-  reduce performance.
-
-Default number of TCQ commands per device
-CONFIG_AIC7XXX_OLD_CMDS_PER_DEVICE
-  Specify the number of commands you would like to allocate per SCSI
-  device when Tagged Command Queueing (TCQ) is enabled on that device.
-
-  Reasonable figures are in the range of 8 to 24 commands per device,
-  but depending on hardware could be increased or decreased from that
-  figure. If the number is too high for any particular device, the
-  driver will automatically compensate usually after only 10 minutes
-  of uptime. It will not hinder performance if some of your devices
-  eventually have their command depth reduced, but is a waste of
-  memory if all of your devices end up reducing this number down to a
-  more reasonable figure.
-
-  NOTE: Certain very broken drives are known to lock up when given
-  more commands than they like to deal with. Quantum Fireball drives
-  are the most common in this category. For the Quantum Fireball
-  drives it is suggested to use no more than 8 commands per device.
-
-  Default: 8
-
-Collect statistics to report in /proc
-CONFIG_AIC7XXX_OLD_PROC_STATS
-  This option tells the driver to keep track of how many commands have
-  been sent to each particular device and report that information to
-  the user via the /proc/scsi/aic7xxx/n file, where n is the number of
-  the aic7xxx controller you want the information on. This adds a
-  small amount of overhead to each and every SCSI command the aic7xxx
-  driver handles, so if you aren't really interested in this
-  information, it is best to leave it disabled. This will only work if
-  you also say Y to "/proc file system support", below.
-
-  If unsure, say N.
-
-IBM ServeRAID support
-CONFIG_SCSI_IPS
-  This is support for the IBM ServeRAID hardware RAID controllers.
-  See <http://www.developer.ibm.com/welcome/netfinity/serveraid.html>
-  for more information.  If this driver does not work correctly
-  without modification please contact the author by email at
-  ipslinux@us.ibm.com.
-
-  You can build this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  but only a single instance may be loaded. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-  The module will be called ips.o.
-
-BusLogic SCSI support
-CONFIG_SCSI_BUSLOGIC
-  This is support for BusLogic MultiMaster and FlashPoint SCSI Host
-  Adapters. Consult the SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>, and the files
-  <file:drivers/scsi/README.BusLogic> and
-  <file:drivers/scsi/README.FlashPoint> for more information. If this
-  driver does not work correctly without modification, please contact
-  the author, Leonard N. Zubkoff, by email to lnz@dandelion.com.
-
-  You can also build this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  but only a single instance may be loaded. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-  The module will be called BusLogic.o.
-
-Omit BusLogic SCSI FlashPoint support
-CONFIG_SCSI_OMIT_FLASHPOINT
-  This option allows you to omit the FlashPoint support from the
-  BusLogic SCSI driver. The FlashPoint SCCB Manager code is
-  substantial, so users of MultiMaster Host Adapters may wish to omit
-  it.
-
-Compaq Fibre Channel 64-bit/66Mhz HBA support
-CONFIG_SCSI_CPQFCTS
-  Say Y here to compile in support for the Compaq StorageWorks Fibre
-  Channel 64-bit/66Mhz Host Bus Adapter.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called cpqfc.o.
-
-DMX3191D SCSI support
-CONFIG_SCSI_DMX3191D
-  This is support for Domex DMX3191D SCSI Host Adapters.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called dmx3191d.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-DTC3180/3280 SCSI support
-CONFIG_SCSI_DTC3280
-  This is support for DTC 3180/3280 SCSI Host Adapters.  Please read
-  the SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>, and the file
-  <file:drivers/scsi/README.dtc3x80>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called dtc.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-EATA-DMA [Obsolete] (DPT, NEC, AT&T, SNI, AST, Olivetti, Alphatronix) support
-CONFIG_SCSI_EATA_DMA
-  This is support for the EATA-DMA protocol compliant SCSI Host
-  Adapters like the SmartCache III/IV, SmartRAID controller families
-  and the DPT PM2011B and PM2012B controllers.
-
-  Note that this driver is obsolete; if you have one of the above
-  SCSI Host Adapters, you should normally say N here and Y to "EATA
-  ISA/EISA/PCI support", below.  Please read the SCSI-HOWTO, available
-  from <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called eata_dma.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-EATA-PIO (old DPT PM2001, PM2012A) support
-CONFIG_SCSI_EATA_PIO
-  This driver supports all EATA-PIO protocol compliant SCSI Host
-  Adapters like the DPT PM2001 and the PM2012A.  EATA-DMA compliant
-  host adapters could also use this driver but are discouraged from
-  doing so, since this driver only supports hard disks and lacks
-  numerous features.  You might want to have a look at the SCSI-HOWTO,
-  available from <http://www.tldp.org/docs.html#howto>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called eata_pio.o.
-
-UltraStor 14F/34F support
-CONFIG_SCSI_U14_34F
-  This is support for the UltraStor 14F and 34F SCSI-2 host adapters.
-  The source at <file:drivers/scsi/u14-34f.c> contains some
-  information about this hardware.  If the driver doesn't work out of
-  the box, you may have to change some settings in
-  <file: drivers/scsi/u14-34f.c>.  Read the SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.  Note that there is also
-  another driver for the same hardware: "UltraStor SCSI support",
-  below.  You should say Y to both only if you want 24F support as
-  well.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called u14-34f.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-enable elevator sorting
-CONFIG_SCSI_U14_34F_LINKED_COMMANDS
-  This option enables elevator sorting for all probed SCSI disks and
-  CD-ROMs. It definitely reduces the average seek distance when doing
-  random seeks, but this does not necessarily result in a noticeable
-  performance improvement: your mileage may vary...
-
-  The safe answer is N.
-
-maximum number of queued commands
-CONFIG_SCSI_U14_34F_MAX_TAGS
-  This specifies how many SCSI commands can be maximally queued for
-  each probed SCSI device. You should reduce the default value of 8
-  only if you have disks with buggy or limited tagged command support.
-  Minimum is 2 and maximum is 14. This value is also the window size
-  used by the elevator sorting option above. The effective value used
-  by the driver for each probed SCSI device is reported at boot time.
-
-Future Domain 16xx SCSI/AHA-2920A support
-CONFIG_SCSI_FUTURE_DOMAIN
-  This is support for Future Domain's 16-bit SCSI host adapters
-  (TMC-1660/1680, TMC-1650/1670, TMC-3260, TMC-1610M/MER/MEX) and
-  other adapters based on the Future Domain chipsets (Quantum
-  ISA-200S, ISA-250MG; Adaptec AHA-2920A; and at least one IBM board).
-  It is explained in section 3.7 of the SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  NOTE: Newer Adaptec AHA-2920C boards use the Adaptec AIC-7850 chip
-  and should use the aic7xxx driver ("Adaptec AIC7xxx chipset SCSI
-  controller support"). This Future Domain driver works with the older
-  Adaptec AHA-2920A boards with a Future Domain chip on them.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called fdomain.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Future Domain MCS-600/700 SCSI support
-CONFIG_SCSI_FD_MCS
-  This is support for Future Domain MCS 600/700 MCA SCSI adapters.
-  Some PS/2 computers are equipped with IBM Fast SCSI Adapter/A which
-  is identical to the MCS 700 and hence also supported by this driver.
-  This driver also supports the Reply SB16/SCSI card (the SCSI part).
-  It supports multiple adapters in the same system.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called fd_mcs.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Generic NCR5380/53c400 SCSI support
-CONFIG_SCSI_GENERIC_NCR5380
-  This is the generic NCR family of SCSI controllers, not to be
-  confused with the NCR 53c7 or 8xx controllers.  It is explained in
-  section 3.8 of the SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.  If it doesn't work out
-  of the box, you may have to change some settings in
-  <file:drivers/scsi/g_NCR5380.h>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called g_NCR5380.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-Enable NCR53c400 extensions
-CONFIG_SCSI_GENERIC_NCR53C400
-  This enables certain optimizations for the NCR53c400 SCSI cards.
-  You might as well try it out.  Note that this driver will only probe
-  for the Trantor T130B in its default configuration; you might have
-  to pass a command line option to the kernel at boot time if it does
-  not detect your card.  See the file
-  <file:drivers/scsi/README.g_NCR5380> for details.
-
-# Choice: ncr5380
-NCR5380/53c400 mapping method (use Port for T130B)
-CONFIG_SCSI_G_NCR5380_PORT
-  The NCR5380 and NCR53c400 SCSI controllers come in two varieties:
-  port or memory mapped. You should know what you have. The most
-  common card, Trantor T130B, uses port mapped mode.
-
-NCR Dual 700 MCA SCSI support
-CONFIG_SCSI_NCR_D700
-  This is a driver for the MicroChannel Dual 700 card produced by
-  NCR and commonly used in 345x/35xx/4100 class machines.  It always
-  tries to negotiate sync and uses tag command queueing.
-
-  Unless you have an NCR manufactured machine, the chances are that
-  you do not have this SCSI card, so say N.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called NCR_D700.o.
-
-HP LASI SCSI support for 53c700/710
-CONFIG_SCSI_LASI700
-  This is a driver for the lasi baseboard in some parisc machines
-  which is based on the 53c700 chip.  Will also support LASI subsystems
-  based on the 710 chip using 700 emulation mode.
-
-  Unless you know you have a 53c700 or 53c710 based lasi, say N here
-
-NCR53c7,8xx SCSI support
-CONFIG_SCSI_NCR53C7xx
-  This is a driver for the 53c7 and 8xx NCR family of SCSI
-  controllers, not to be confused with the NCR 5380 controllers.  It
-  is explained in section 3.8 of the SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.  If it doesn't work out
-  of the box, you may have to change some settings in
-  <file:drivers/scsi/53c7,8xx.h>.  Please read
-  <file:drivers/scsi/README.ncr53c7xx> for the available boot time
-  command line options.
-
-  Note: there is another driver for the 53c8xx family of controllers
-  ("NCR53C8XX SCSI support" below).  If you want to use them both, you
-  need to say M to both and build them as modules, but only one may be
-  active at a time. If you have a 53c8xx board, it's better to use the
-  other driver.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called 53c7,8xx.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-Always negotiate synchronous transfers
-CONFIG_SCSI_NCR53C7xx_sync
-  In general, this is good; however, it is a bit dangerous since there
-  are some broken SCSI devices out there. Take your chances. Safe bet
-  is N.
-
-Allow FAST-SCSI [10MHz]
-CONFIG_SCSI_NCR53C7xx_FAST
-  This will enable 10MHz FAST-SCSI transfers with your host
-  adapter. Some systems have problems with that speed, so it's safest
-  to say N here.
-
-Allow DISCONNECT
-CONFIG_SCSI_NCR53C7xx_DISCONNECT
-  This enables the disconnect/reconnect feature of the NCR SCSI
-  controller. When you say Y here, a slow SCSI device will not lock
-  the SCSI bus while processing a request, allowing simultaneous use
-  of e.g. a SCSI hard disk and SCSI tape or CD-ROM drive, and
-  providing much better performance when using slow and fast SCSI
-  devices at the same time. Some devices, however, do not operate
-  properly with this option enabled, and will cause your SCSI system
-  to hang, which might cause a system crash. The safe answer
-  therefore is to say N.
-
-SYM53C8XX Version 2 SCSI support
-CONFIG_SCSI_SYM53C8XX_2
-  This driver supports the whole NCR53C8XX/SYM53C8XX family of 
-  PCI-SCSI controllers. It also supports the subset of LSI53C10XX 
-  Ultra-160 controllers that are based on the SYM53C8XX SCRIPTS 
-  language. It does not support LSI53C10XX Ultra-320 PCI-X SCSI 
-  controllers.
-
-  If your system has problems using this new major version of the
-  SYM53C8XX driver, you may switch back to driver version 1.
-
-  Please read <file:drivers/scsi/sym53c8xx_2/Documentation.txt> for more
-  information.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called sym53c8xx.o.
-
-PCI DMA addressing mode
-CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE
-  This option only applies to PCI-SCSI chip that are PCI DAC capable 
-  (875A, 895A, 896, 1010-33, 1010-66, 1000).
-
-  When set to 0, only PCI 32 bit DMA addressing (SAC) will be performed.
-  When set to 1, 40 bit DMA addressing (with upper 24 bits of address 
-  set to zero) is supported. The addressable range is here 1 TB.
-  When set to 2, full 64 bits of address for DMA are supported, but only
-  16 segments of 4 GB can be addressed. The addressable range is so 
-  limited to 64 GB.
-
-  The safest value is 0 (32 bit DMA addressing) that is guessed to still 
-  fit most of real machines.
-
-  The preferred value 1 (40 bit DMA addressing) should make happy 
-  properly engineered PCI DAC capable host bridges. You may configure
-  this option for Intel platforms with more than 4 GB of memory.
-
-  The still experimental value 2 (64 bit DMA addressing with 16 x 4GB 
-  segments limitation) can be used on systems that require PCI address 
-  bits past bit 39 to be set for the addressing of memory using PCI 
-  DAC cycles.
-
-use normal IO
-CONFIG_SCSI_SYM53C8XX_IOMAPPED
-  If you say Y here, the driver will preferently use normal IO rather than 
-  memory mapped IO.
-
-maximum number of queued commands
-CONFIG_SCSI_SYM53C8XX_MAX_TAGS
-  This option allows you to specify the maximum number of commands
-  that can be queued to any device, when tagged command queuing is
-  possible. The driver supports up to 256 queued commands per device.
-  This value is used as a compiled-in hard limit.
-
-default tagged command queue depth
-CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS
-  This is the default value of the command queue depth the driver will 
-  announce to the generic SCSI layer for devices that support tagged 
-  command queueing. This value can be changed from the boot command line.
-  This is a soft limit that cannot exceed CONFIG_SCSI_SYM53C8XX_MAX_TAGS.
-
-NCR53C8XX SCSI support
-CONFIG_SCSI_NCR53C8XX
-  This is the BSD ncr driver adapted to Linux for the NCR53C8XX family
-  of PCI-SCSI controllers.  This driver supports parity checking,
-  tagged command queuing and fast synchronous data transfers up to 80
-  MB/s with wide FAST-40 LVD devices and controllers.
-
-  Recent versions of the 53C8XX chips are better supported by the
-  option "SYM53C8XX SCSI support", below.
-
-  Note: there is yet another driver for the 53c8xx family of
-  controllers ("NCR53c7,8xx SCSI support" above).  If you want to use
-  them both, you need to say M to both and build them as modules, but
-  only one may be active at a time.  If you have a 53c8xx board, you
-  probably do not want to use the "NCR53c7,8xx SCSI support".
-
-  Please read <file:drivers/scsi/README.ncr53c8xx> for more
-  information.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called ncr53c8xx.o.
-
-SYM53C8XX Version 1 SCSI support
-CONFIG_SCSI_SYM53C8XX
-  This driver supports all the features of recent 53C8XX chips (used
-  in PCI SCSI controllers), notably the hardware phase mismatch
-  feature of the SYM53C896.
-
-  Older versions of the 53C8XX chips are not supported by this
-  driver.  If your system uses either a 810 rev. < 16, a 815, or a 825
-  rev. < 16 PCI SCSI processor, you must use the generic NCR53C8XX
-  driver ("NCR53C8XX SCSI support" above) or configure both the
-  NCR53C8XX and this SYM53C8XX drivers either as module or linked to
-  the kernel image.
-
-  When both drivers are linked into the kernel, the SYM53C8XX driver
-  is called first at initialization and you can use the 'excl=ioaddr'
-  driver boot option to exclude attachment of adapters by the
-  SYM53C8XX driver.  For example, entering
-  'sym53c8xx=excl:0xb400,excl=0xc000' at the lilo prompt prevents
-  adapters at io address 0xb400 and 0xc000 from being attached by the
-  SYM53C8XX driver, thus allowing the NCR53C8XX driver to attach them.
-  The 'excl' option is also supported by the NCR53C8XX driver.
-
-  Please read <file:drivers/scsi/README.ncr53c8xx> for more
-  information.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called sym53c8xx.o.
-
-Synchronous transfer frequency in MHz
-CONFIG_SCSI_NCR53C8XX_SYNC
-  The SCSI Parallel Interface-2 Standard defines 5 classes of transfer
-  rates: FAST-5, FAST-10, FAST-20, FAST-40 and FAST-80.  The numbers
-  are respectively the maximum data transfer rates in mega-transfers
-  per second for each class.  For example, a FAST-20 Wide 16 device is
-  able to transfer data at 20 million 16 bit packets per second for a
-  total rate of 40 MB/s.
-
-  You may specify 0 if you want to only use asynchronous data
-  transfers. This is the safest and slowest option. Otherwise, specify
-  a value between 5 and 80, depending on the capability of your SCSI
-  controller.  The higher the number, the faster the data transfer.
-  Note that 80 should normally be ok since the driver decreases the
-  value automatically according to the controller's capabilities.
-
-  Your answer to this question is ignored for controllers with NVRAM,
-  since the driver will get this information from the user set-up.  It
-  also can be overridden using a boot setup option, as follows
-  (example): 'ncr53c8xx=sync:12' will allow the driver to negotiate
-  for FAST-20 synchronous data transfer (20 mega-transfers per
-  second).
-
-  The normal answer therefore is not to go with the default but to
-  select the maximum value 80 allowing the driver to use the maximum
-  value supported by each controller. If this causes problems with
-  your SCSI devices, you should come back and decrease the value.
-
-  There is no safe option other than using good cabling, right
-  terminations and SCSI conformant devices.
-
-Use normal IO
-CONFIG_SCSI_NCR53C8XX_IOMAPPED
-  If you say Y here, the driver will use normal IO, as opposed to
-  memory mapped IO. Memory mapped IO has less latency than normal IO
-  and works for most Intel-based hardware. Under Linux/Alpha only
-  normal IO is currently supported by the driver and so, this option
-  has no effect on those systems.
-
-  The normal answer therefore is N; try Y only if you encounter SCSI
-  related problems.
-
-Not allow targets to disconnect
-CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT
-  This option is only provided for safety if you suspect some SCSI
-  device of yours to not support properly the target-disconnect
-  feature. In that case, you would say Y here. In general however, to
-  not allow targets to disconnect is not reasonable if there is more
-  than 1 device on a SCSI bus. The normal answer therefore is N.
-
-Default tagged command queue depth
-CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS
-  "Tagged command queuing" is a feature of SCSI-2 which improves
-  performance: the host adapter can send several SCSI commands to a
-  device's queue even if previous commands haven't finished yet.
-  Because the device is intelligent, it can optimize its operations
-  (like head positioning) based on its own request queue. Some SCSI
-  devices don't implement this properly; if you want to disable this
-  feature, enter 0 or 1 here (it doesn't matter which).
-
-  The default value is 8 and should be supported by most hard disks.
-  This value can be overridden from the boot command line using the
-  'tags' option as follows (example):
-  'ncr53c8xx=tags:4/t2t3q16/t0u2q10' will set default queue depth to
-  4, set queue depth to 16 for target 2 and target 3 on controller 0
-  and set queue depth to 10 for target 0 / lun 2 on controller 1.
-
-  The normal answer therefore is to go with the default 8 and to use
-  a boot command line option for devices that need to use a different
-  command queue depth.
-
-  There is no safe option other than using good SCSI devices.
-
-Maximum number of queued commands
-CONFIG_SCSI_NCR53C8XX_MAX_TAGS
-  This option allows you to specify the maximum number of commands
-  that can be queued to any device, when tagged command queuing is
-  possible. The default value is 32. Minimum is 2, maximum is 64.
-  Modern hard disks are able to support 64 tags and even more, but
-  do not seem to be faster when more than 32 tags are being used.
-
-  So, the normal answer here is to go with the default value 32 unless
-  you are using very large hard disks with large cache (>= 1 MB) that
-  are able to take advantage of more than 32 tagged commands.
-
-  There is no safe option and the default answer is recommended.
-
-Assume boards are SYMBIOS compatible
-CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT
-  This option allows you to enable some features depending on GPIO
-  wiring. These General Purpose Input/Output pins can be used for
-  vendor specific features or implementation of the standard SYMBIOS
-  features. Genuine SYMBIOS controllers use GPIO0 in output for
-  controller LED and GPIO3 bit as a flag indicating
-  singled-ended/differential interface. The Tekram DC-390U/F boards
-  uses a different GPIO wiring.
-
-  Your answer to this question is ignored if all your controllers have
-  NVRAM, since the driver is able to detect the board type from the
-  NVRAM format.
-
-  If all the controllers in your system are genuine SYMBIOS boards or
-  use BIOS and drivers from SYMBIOS, you would want to say Y here,
-  otherwise N. N is the safe answer.
-
-Enable traffic profiling
-CONFIG_SCSI_NCR53C8XX_PROFILE
-  This option allows you to enable profiling information gathering.
-  These statistics are not very accurate due to the low frequency
-  of the kernel clock (100 Hz on i386) and have performance impact
-  on systems that use very fast devices.
-
-  The normal answer therefore is N.
-
-Include support for the NCR PQS/PDS SCSI card
-CONFIG_SCSI_NCR53C8XX_PQS_PDS
-  Say Y here if you have a special SCSI adapter produced by NCR
-  corporation called a PCI Quad SCSI or PCI Dual SCSI. You do not need
-  this if you do not have one of these adapters. However, since this
-  device is detected as a specific PCI device, this option is quite
-  safe.
-
-  The common answer here is N, but answering Y is safe.
-
-Workbit NinjaSCSI-32Bi/UDE support
-CONFIG_SCSI_NSP32
-  This is support for the Workbit NinjaSCSI-32Bi/UDE PCI/Cardbus
-  SCSI host adapter. Please read the SCSI-HOWTO, available from
-  <http://www.linuxdoc.org/docs.html#howto>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called nsp32.o.
-
-IBMMCA SCSI support
-CONFIG_SCSI_IBMMCA
-  This is support for the IBM SCSI adapter found in many of the PS/2
-  series computers.  These machines have an MCA bus, so you need to
-  answer Y to "MCA support" as well and read
-  <file:Documentation/mca.txt>.
-
-  If the adapter isn't found during boot (a common problem for models
-  56, 57, 76, and 77) you'll need to use the 'ibmmcascsi=<pun>' kernel
-  option, where <pun> is the id of the SCSI subsystem (usually 7, but
-  if that doesn't work check your reference diskette).  Owners of
-  model 95 with a LED-matrix-display can in addition activate some
-  activity info like under OS/2, but more informative, by setting
-  'ibmmcascsi=display' as an additional kernel parameter.  Try "man
-  bootparam" or see the documentation of your boot loader about how to
-  pass options to the kernel.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called ibmmca.o.
-
-Standard SCSI-order
-CONFIG_IBMMCA_SCSI_ORDER_STANDARD
-  In the PC-world and in most modern SCSI-BIOS-setups, SCSI-hard disks
-  are assigned to the drive letters, starting with the lowest SCSI-id
-  (physical number -- pun) to be drive C:, as seen from DOS and
-  similar operating systems. When looking into papers describing the
-  ANSI-SCSI-standard, this assignment of drives appears to be wrong.
-  The SCSI-standard follows a hardware-hierarchy which says that id 7
-  has the highest priority and id 0 the lowest. Therefore, the host
-  adapters are still today everywhere placed as SCSI-id 7 by default.
-  In the SCSI-standard, the drive letters express the priority of the
-  disk. C: should be the hard disk, or a partition on it, with the
-  highest priority. This must therefore be the disk with the highest
-  SCSI-id (e.g. 6) and not the one with the lowest! IBM-BIOS kept the
-  original definition of the SCSI-standard as also industrial- and
-  process-control-machines, like VME-CPUs running under realtime-OSes
-  (e.g. LynxOS, OS9) do.
-
-  If you like to run Linux on your MCA-machine with the same
-  assignment of hard disks as seen from e.g. DOS or OS/2 on your
-  machine, which is in addition conformant to the SCSI-standard, you
-  must say Y here. This is also necessary for MCA-Linux users who want
-  to keep downward compatibility to older releases of the
-  IBM-MCA-SCSI-driver (older than driver-release 2.00 and older than
-  June 1997).
-
-  If you like to have the lowest SCSI-id assigned as drive C:, as
-  modern SCSI-BIOSes do, which does not conform to the standard, but
-  is widespread and common in the PC-world of today, you must say N
-  here. If unsure, say Y.
-
-Reset SCSI-devices at boot time
-CONFIG_IBMMCA_SCSI_DEV_RESET
-  By default, SCSI-devices are reset when the machine is powered on.
-  However, some devices exist, like special-control-devices,
-  SCSI-CNC-machines, SCSI-printer or scanners of older type, that do
-  not reset when switched on. If you say Y here, each device connected
-  to your SCSI-bus will be issued a reset-command after it has been
-  probed, while the kernel is booting. This may cause problems with
-  more modern devices, like hard disks, which do not appreciate these
-  reset commands, and can cause your system to hang. So say Y only if
-  you know that one of your older devices needs it; N is the safe
-  answer.
-
-NCR MCA 53C9x SCSI support
-CONFIG_SCSI_MCA_53C9X
-  Some MicroChannel machines, notably the NCR 35xx line, use a SCSI
-  controller based on the NCR 53C94.  This driver will allow use of
-  the controller on the 3550, and very possibly others.
-
-  If you want to compile this as a module (= code which can be
-  inserted and removed from the running kernel whenever you want), say
-  M here and read <file:Documentation/modules.txt>.  The module will
-  be called mca_53c9x.o.
-
-Always IN2000 SCSI support
-CONFIG_SCSI_IN2000
-  This is support for an ISA bus SCSI host adapter.  You'll find more
-  information in <file:drivers/scsi/README.in2000>. If it doesn't work
-  out of the box, you may have to change the jumpers for IRQ or
-  address selection.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called in2000.o.
-
-Initio 91XXU(W) SCSI support
-CONFIG_SCSI_INITIO
-  This is support for the Initio 91XXU(W) SCSI host adapter.  Please
-  read the SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called initio.o.
-
-PAS16 SCSI support
-CONFIG_SCSI_PAS16
-  This is support for a SCSI host adapter.  It is explained in section
-  3.10 of the SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.  If it doesn't work out
-  of the box, you may have to change some settings in
-  <file:drivers/scsi/pas16.h>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called pas16.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Initio INI-A100U2W SCSI support
-CONFIG_SCSI_INIA100
-  This is support for the Initio INI-A100U2W SCSI host adapter.
-  Please read the SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called a100u2w.o.
-
-PCI2000 support
-CONFIG_SCSI_PCI2000
-  This is support for the PCI2000I EIDE interface card which acts as a
-  SCSI host adapter.  Please read the SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module called pci2000.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want).  If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-PCI2220i support
-CONFIG_SCSI_PCI2220I
-  This is support for the PCI2220i EIDE interface card which acts as a
-  SCSI host adapter.  Please read the SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module called pci2220i.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want).  If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-PSI240i support
-CONFIG_SCSI_PSI240I
-  This is support for the PSI240i EIDE interface card which acts as a
-  SCSI host adapter.  Please read the SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module called psi240i.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want).  If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Qlogic FAS SCSI support
-CONFIG_SCSI_QLOGIC_FAS
-  This is a driver for the ISA, VLB, and PCMCIA versions of the Qlogic
-  FastSCSI! cards as well as any other card based on the FASXX chip
-  (including the Control Concepts SCSI/IDE/SIO/PIO/FDC cards).
-
-  This driver does NOT support the PCI versions of these cards. The
-  PCI versions are supported by the Qlogic ISP driver ("Qlogic ISP
-  SCSI support"), below.
-
-  Information about this driver is contained in
-  <file:drivers/scsi/README.qlogicfas>.  You should also read the
-  SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called qlogicfas.o. If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-Qlogic ISP SCSI support
-CONFIG_SCSI_QLOGIC_ISP
-  This driver works for all QLogic PCI SCSI host adapters (IQ-PCI,
-  IQ-PCI-10, IQ_PCI-D) except for the PCI-basic card.  (This latter
-  card is supported by the "AM53/79C974 PCI SCSI" driver.)
-
-  If you say Y here, make sure to choose "BIOS" at the question "PCI
-  access mode".
-
-  Please read the file <file:drivers/scsi/README.qlogicisp>.  You
-  should also read the SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called qlogicisp.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-Qlogic ISP FC SCSI support
-CONFIG_SCSI_QLOGIC_FC
-  This is a driver for the QLogic ISP2100 SCSI-FCP host adapter.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called qlogicfc.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-Include loadable firmware in driver
-CONFIG_SCSI_QLOGIC_FC_FIRMWARE
-  Say Y to include ISP2100 Fabric Initiator/Target Firmware, with
-  expanded LUN addressing and FcTape (FCP-2) support, in the
-  Qlogic QLA 1280 driver. This is required on some platforms.
-
-Qlogic QLA 1280 SCSI support
-CONFIG_SCSI_QLOGIC_1280
-  Say Y if you have a QLogic ISP1x80/1x160 SCSI host adapter.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called qla1280.o. If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-Seagate ST-02 and Future Domain TMC-8xx SCSI support
-CONFIG_SCSI_SEAGATE
-  These are 8-bit SCSI controllers; the ST-01 is also supported by
-  this driver.  It is explained in section 3.9 of the SCSI-HOWTO,
-  available from <http://www.tldp.org/docs.html#howto>.  If it
-  doesn't work out of the box, you may have to change some settings in
-  <file:drivers/scsi/seagate.h>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called seagate.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Trantor T128/T128F/T228 SCSI support
-CONFIG_SCSI_T128
-  This is support for a SCSI host adapter. It is explained in section
-  3.11 of the SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.  If it doesn't work out
-  of the box, you may have to change some settings in
-  <file:drivers/scsi/t128.h>.  Note that Trantor was purchased by
-  Adaptec, and some former Trantor products are being sold under the
-  Adaptec name.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called t128.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-UltraStor SCSI support
-CONFIG_SCSI_ULTRASTOR
-  This is support for the UltraStor 14F, 24F and 34F SCSI-2 host
-  adapter family.  This driver is explained in section 3.12 of the
-  SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.  If it doesn't work out
-  of the box, you may have to change some settings in
-  <file:drivers/scsi/ultrastor.h>.
-
-  Note that there is also another driver for the same hardware:
-  "UltraStor 14F/34F support", above.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called ultrastor.o.
-
-7000FASST SCSI support
-CONFIG_SCSI_7000FASST
-  This driver supports the Western Digital 7000 SCSI host adapter
-  family.  Some information is in the source:
-  <file:drivers/scsi/wd7000.c>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called wd7000.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-ACARD SCSI support
-CONFIG_SCSI_ACARD
-  This driver supports the ACARD 870U/W SCSI host adapter.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called atp870u.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-EATA ISA/EISA/PCI (DPT and generic EATA/DMA-compliant boards) support
-CONFIG_SCSI_EATA
-  This driver supports all EATA/DMA-compliant SCSI host adapters.  DPT
-  ISA and all EISA I/O addresses are probed looking for the "EATA"
-  signature.  If you chose "BIOS" at the question "PCI access mode",
-  the addresses of all the PCI SCSI controllers reported by the PCI
-  subsystem are probed as well.
-
-  You want to read the start of <file:drivers/scsi/eata.c> and the
-  SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  Note that there is also another driver for the same hardware
-  available: "EATA-DMA [Obsolete] (DPT, NEC, AT&T, SNI, AST, Olivetti,
-  Alphatronix) support". You should say Y to only one of them.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called eata.o.
-
-enable tagged command queueing
-CONFIG_SCSI_EATA_TAGGED_QUEUE
-  This is a feature of SCSI-2 which improves performance: the host
-  adapter can send several SCSI commands to a device's queue even if
-  previous commands haven't finished yet. Most EATA adapters negotiate
-  this feature automatically with the device, even if your answer is
-  N. The safe answer is N.
-
-enable elevator sorting
-CONFIG_SCSI_EATA_LINKED_COMMANDS
-  This option enables elevator sorting for all probed SCSI disks and
-  CD-ROMs. It definitely reduces the average seek distance when doing
-  random seeks, but this does not necessarily result in a noticeable
-  performance improvement: your mileage may vary...
-  The safe answer is N.
-
-maximum number of queued commands
-CONFIG_SCSI_EATA_MAX_TAGS
-  This specifies how many SCSI commands can be maximally queued for
-  each probed SCSI device. You should reduce the default value of 16
-  only if you have disks with buggy or limited tagged command support.
-  Minimum is 2 and maximum is 62. This value is also the window size
-  used by the elevator sorting option above. The effective value used
-  by the driver for each probed SCSI device is reported at boot time.
-
-NCR53c406a SCSI support
-CONFIG_SCSI_NCR53C406A
-  This is support for the NCR53c406a SCSI host adapter.  For user
-  configurable parameters, check out <file:drivers/scsi/NCR53c406a.c>
-  in the kernel source.  Also read the SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called NCR53c406.o.
-
-Symbios 53c416 SCSI support
-CONFIG_SCSI_SYM53C416
-  This is support for the sym53c416 SCSI host adapter, the SCSI
-  adapter that comes with some HP scanners. This driver requires that
-  the sym53c416 is configured first using some sort of PnP
-  configuration program (e.g. isapnp) or by a PnP aware BIOS. If you
-  are using isapnp then you need to compile this driver as a module
-  and then load it using insmod after isapnp has run. The parameters
-  of the configured card(s) should be passed to the driver. The format
-  is:
-
-    insmod sym53c416 sym53c416=<base>,<irq> [sym53c416_1=<base>,<irq>]
-
-  There is support for up to four adapters. If you want to compile
-  this driver as a module ( = code which can be inserted in and
-  removed from the running kernel whenever you want), say M here and
-  read <file:Documentation/modules.txt>. The module will be called
-  sym53c416.o.
-
-Simple 53c710 SCSI support (Compaq, NCR machines)
-CONFIG_SCSI_SIM710
-  This is a simple driver for NCR53c710 based SCSI host adapters.
-
-  More complex drivers for this chip are available ("NCR53c7,8xx SCSI
-  support", above), but they require that the scsi chip be able to do
-  DMA block moves between memory and on-chip registers, which can
-  cause problems under certain conditions.  This driver is designed to
-  avoid these problems and is intended to work with any Intel machines
-  using 53c710 chips, including various Compaq and NCR machines.
-
-  Please read the comments at the top of the file
-  <file:drivers/scsi/sim710.c> for more information.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called sim710.o.
-
-Tekram DC390(T) and Am53/79C974 SCSI support
-CONFIG_SCSI_DC390T
-  This driver supports PCI SCSI host adapters based on the Am53C974A
-  chip, e.g. Tekram DC390(T), DawiControl 2974 and some onboard
-  PCscsi/PCnet (Am53/79C974) solutions.
-
-  Documentation can be found in <file:drivers/scsi/README.tmscsim>.
-
-  Note that this driver does NOT support Tekram DC390W/U/F, which are
-  based on NCR/Symbios chips. Use "NCR53C8XX SCSI support" for those.
-  Also note that there is another generic Am53C974 driver,
-  "AM53/79C974 PCI SCSI support" below.  You can pick either one.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called tmscsim.o.
-
-Omit support for other Am53/79C974 based SCSI adapters
-CONFIG_SCSI_DC390T_NOGENSUPP
-  If you say N here, the DC390(T) SCSI driver relies on the DC390
-  EEPROM to get initial values for its settings, such as speed,
-  termination, etc.  If it can't find this EEPROM, it will use
-  defaults or the user supplied boot/module parameters.  For details
-  on driver configuration see <file:drivers/scsi/README.tmscsim>.
-
-  If you say Y here and if no EEPROM is found, the driver gives up and
-  thus only supports Tekram DC390(T) adapters.  This can be useful if
-  you have a DC390(T) and another Am53C974 based adapter, which, for
-  some reason, you want to drive with the other AM53C974 driver.
-
-  If unsure, say N.
-
-AM53/79C974 PCI SCSI support
-CONFIG_SCSI_AM53C974
-  This is support for the AM53/79C974 SCSI host adapters.  Please read
-  <file:drivers/scsi/README.AM53C974> for details.  Also, the
-  SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>, is for you.
-
-  Note that there is another driver for AM53C974 based adapters:
-  "Tekram DC390(T) and Am53/79C974 (PCscsi) SCSI support", above.  You
-  can pick either one.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called AM53C974.o.
-
-AMI MegaRAID support
-CONFIG_SCSI_MEGARAID
-  This driver supports the AMI MegaRAID 418, 428, 438, 466, 762, 490
-  and 467 SCSI host adapters.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called megaraid.o.
-
-Intel/ICP (former GDT SCSI Disk Array) RAID Controller support
-CONFIG_SCSI_GDTH
-  Formerly called GDT SCSI Disk Array Controller Support.
-  This is a driver for RAID/SCSI Disk Array Controllers (EISA/ISA/PCI) 
-  manufactured by Intel/ICP vortex (an Intel Company). It is documented
-  in the kernel source in <file:drivers/scsi/gdth.c> and
-  <file:drivers/scsi/gdth.h.>
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called gdth.o.
-
-IOMEGA parallel port (ppa - older drives)
-CONFIG_SCSI_PPA
-  This driver supports older versions of IOMEGA's parallel port ZIP
-  drive (a 100 MB removable media device).
-
-  Note that you can say N here if you have the SCSI version of the ZIP
-  drive: it will be supported automatically if you said Y to the
-  generic "SCSI disk support", above.
-
-  If you have the ZIP Plus drive or a more recent parallel port ZIP
-  drive (if the supplied cable with the drive is labeled "AutoDetect")
-  then you should say N here and Y to "IOMEGA parallel port (imm -
-  newer drives)", below.
-
-  For more information about this driver and how to use it you should
-  read the file <file:drivers/scsi/README.ppa>.  You should also read
-  the SCSI-HOWTO, which is available from
-  <http://www.tldp.org/docs.html#howto>.  If you use this driver,
-  you will still be able to use the parallel port for other tasks,
-  such as a printer; it is safe to compile both drivers into the
-  kernel.
-
-  This driver is also available as a module which can be inserted in
-  and removed from the running kernel whenever you want.  To compile
-  this driver as a module, say M here and read
-  <file:Documentation/modules.txt>.  The module will be called ppa.o.
-
-IOMEGA parallel port (imm - newer drives)
-CONFIG_SCSI_IMM
-  This driver supports newer versions of IOMEGA's parallel port ZIP
-  drive (a 100 MB removable media device).
-
-  Note that you can say N here if you have the SCSI version of the ZIP
-  drive: it will be supported automatically if you said Y to the
-  generic "SCSI disk support", above.
-
-  If you have the ZIP Plus drive or a more recent parallel port ZIP
-  drive (if the supplied cable with the drive is labeled "AutoDetect")
-  then you should say Y here; if you have an older ZIP drive, say N
-  here and Y to "IOMEGA Parallel Port (ppa - older drives)", above.
-
-  For more information about this driver and how to use it you should
-  read the file <file:drivers/scsi/README.ppa>.  You should also read
-  the SCSI-HOWTO, which is available from
-  <http://www.tldp.org/docs.html#howto>.  If you use this driver,
-  you will still be able to use the parallel port for other tasks,
-  such as a printer; it is safe to compile both drivers into the
-  kernel.
-
-  This driver is also available as a module which can be inserted in
-  and removed from the running kernel whenever you want.  To compile
-  this driver as a module, say M here and read
-  <file:Documentation/modules.txt>.  The module will be called imm.o.
-
-Force the Iomega ZIP drivers to use EPP-16
-CONFIG_SCSI_IZIP_EPP16
-  EPP (Enhanced Parallel Port) is a standard for parallel ports which
-  allows them to act as expansion buses that can handle up to 64
-  peripheral devices.
-
-  Some parallel port chipsets are slower than their motherboard, and
-  so we have to control the state of the chipset's FIFO queue every
-  now and then to avoid data loss. This will be done if you say Y
-  here.
-
-  Generally, saying Y is the safe option and slows things down a bit.
-
-Assume slow parallel port control register
-CONFIG_SCSI_IZIP_SLOW_CTR
-  Some parallel ports are known to have excessive delays between
-  changing the parallel port control register and good data being
-  available on the parallel port data/status register. This option
-  forces a small delay (1.0 usec to be exact) after changing the
-  control register to let things settle out. Enabling this option may
-  result in a big drop in performance but some very old parallel ports
-  (found in 386 vintage machines) will not work properly.
-
-  Generally, saying N is fine.
-
-SCSI debugging host simulator
-CONFIG_SCSI_DEBUG
-  This is a host adapter simulator that can be programmed to simulate
-  a large number of conditions that could occur on a real bus. The
-  advantage is that many hard to reproduce problems can be tested in a
-  controlled environment where there is reduced risk of losing
-  important data. This is primarily of use to people trying to debug
-  the middle and upper layers of the SCSI subsystem. If unsure, say N.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called scsi_debug.o.
-
-Fibre Channel and FC4 SCSI support
-CONFIG_FC4
-  Fibre Channel is a high speed serial protocol mainly used to
-  connect large storage devices to the computer; it is compatible with
-  and intended to replace SCSI.
-
-  This is an experimental support for storage arrays connected to your
-  computer using optical fibre cables and the "X3.269-199X Fibre
-  Channel Protocol for SCSI" specification. If you want to use this,
-  you need to say Y here and to "SCSI support" as well as to the
-  drivers for the storage array itself and for the interface adapter
-  such as SOC or SOC+. This subsystem could even serve for IP
-  networking, with some code extensions.
-
-  If unsure, say N.
-
-Sun SOC/Sbus
-CONFIG_FC4_SOC
-  Serial Optical Channel is an interface card with one or two Fibre
-  Optic ports, each of which can be connected to a disk array. Note
-  that if you have older firmware in the card, you'll need the
-  microcode from the Solaris driver to make it work.
-
-  This support is also available as a module called soc.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Sun SOC+ (aka SOCAL)
-CONFIG_FC4_SOCAL
-  Serial Optical Channel Plus is an interface card with up to two
-  Fibre Optic ports. This card supports FC Arbitrated Loop (usually
-  A5000 or internal FC disks in E[3-6]000 machines through the
-  Interface Board). You'll probably need the microcode from the
-  Solaris driver to make it work.
-
-  This support is also available as a module called socal.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-SparcSTORAGE Array 100 and 200 series
-CONFIG_SCSI_PLUTO
-  If you never bought a disk array made by Sun, go with N.
-
-  This support is also available as a module called pluto.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Sun Enterprise Network Array (A5000 and EX500)
-CONFIG_SCSI_FCAL
-  This driver drives FC-AL disks connected through a Fibre Channel
-  card using the drivers/fc4 layer (currently only SOCAL). The most
-  common is either A5000 array or internal disks in E[3-6]000
-  machines.
-
-  This support is also available as a module called fcal.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>. If unsure, say N.
-
-Acorn SCSI card (aka30) support
-CONFIG_SCSI_ACORNSCSI_3
-  This enables support for the Acorn SCSI card (aka30). If you have an
-  Acorn system with one of these, say Y. If unsure, say N.
-
-Support SCSI 2 Tagged queueing
-CONFIG_SCSI_ACORNSCSI_TAGGED_QUEUE
-  Say Y here to enable tagged queuing support on the Acorn SCSI card.
-
-  This is a feature of SCSI-2 which improves performance: the host
-  adapter can send several SCSI commands to a device's queue even if
-  previous commands haven't finished yet. Some SCSI devices don't
-  implement this properly, so the safe answer is N.
-
-Support SCSI 2 Synchronous Transfers
-CONFIG_SCSI_ACORNSCSI_SYNC
-  Say Y here to enable synchronous transfer negotiation with all
-  targets on the Acorn SCSI card.
-
-  In general, this improves performance; however some SCSI devices
-  don't implement it properly, so the safe answer is N.
-
-ARXE SCSI support
-CONFIG_SCSI_ARXESCSI
-  Around 1991, Arxe Systems Limited released a high density floppy
-  disc interface for the Acorn Archimedes range, to allow the use of
-  HD discs from the then new A5000 on earlier models. This interface
-  was either sold on its own or with an integral SCSI controller.
-  Technical details on this NCR53c94-based device are available at
-  <http://www.cryton.demon.co.uk/acornbits/scsi_arxe.html>
-  Say Y here to compile in support for the SCSI controller.
-
-Oak SCSI support
-CONFIG_SCSI_OAK1
-  This enables support for the Oak SCSI card. If you have an Acorn
-  system with one of these, say Y. If unsure, say N.
-
-Cumana SCSI I support
-CONFIG_SCSI_CUMANA_1
-  This enables support for the Cumana SCSI I card. If you have an
-  Acorn system with one of these, say Y. If unsure, say N.
-
-Cumana SCSI II support
-CONFIG_SCSI_CUMANA_2
-  This enables support for the Cumana SCSI II card. If you have an
-  Acorn system with one of these, say Y. If unsure, say N.
-
-EcoSCSI support
-CONFIG_SCSI_ECOSCSI
-  This enables support for the EcoSCSI card -- a small card that sits
-  in the Econet socket. If you have an Acorn system with one of these,
-  say Y. If unsure, say N.
-
-EESOX SCSI support
-CONFIG_SCSI_EESOXSCSI
-  This enables support for the EESOX SCSI card. If you have an Acorn
-  system with one of these, say Y, otherwise say N.
-
-PowerTec SCSI support
-CONFIG_SCSI_POWERTECSCSI
-  This enables support for the Powertec SCSI card on Acorn systems. If
-  you have one of these, say Y. If unsure, say N.
-
-IEEE 1394 (FireWire) support
-CONFIG_IEEE1394
-  IEEE 1394 describes a high performance serial bus, which is also
-  known as FireWire(tm) or i.Link(tm) and is used for connecting all
-  sorts of devices (most notably digital video cameras) to your
-  computer.
-
-  If you have FireWire hardware and want to use it, say Y here.  This
-  is the core support only, you will also need to select a driver for
-  your IEEE 1394 adapter.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called ieee1394.o.
-
-Texas Instruments PCILynx support
-CONFIG_IEEE1394_PCILYNX
-  Say Y here if you have an IEEE-1394 controller with the Texas
-  Instruments PCILynx chip.  Note: this driver is written for revision
-  2 of this chip and may not work with revision 0.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called pcilynx.o.
-
-Use local RAM on PCILynx board
-CONFIG_IEEE1394_PCILYNX_LOCALRAM
-  This option makes the PCILynx driver use local RAM available on some
-  PCILynx setups for Packet Control Lists. Local RAM is random access
-  memory which resides on the PCILynx board as opposed to on your
-  computer's motherboard. Local RAM may speed up command processing
-  because no PCI transfers are necessary during use of the Packet
-  Control Lists.
-
-  Note that there are no known PCILynx systems providing local RAM
-  except for the evaluation boards by Texas Instruments and that the
-  PCILynx does not reliably report missing RAM. This means that it is
-  dangerous to say Y here if you are not absolutely sure that your
-  board provides 64KB of local RAM.
-
-  If unsure, say N.
-
-Support for non-IEEE1394 local ports
-CONFIG_IEEE1394_PCILYNX_PORTS
-  This option enables driver code to access the RAM, ROM and AUX ports
-  of the PCILynx through character devices in /dev.  If you don't know
-  what this is about then you won't need it.
-
-  If unsure, say N.
-
-#Adaptec AIC-5800 IEEE 1394 support
-#CONFIG_IEEE1394_AIC5800
-#  Say Y here if you have a IEEE 1394 controller using the Adaptec
-#  AIC-5800 chip.  All Adaptec host adapters (89xx series) use this
-#  chip, as well as miro's DV boards.
-#
-#  If you want to compile this as a module ( = code which can be
-#  inserted in and removed from the running kernel whenever you want),
-#  say M here and read <file:Documentation/modules.txt>.  The module
-#  will be called aic5800.o.
-#
-OHCI-1394 (Open Host Controller Interface) support
-CONFIG_IEEE1394_OHCI1394
-  Enable this driver if you have an IEEE 1394 controller based on the
-  OHCI-1394 specification. The current driver is only tested with OHCI
-  chipsets made by Texas Instruments and NEC. Most third-party vendors
-  use one of these chipsets.  It should work with any OHCI-1394
-  compliant card, however.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called ohci1394.o.
-
-OHCI-1394 Video support
-CONFIG_IEEE1394_VIDEO1394
-  This option enables video device usage for OHCI-1394 cards.  Enable
-  this option only if you have an IEEE 1394 video device connected to
-  an OHCI-1394 card.
-
-SBP-2 support (Harddisks etc.)
-CONFIG_IEEE1394_SBP2
-  This option enables you to use SBP-2 devices connected to your IEEE
-  1394 bus.  SBP-2 devices include harddrives and DVD devices.
-
-Raw IEEE 1394 I/O support
-CONFIG_IEEE1394_RAWIO
-  Say Y here if you want support for the raw device. This is generally
-  a good idea, so you should say Y here. The raw device enables
-  direct communication of user programs with the IEEE 1394 bus and
-  thus with the attached peripherals.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called raw1394.o.
-
-Excessive debugging output
-CONFIG_IEEE1394_VERBOSEDEBUG
-  If you say Y here, you will get very verbose debugging logs from the
-  subsystem which includes a dump of the header of every sent and
-  received packet.  This can amount to a high amount of data collected
-  in a very short time which is usually also saved to disk by the
-  system logging daemons.
-
-  Say Y if you really want or need the debugging output, everyone else
-  says N.
-
-Network device support
-CONFIG_NETDEVICES
-  You can say N here if you don't intend to connect your Linux box to
-  any other computer at all or if all your connections will be over a
-  telephone line with a modem either via UUCP (UUCP is a protocol to
-  forward mail and news between unix hosts over telephone lines; read
-  the UUCP-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>) or dialing up a shell
-  account or a BBS, even using term (term is a program which gives you
-  almost full Internet connectivity if you have a regular dial up
-  shell account on some Internet connected Unix computer. Read
-  <http://www.bart.nl/~patrickr/term-howto/Term-HOWTO.html>).
-
-  You'll have to say Y if your computer contains a network card that
-  you want to use under Linux (make sure you know its name because you
-  will be asked for it and read the Ethernet-HOWTO (especially if you
-  plan to use more than one network card under Linux)) or if you want
-  to use SLIP (Serial Line Internet Protocol is the protocol used to
-  send Internet traffic over telephone lines or null modem cables) or
-  CSLIP (compressed SLIP) or PPP (Point to Point Protocol, a better
-  and newer replacement for SLIP) or PLIP (Parallel Line Internet
-  Protocol is mainly used to create a mini network by connecting the
-  parallel ports of two local machines) or AX.25/KISS (protocol for
-  sending Internet traffic over amateur radio links).
-
-  Make sure to read the NET-3-HOWTO. Eventually, you will have to read
-  Olaf Kirch's excellent and free book "Network Administrator's
-  Guide", to be found in <http://www.tldp.org/docs.html#guide>. If
-  unsure, say Y.
-
-Dummy net driver support
-CONFIG_DUMMY
-  This is essentially a bit-bucket device (i.e. traffic you send to
-  this device is consigned into oblivion) with a configurable IP
-  address. It is most commonly used in order to make your currently
-  inactive SLIP address seem like a real address for local programs.
-  If you use SLIP or PPP, you might want to say Y here. Since this
-  thing often comes in handy, the default is Y. It won't enlarge your
-  kernel either. What a deal. Read about it in the Network
-  Administrator's Guide, available from
-  <http://www.tldp.org/docs.html#guide>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called dummy.o.  If you want to use more than one dummy
-  device at a time, you need to compile this driver as a module.
-  Instead of 'dummy', the devices will then be called 'dummy0',
-  'dummy1' etc.
-
-Bonding driver support
-CONFIG_BONDING
-  Say 'Y' or 'M' if you wish to be able to 'bond' multiple Ethernet
-  Channels together. This is called 'Etherchannel' by Cisco,
-  'Trunking' by Sun, and 'Bonding' in Linux.
-
-  If you have two Ethernet connections to some other computer, you can
-  make them behave like one double speed connection using this driver.
-  Naturally, this has to be supported at the other end as well, either
-  with a similar Bonding Linux driver, a Cisco 5500 switch or a
-  SunTrunking SunSoft driver.
-
-  This is similar to the EQL driver, but it merges Ethernet segments
-  instead of serial lines.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called bonding.o.
-
-SLIP (serial line) support
-CONFIG_SLIP
-  Say Y if you intend to use SLIP or CSLIP (compressed SLIP) to
-  connect to your Internet service provider or to connect to some
-  other local Unix box or if you want to configure your Linux box as a
-  Slip/CSlip server for other people to dial in. SLIP (Serial Line
-  Internet Protocol) is a protocol used to send Internet traffic over
-  serial connections such as telephone lines or null modem cables;
-  nowadays, the protocol PPP is more commonly used for this same
-  purpose.
-
-  Normally, your access provider has to support SLIP in order for you
-  to be able to use it, but there is now a SLIP emulator called SLiRP
-  around (available from
-  <ftp://ibiblio.org/pub/Linux/system/network/serial/>) which
-  allows you to use SLIP over a regular dial up shell connection. If
-  you plan to use SLiRP, make sure to say Y to CSLIP, below. The
-  NET-3-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>, explains how to
-  configure SLIP. Note that you don't need this option if you just
-  want to run term (term is a program which gives you almost full
-  Internet connectivity if you have a regular dial up shell account on
-  some Internet connected Unix computer. Read
-  <http://www.bart.nl/~patrickr/term-howto/Term-HOWTO.html>). SLIP
-  support will enlarge your kernel by about 4 KB. If unsure, say N.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt> as well as
-  <file:Documentation/networking/net-modules.txt>. The module will be
-  called slip.o.
-
-CSLIP compressed headers
-CONFIG_SLIP_COMPRESSED
-  This protocol is faster than SLIP because it uses compression on the
-  TCP/IP headers (not on the data itself), but it has to be supported
-  on both ends. Ask your access provider if you are not sure and
-  answer Y, just in case. You will still be able to use plain SLIP. If
-  you plan to use SLiRP, the SLIP emulator (available from
-  <ftp://ibiblio.org/pub/Linux/system/network/serial/>) which
-  allows you to use SLIP over a regular dial up shell connection, you
-  definitely want to say Y here. The NET-3-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>, explains how to configure
-  CSLIP. This won't enlarge your kernel.
-
-Keepalive and linefill
-CONFIG_SLIP_SMART
-  Adds additional capabilities to the SLIP driver to support the
-  RELCOM line fill and keepalive monitoring. Ideal on poor quality
-  analogue lines.
-
-Six bit SLIP encapsulation
-CONFIG_SLIP_MODE_SLIP6
-  Just occasionally you may need to run IP over hostile serial
-  networks that don't pass all control characters or are only seven
-  bit. Saying Y here adds an extra mode you can use with SLIP:
-  "slip6". In this mode, SLIP will only send normal ASCII symbols over
-  the serial device. Naturally, this has to be supported at the other
-  end of the link as well. It's good enough, for example, to run IP
-  over the async ports of a Camtec JNT Pad. If unsure, say N.
-
-PPP (point-to-point protocol) support
-CONFIG_PPP
-  PPP (Point to Point Protocol) is a newer and better SLIP.  It serves
-  the same purpose: sending Internet traffic over telephone (and other
-  serial) lines.  Ask your access provider if they support it, because
-  otherwise you can't use it; most Internet access providers these
-  days support PPP rather than SLIP.
-
-  To use PPP, you need an additional program called pppd as described
-  in the PPP-HOWTO, available at
-  <http://www.tldp.org/docs.html#howto>.  Make sure that you have
-  the version of pppd recommended in <file:Documentation/Changes>.
-  The PPP option enlarges your kernel by about 16 KB.
-
-  There are actually two versions of PPP: the traditional PPP for
-  asynchronous lines, such as regular analog phone lines, and
-  synchronous PPP which can be used over digital ISDN lines for
-  example.  If you want to use PPP over phone lines or other
-  asynchronous serial lines, you need to say Y (or M) here and also to
-  the next option, "PPP support for async serial ports".  For PPP over
-  synchronous lines, you should say Y (or M) here and to "Support
-  synchronous PPP", below.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you said Y to "Version information on all symbols" above, then
-  you cannot compile the PPP driver into the kernel; you can then only
-  compile it as a module.  The module will be called ppp_generic.o.
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt> as well as
-  <file:Documentation/networking/net-modules.txt>.
-
-PPP multilink support
-CONFIG_PPP_MULTILINK
-  PPP multilink is a protocol (defined in RFC 1990) which allows you
-  to combine several (logical or physical) lines into one logical PPP
-  connection, so that you can utilize your full bandwidth.
-
-  This has to be supported at the other end as well and you need a
-  version of the pppd daemon which understands the multilink protocol.
-
-  If unsure, say N.
-
-PPP filtering
-CONFIG_PPP_FILTER
-  Say Y here if you want to be able to filter the packets passing over
-  PPP interfaces.  This allows you to control which packets count as
-  activity (i.e. which packets will reset the idle timer or bring up
-  a demand-dialled link) and which packets are to be dropped entirely.
-  You need to say Y here if you wish to use the pass-filter and
-  active-filter options to pppd.
-
-  If unsure, say N.
-
-PPP support for async serial ports
-CONFIG_PPP_ASYNC
-  Say Y (or M) here if you want to be able to use PPP over standard
-  asynchronous serial ports, such as COM1 or COM2 on a PC.  If you use
-  a modem (not a synchronous or ISDN modem) to contact your ISP, you
-  need this option.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called ppp_async.o.
-
-  If unsure, say Y.
-
-PPP support for sync tty ports
-CONFIG_PPP_SYNC_TTY
-  Say Y (or M) here if you want to be able to use PPP over synchronous
-  (HDLC) tty devices, such as the SyncLink adapter. These devices
-  are often used for high-speed leased lines like T1/E1.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called ppp_synctty.o.
-
-PPP Deflate compression
-CONFIG_PPP_DEFLATE
-  Support for the Deflate compression method for PPP, which uses the
-  Deflate algorithm (the same algorithm that gzip uses) to compress
-  each PPP packet before it is sent over the wire.  The machine at the
-  other end of the PPP link (usually your ISP) has to support the
-  Deflate compression method as well for this to be useful.  Even if
-  they don't support it, it is safe to say Y here.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called ppp_deflate.o.
-
-PPP BSD-Compress compression
-CONFIG_PPP_BSDCOMP
-  Support for the BSD-Compress compression method for PPP, which uses
-  the LZW compression method to compress each PPP packet before it is
-  sent over the wire. The machine at the other end of the PPP link
-  (usually your ISP) has to support the BSD-Compress compression
-  method as well for this to be useful. Even if they don't support it,
-  it is safe to say Y here.
-
-  The PPP Deflate compression method ("PPP Deflate compression",
-  above) is preferable to BSD-Compress, because it compresses better
-  and is patent-free.
-
-  Note that the BSD compression code will always be compiled as a
-  module; it is called bsd_comp.o and will show up in the directory
-  modules once you have said "make modules". If unsure, say N.
-
-PPP over Ethernet
-CONFIG_PPPOE
-  Support for PPP over Ethernet.
-
-  This driver requires the current pppd from the "ppp" CVS repository
-  on cvs.samba.org.  The required support will be present in the next
-  ppp release (2.4.2).
-
-Wireless LAN (non-hamradio)
-CONFIG_NET_RADIO
-  Support for wireless LANs and everything having to do with radio,
-  but not with amateur radio or FM broadcasting.
-
-  Saying Y here also enables the Wireless Extensions (creates
-  /proc/net/wireless and enables ifconfig access). The Wireless
-  Extension is a generic API allowing a driver to expose to the user
-  space configuration and statistics specific to common Wireless LANs.
-  The beauty of it is that a single set of tool can support all the
-  variations of Wireless LANs, regardless of their type (as long as
-  the driver supports Wireless Extension). Another advantage is that
-  these parameters may be changed on the fly without restarting the
-  driver (or Linux). If you wish to use Wireless Extensions with
-  wireless PCMCIA (PC-) cards, you need to say Y here; you can fetch
-  the tools from
-  <http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html>.
-
-  Some user-level drivers for scarab devices which don't require
-  special kernel support are available from
-  <ftp://shadow.cabi.net/pub/Linux/>.
-
-STRIP (Metricom Starmode radio IP)
-CONFIG_STRIP
-  Say Y if you have a Metricom radio and intend to use Starmode Radio
-  IP. STRIP is a radio protocol developed for the MosquitoNet project
-  (on the WWW at <http://mosquitonet.stanford.edu/>) to send Internet
-  traffic using Metricom radios.  Metricom radios are small, battery
-  powered, 100kbit/sec packet radio transceivers, about the size and
-  weight of a cellular telephone. (You may also have heard them called
-  "Metricom modems" but we avoid the term "modem" because it misleads
-  many people into thinking that you can plug a Metricom modem into a
-  phone line and use it as a modem.)
-
-  You can use STRIP on any Linux machine with a serial port, although
-  it is obviously most useful for people with laptop computers. If you
-  think you might get a Metricom radio in the future, there is no harm
-  in saying Y to STRIP now, except that it makes the kernel a bit
-  bigger.
-
-  You can also compile this as a module ( = code which can be inserted
-  in and removed from the running kernel whenever you want), say M
-  here and read <file:Documentation/modules.txt>.  The module will be
-  called strip.o.
-
-AT&T WaveLAN & DEC RoamAbout DS support
-CONFIG_WAVELAN
-  The Lucent WaveLAN (formerly NCR and AT&T; or DEC RoamAbout DS) is
-  a Radio LAN (wireless Ethernet-like Local Area Network) using the
-  radio frequencies 900 MHz and 2.4 GHz.
-
-  This driver support the ISA version of the WaveLAN card.  A separate
-  driver for the PCMCIA (PC-card) hardware is available in David
-  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
-  for location).
-
-  If you want to use an ISA WaveLAN card under Linux, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>. Some more specific
-  information is contained in
-  <file:Documentation/networking/wavelan.txt> and in the source code
-  <file:drivers/net/wavelan.p.h>.
-
-  You will also need the wireless tools package available from
-  <http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html>.
-  Please read the man pages contained therein.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called wavelan.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-Aironet Arlan 655 & IC2200 DS support
-CONFIG_ARLAN
-  Aironet makes Arlan, a class of wireless LAN adapters. These use the
-  www.Telxon.com chip, which is also used on several similar cards.
-  This driver is tested on the 655 and IC2200 series cards. Look at
-  <http://www.ylenurme.ee/~elmer/655/> for the latest information.
-
-  The driver is built as two modules, arlan and arlan-proc. The latter
-  is the /proc interface and is not needed most of time.
-
-  On some computers the card ends up in non-valid state after some
-  time. Use a ping-reset script to clear it.
-
-Aironet 4500/4800 series adapters
-CONFIG_AIRONET4500
-  www.aironet.com (recently bought by Cisco) makes these 802.11 DS
-  adapters.  Driver by Elmer Joandi (elmer@ylenurme.ee).
-
-  Say Y here if you have such an adapter, and then say Y below to
-  the option that applies to your particular type of card (PCI, ISA,
-  or PCMCIA).
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called aironet4500_core.o. If you want to
-  compile it as a module, say M here and read
-  <file:Documentation/modules.txt> as well as
-  <file:Documentation/networking/net-modules.txt>.
-
-  quick config parameters:
-       SSID=tsunami - "The Password"
-       adhoc=1         there are no Access Points around
-       master=1        Adhoc master (the one who creates network
-                        sync)
-       slave=1         Adhoc slave (btw, it is still forming own net
-                       sometimes, and has problems with firmware...
-                       change IbssJoinNetTimeout from /proc...)
-       channel=1..?    meaningful in adhoc mode
-
-  If you have problems with screwing up card, both_bap_lock=1 is a
-  conservative value (performance hit 15%).
-
-  All other parameters can be set via the proc interface.
-
-Aironet 4500/4800 ISA/PCI/PNP/365 support
-CONFIG_AIRONET4500_NONCS
-  If you have an ISA, PCI or PCMCIA Aironet 4500/4800 wireless LAN
-  card, say Y here, and then also to the options below that apply
-  to you.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called aironet4500_card.o.  If you want to
-  compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-Aironet 4500/4800 PNP support
-CONFIG_AIRONET4500_PNP
-  If you have an ISA Aironet 4500/4800 card which you want to use in
-  PnP (Plug and Play) mode, say Y here. This is the recommended mode
-  for ISA cards. Remember however to enable the PnP jumper on the
-  board if you say Y here.
-
-Aironet 4500/4800 PCI support
-CONFIG_AIRONET4500_PCI
-  If you have an PCI Aironet 4500/4800 card, say Y here.
-
-Aironet 4500/4800 ISA broken support
-CONFIG_AIRONET4500_ISA
-  If you have an ISA Aironet 4500/4800 card which you want to run in
-  non-PnP mode, say Y here. This is not recommended and does not work
-  correctly at this point. Say N.
-
-Aironet 4500/4800 I365 broken support
-CONFIG_AIRONET4500_I365
-  If you have a PCMCIA Aironet 4500/4800 card which you want to use
-  without the standard PCMCIA cardservices provided by the pcmcia-cs
-  package, say Y here. This is not recommended, so say N.
-
-Aironet 4500/4800 PCMCIA support
-CONFIG_AIRONET4500_CS
-  Say Y here if you have a PCMCIA Aironet 4500/4800 card which you
-  want to use with the standard PCMCIA cardservices provided by the
-  pcmcia-cs package.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called aironet4500_cs.o. If you want to
-  compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-Aironet 4500/4800 PROC interface
-CONFIG_AIRONET4500_PROC
-  If you say Y here (and to the "/proc file system" below), you will
-  be able to configure your Aironet card via the
-  /proc/sys/aironet4500 interface.
-
-  Additional info: look in <file:drivers/net/aironet4500_rid.c>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called aironet4500_proc.o. If you want to
-  compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-  NOTE: the proc interface uses a lot of memory, so it is recommended
-        to compile it as a module and remove the module after
-        configuration.
-
-LAPB over Ethernet driver
-CONFIG_LAPBETHER
-  This is a driver for a pseudo device (typically called /dev/lapb0)
-  which allows you to open an LAPB point-to-point connection to some
-  other computer on your Ethernet network.  In order to do this, you
-  need to say Y or M to the driver for your Ethernet card as well as
-  to "LAPB Data Link Driver".
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called lapbether.o.  If unsure, say N.
-
-X.25 async driver
-CONFIG_X25_ASY
-  This is a driver for sending and receiving X.25 frames over regular
-  asynchronous serial lines such as telephone lines equipped with
-  ordinary modems.  Experts should note that this driver doesn't
-  currently comply with the asynchronous HDLS framing protocols in
-  CCITT recommendation X.25.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called x25_asy.o.  If unsure, say N.
-
-PCMCIA network device support
-CONFIG_NET_PCMCIA
-  Say Y if you would like to include support for any PCMCIA or CardBus
-  network adapters, then say Y to the driver for your particular card
-  below.  PCMCIA- or PC-cards are credit-card size devices often used
-  with laptops computers; CardBus is the newer and faster version of
-  PCMCIA.
-
-  To use your PC-cards, you will need supporting software from David
-  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
-  for location).  You also want to check out the PCMCIA-HOWTO,
-  available from <http://www.tldp.org/docs.html#howto>.
-
-  If unsure, say N.
-
-3Com 3c589 PCMCIA support
-CONFIG_PCMCIA_3C589
-  Say Y here if you intend to attach a 3Com 3c589 or compatible PCMCIA
-  (PC-card) Ethernet card to your computer.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called 3c589_cs.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>. If
-  unsure, say N.
-
-3Com 3c574 PCMCIA support
-CONFIG_PCMCIA_3C574
-  Say Y here if you intend to attach a 3Com 3c574 or compatible PCMCIA
-  (PC-card) Fast Ethernet card to your computer.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called 3c574_cs.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.  If
-  unsure, say N.
-
-Fujitsu FMV-J18x PCMCIA support
-CONFIG_PCMCIA_FMVJ18X
-  Say Y here if you intend to attach a Fujitsu FMV-J18x or compatible
-  PCMCIA (PC-card) Ethernet card to your computer.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called fmvj18x_cs.o.  If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-  If unsure, say N.
-
-NE2000 compatible PCMCIA support
-CONFIG_PCMCIA_PCNET
-  Say Y here if you intend to attach an NE2000 compatible PCMCIA
-  (PC-card) Ethernet or Fast Ethernet card to your computer.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called pcnet_cs.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>. If
-  unsure, say N.
-
-Asix AX88190 PCMCIA support
-CONFIG_PCMCIA_AXNET
-  Say Y here if you intend to attach an Asix AX88190-based PCMCIA
-  (PC-card) Fast Ethernet card to your computer.  These cards are
-  nearly NE2000 compatible but need a separate driver due to a few
-  misfeatures.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called axnet_cs.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.  If
-  unsure, say N.
-
-New Media PCMCIA support
-CONFIG_PCMCIA_NMCLAN
-  Say Y here if you intend to attach a New Media Ethernet or LiveWire
-  PCMCIA (PC-card) Ethernet card to your computer.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called nmclan_cs.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.  If
-  unsure, say N.
-
-SMC 91Cxx PCMCIA support
-CONFIG_PCMCIA_SMC91C92
-  Say Y here if you intend to attach an SMC 91Cxx compatible PCMCIA
-  (PC-card) Ethernet or Fast Ethernet card to your computer.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called smc91c92_cs.o.  If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-  If unsure, say N.
-
-Xircom 16-bit PCMCIA support
-CONFIG_PCMCIA_XIRC2PS
-  Say Y here if you intend to attach a Xircom 16-bit PCMCIA (PC-card)
-  Ethernet or Fast Ethernet card to your computer.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called xirc2ps_cs.o.  If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-  If unsure, say N.
-
-COM20020 ARCnet PCMCIA support
-CONFIG_ARCNET_COM20020_CS
-  Say Y here if you intend to attach this type of ARCnet PCMCIA card
-  to your computer.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called com20020_cs.o.  If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-  If unsure, say N.
-
-IBM PCMCIA Token Ring adapter support
-CONFIG_PCMCIA_IBMTR
-  Say Y here if you intend to attach this type of Token Ring PCMCIA
-  card to your computer. You then also need to say Y to "Token Ring
-  driver support".
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ibmtr_cs.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-Xircom Tulip-like CardBus support (old driver)
-CONFIG_PCMCIA_XIRTULIP
-  This driver is for the Digital "Tulip" Ethernet CardBus adapters.
-  It should work with most DEC 21*4*-based chips/ethercards, as well
-  as with work-alike chips from Lite-On (PNIC) and Macronix (MXIC) and
-  ASIX.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called xircom_tulip_cb.o.  If you want to compile
-  it as a module, say M here and read
-  <file:Documentation/modules.txt>. If unsure, say N.
-
-Xircom CardBus support (new driver)
-CONFIG_PCMCIA_XIRCOM
-  This driver is for the Digital "Tulip" Ethernet CardBus adapters.
-  It should work with most DEC 21*4*-based chips/ethercards, as well
-  as with work-alike chips from Lite-On (PNIC) and Macronix (MXIC) and
-  ASIX.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called xircom_cb.o.  If you want to compile
-  it as a module, say M here and read
-  <file:Documentation/modules.txt>. If unsure, say N.
-
-PCMCIA Wireless LAN
-CONFIG_NET_PCMCIA_RADIO
-  Say Y here if you would like to use a PCMCIA (PC-card) device to
-  connect to a wireless local area network. Then say Y to the driver
-  for your particular card below.
-
-  To use your PC-cards, you will need supporting software from David
-  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
-  for location). You also want to check out the PCMCIA-HOWTO,
-  available from <http://www.tldp.org/docs.html#howto>.
-
-Hermes chipset 802.11b support (Orinoco/Prism2/Symbol cards)
-CONFIG_HERMES
-  A driver for 802.11b wireless cards based based on the "Hermes" or
-  Intersil HFA384x (Prism 2) MAC controller.  This includes the vast
-  majority of the PCMCIA 802.11b cards (which are nearly all rebadges)
-  - except for the Cisco/Aironet cards.  Cards supported include the
-  Apple Airport (not a PCMCIA card), WavelanIEEE/Orinoco,
-  Cabletron/EnteraSys Roamabout, ELSA AirLancer, MELCO Buffalo, Avaya,
-  IBM High Rate Wireless, Farralon Syyline, Samsung MagicLAN, Netgear
-  MA401, LinkSys WPC-11, D-Link DWL-650, 3Com AirConnect, Intel
-  PRO/Wireless, and Symbol Spectrum24 High Rate amongst others.
-
-  This option includes the guts of the driver, but in order to
-  actually use a card you will also need to enable support for PCMCIA
-  Hermes cards, PLX9052 based PCI adaptors or the Apple Airport below.
-
-  You will also very likely also need the Wireless Tools in order to
-  configure your card and that /etc/pcmcia/wireless.opts works :
-  <http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html>
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called hermes.o.
-
-Hermes 802.11b in PLX9052 based PCI adaptor support
-CONFIG_PLX_HERMES
-  Enable support for PCMCIA cards supported by the "Hermes" (aka
-  orinoco_cs) driver when used in PLX9052 based PCI adaptors.  These
-  adaptors are not a full PCMCIA controller but act as a more limited
-  PCI <-> PCMCIA bridge.  Several vendors sell such adaptors so that
-  802.11b PCMCIA cards can be used in desktop machines.  The Netgear
-  MA301 is such an adaptor.
-
-  Support for these adaptors is so far still incomplete and buggy.
-  You have been warned.
-
-Prism 2.5 PCI 802.11b adaptor support
-CONFIG_PCI_HERMES
-  Enable support for PCI and mini-PCI 802.11b wireless NICs based on
-  the Prism 2.5 chipset.  These are true PCI cards, not the 802.11b
-  PCMCIA cards bundled with PCI<->PCMCIA adaptors which are also
-  common.  Some of the built-in wireless adaptors in laptops are of
-  this variety.
-
-Hermes support (Orinoco/WavelanIEEE/PrismII/Symbol 802.11b cards)
-CONFIG_PCMCIA_HERMES
-  A driver for "Hermes" chipset based PCMCIA wireless adaptors, such
-  as the Lucent WavelanIEEE/Orinoco cards and their OEM (Cabletron/
-  EnteraSys RoamAbout 802.11, ELSA Airlancer, Melco Buffalo and
-  others).  It should also be usable on various Prism II based cards
-  such as the Linksys, D-Link and Farallon Skyline.  It should also
-  work on Symbol cards such as the 3Com AirConnect and Ericsson WLAN.
-
-  To use your PC-cards, you will need supporting software from David
-  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
-  for location).  You also want to check out the PCMCIA-HOWTO,
-  available from <http://www.tldp.org/docs.html#howto>.
-
-  You will also very likely also need the Wireless Tools in order to
-  configure your card and that /etc/pcmcia/wireless.opts works:
-  <http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html>.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called orinoco_cs.o.
-
-Cisco/Aironet 34X/35X/4500/4800 ISA and PCI cards
-CONFIG_AIRO
-  This is the standard Linux driver to support Cisco/Aironet ISA and
-  PCI 802.11 wireless cards.
-  It supports the new 802.11b cards from Cisco (Cisco 34X, Cisco 35X
-  - with or without encryption) as well as card before the Cisco
-  acquisition (Aironet 4500, Aironet 4800, Aironet 4800B).
-
-  This driver support both the standard Linux Wireless Extensions
-  and Cisco proprietary API, so both the Linux Wireless Tools and the
-  Cisco Linux utilities can be used to configure the card.
-
-  The driver can be compiled as a module and will be named "airo.o".
-
-Cisco/Aironet 34X/35X/4500/4800 PCMCIA cards
-CONFIG_AIRO_CS
-  This is the standard Linux driver to support Cisco/Aironet PCMCIA
-  802.11 wireless cards.  This driver is the same as the Aironet
-  driver part of the Linux Pcmcia package.
-  It supports the new 802.11b cards from Cisco (Cisco 34X, Cisco 35X
-  - with or without encryption) as well as card before the Cisco
-  acquisition (Aironet 4500, Aironet 4800, Aironet 4800B). It also
-  supports OEM of Cisco such as the DELL TrueMobile 4800 and Xircom
-  802.11b cards.
-
-  This driver support both the standard Linux Wireless Extensions
-  and Cisco proprietary API, so both the Linux Wireless Tools and the
-  Cisco Linux utilities can be used to configure the card.
-
-  To use your PC-cards, you will need supporting software from David
-  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
-  for location).  You also want to check out the PCMCIA-HOWTO,
-  available from <http://www.tldp.org/docs.html#howto>.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called airo_cs.o.
-
-Aviator/Raytheon 2.4MHz wireless support
-CONFIG_PCMCIA_RAYCS
-  Say Y here if you intend to attach an Aviator/Raytheon PCMCIA
-  (PC-card) wireless Ethernet networking card to your computer.
-  Please read the file <file:Documentation/networking/ray_cs.txt> for
-  details.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ray_cs.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.  If
-  unsure, say N.
-
-Apple Airport support (built-in)
-CONFIG_APPLE_AIRPORT
-  Say Y here to support the Airport 802.11b wireless Ethernet hardware
-  built into the Macintosh iBook and other recent PowerPC-based
-  Macintosh machines. This is essentially a Lucent Orinoco card with 
-  a non-standard interface
-
-Xircom Netwave AirSurfer wireless support
-CONFIG_PCMCIA_NETWAVE
-  Say Y here if you intend to attach this type of PCMCIA (PC-card)
-  wireless Ethernet networking card to your computer.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called netwave_cs.o.  If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-  If unsure, say N.
-
-AT&T/Lucent Wavelan wireless support
-CONFIG_PCMCIA_WAVELAN
-  Say Y here if you intend to attach an AT&T/Lucent Wavelan PCMCIA
-  (PC-card) wireless Ethernet networking card to your computer.  This
-  driver is for the non-IEEE-802.11 Wavelan cards.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called wavelan_cs.o.  If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-  If unsure, say N.
-
-PLIP (parallel port) support
-CONFIG_PLIP
-  PLIP (Parallel Line Internet Protocol) is used to create a
-  reasonably fast mini network consisting of two (or, rarely, more)
-  local machines.  A PLIP link from a Linux box is a popular means to
-  install a Linux distribution on a machine which doesn't have a
-  CD-ROM drive (a minimal system has to be transferred with floppies
-  first). The kernels on both machines need to have this PLIP option
-  enabled for this to work.
-
-  The PLIP driver has two modes, mode 0 and mode 1.  The parallel
-  ports (the connectors at the computers with 25 holes) are connected
-  with "null printer" or "Turbo Laplink" cables which can transmit 4
-  bits at a time (mode 0) or with special PLIP cables, to be used on
-  bidirectional parallel ports only, which can transmit 8 bits at a
-  time (mode 1); you can find the wiring of these cables in
-  <file:Documentation/networking/PLIP.txt>.  The cables can be up to
-  15m long.  Mode 0 works also if one of the machines runs DOS/Windows
-  and has some PLIP software installed, e.g. the Crynwr PLIP packet
-  driver (<http://oak.oakland.edu/simtel.net/msdos/pktdrvr-pre.html>)
-  and winsock or NCSA's telnet.
-
-  If you want to use PLIP, say Y and read the PLIP mini-HOWTO as well
-  as the NET-3-HOWTO, both available from
-  <http://www.tldp.org/docs.html#howto>.  Note that the PLIP
-  protocol has been changed and this PLIP driver won't work together
-  with the PLIP support in Linux versions 1.0.x.  This option enlarges
-  your kernel by about 8 KB.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt> as well as
-  <file:Documentation/networking/net-modules.txt>.  The module will be
-  called plip.o.  If unsure, say Y or M, in case you buy a laptop
-  later.
-
-EQL (serial line load balancing) support
-CONFIG_EQUALIZER
-  If you have two serial connections to some other computer (this
-  usually requires two modems and two telephone lines) and you use
-  SLIP (the protocol for sending Internet traffic over telephone
-  lines) or PPP (a better SLIP) on them, you can make them behave like
-  one double speed connection using this driver.  Naturally, this has
-  to be supported at the other end as well, either with a similar EQL
-  Linux driver or with a Livingston Portmaster 2e.
-
-  Say Y if you want this and read
-  <file:Documentation/networking/eql.txt>.  You may also want to read
-  section 6.2 of the NET-3-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called eql.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.  If
-  unsure, say N.
-
-Universal TUN/TAP device driver support
-CONFIG_TUN
-  TUN/TAP provides packet reception and transmission for user space
-  programs.  It can be viewed as a simple Point-to-Point or Ethernet
-  device, which instead of receiving packets from a physical media,
-  receives them from user space program and instead of sending packets
-  via physical media writes them to the user space program.
-
-  When a program opens /dev/net/tun, driver creates and registers
-  corresponding net device tunX or tapX.  After a program closed above
-  devices, driver will automatically delete tunXX or tapXX device and
-  all routes corresponding to it.
-
-  Please read <file:Documentation/networking/tuntap.txt> for more
-  information.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called tun.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-  If you don't know what to use this for, you don't need it.
-
-Ethertap network tap (OBSOLETE)
-CONFIG_ETHERTAP
-  If you say Y here (and have said Y to "Kernel/User network link
-  driver", above) and create a character special file /dev/tap0 with
-  major number 36 and minor number 16 using mknod ("man mknod"), you
-  will be able to have a user space program read and write raw
-  Ethernet frames from/to that special file.  tap0 can be configured
-  with ifconfig and route like any other Ethernet device but it is not
-  connected to any physical LAN; everything written by the user to
-  /dev/tap0 is treated by the kernel as if it had come in from a LAN
-  to the device tap0; everything the kernel wants to send out over the
-  device tap0 can instead be read by the user from /dev/tap0: the user
-  mode program replaces the LAN that would be attached to an ordinary
-  Ethernet device. Please read the file
-  <file:Documentation/networking/ethertap.txt> for more information.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ethertap.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-  If you don't know what to use this for, you don't need it.
-
-Sealevel Systems 4021 support
-CONFIG_SEALEVEL_4021
-  This is a driver for the Sealevel Systems ACB 56 serial I/O adapter.
-
-  This driver can only be compiled as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to do that, say M here. The module will be called
-  sealevel.o.
-
-TMPTX3912/PR31700 serial port support
-CONFIG_SERIAL_TX3912
-  The TX3912 is a Toshiba RISC processor based o the MIPS 3900 core;
-  see <http://www.toshiba.com/taec/components/Generic/risc/tx3912.htm>.
-  Say Y here to enable kernel support for the on-board serial port.
-
-Console on TMPTX3912/PR31700 serial port
-CONFIG_SERIAL_TX3912_CONSOLE
-  The TX3912 is a Toshiba RISC processor based o the MIPS 3900 core;
-  see <http://www.toshiba.com/taec/components/Generic/risc/tx3912.htm>.
-  Say Y here to direct console I/O to the on-board serial port.
-
-Enable Au1000 serial console
-CONFIG_AU1000_SERIAL_CONSOLE
-  If you have an Alchemy AU1000 processor (MIPS based) and you want
-  to use a console on a serial port, say Y.  Otherwise, say N.
-
-Enable Au1000 UART Support
-CONFIG_AU1000_UART
-  If you have an Alchemy AU1000 processor (MIPS based) and you want
-  to use serial ports, say Y.  Otherwise, say N.
-
-SyncLink HDLC/SYNCPPP support
-CONFIG_SYNCLINK_SYNCPPP
-  Enables HDLC/SYNCPPP support for the SyncLink WAN driver.
-  Normally the SyncLink WAN driver works with the main PPP
-  driver (ppp.c) and pppd program. HDLC/SYNCPPP support allows use
-  of the Cisco HDLC/PPP driver (syncppp.c).
-  The SyncLink WAN driver (in character devices) must also be enabled.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called syncppp.o.
-
-FarSync T-Series X.21 (and V.35/V.24) cards
-CONFIG_FARSYNC
-  This driver supports the FarSync T-Series X.21 (and V.35/V.24) cards
-  from FarSite Communications Ltd.
-  Synchronous communication is supported on all ports at speeds up to
-  8Mb/s (128K on V.24) using synchronous PPP or Cisco HDLC.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want)
-  say M here and read <file:Documentation/modules.txt>.
-  The module will be called farsync.o and if you want the module to be
-  automatically loaded when the interface is referenced then you
-  should add "alias syncX farsync" to /etc/modules.conf for each
-  interface, where X is 0, 1, 2, ...
-
-CONFIG_HDLC_DEBUG_PKT
-  This option is for developers only - do NOT use on production
-  systems.
-
-CONFIG_HDLC_DEBUG_HARD_HEADER
-  This option is for developers only - do NOT use on production
-  systems.
-
-CONFIG_HDLC_DEBUG_ECN
-  This option is for developers only - do NOT use on production
-  systems.
-
-CONFIG_HDLC_DEBUG_RINGS
-  If you answer Y here you will be able to get a diagnostic dump of
-  port's TX and RX packet rings, using "sethdlc hdlcX private"
-  command. It does not affect normal operations.
-
-  If unsure, say Y here.
-
-
-Frame Relay (DLCI) support
-CONFIG_DLCI
-  This is support for the frame relay protocol; frame relay is a fast
-  low-cost way to connect to a remote Internet access provider or to
-  form a private wide area network. The one physical line from your
-  box to the local "switch" (i.e. the entry point to the frame relay
-  network, usually at the phone company) can carry several logical
-  point-to-point connections to other computers connected to the frame
-  relay network. For a general explanation of the protocol, check out
-  <http://www.frforum.com/> on the WWW. To use frame relay, you need
-  supporting hardware (called FRAD) and certain programs from the
-  net-tools package as explained in
-  <file:Documentation/networking/framerelay.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called dlci.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Max open DLCI
-CONFIG_DLCI_COUNT
-  This is the maximal number of logical point-to-point frame relay
-  connections (the identifiers of which are called DCLIs) that
-  the driver can handle. The default is probably fine.
-
-Max DLCI per device
-CONFIG_DLCI_MAX
-  You can specify here how many logical point-to-point frame relay
-  connections (the identifiers of which are called DCLIs) should be
-  handled by each of your hardware frame relay access devices. Go with
-  the default.
-
-SDLA (Sangoma S502/S508) support
-CONFIG_SDLA
-  Say Y here if you need a driver for the Sangoma S502A, S502E, and
-  S508 Frame Relay Access Devices. These are multi-protocol cards, but
-  only frame relay is supported by the driver at this time. Please
-  read <file:Documentation/framerelay.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called sdla.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Acorn Econet/AUN protocols
-CONFIG_ECONET
-  Econet is a fairly old and slow networking protocol mainly used by
-  Acorn computers to access file and print servers. It uses native
-  Econet network cards. AUN is an implementation of the higher level
-  parts of Econet that runs over ordinary Ethernet connections, on
-  top of the UDP packet protocol, which in turn runs on top of the
-  Internet protocol IP.
-
-  If you say Y here, you can choose with the next two options whether
-  to send Econet/AUN traffic over a UDP Ethernet connection or over
-  a native Econet network card.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called econet.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-AUN over UDP
-CONFIG_ECONET_AUNUDP
-  Say Y here if you want to send Econet/AUN traffic over a UDP
-  connection (UDP is a packet based protocol that runs on top of the
-  Internet protocol IP) using an ordinary Ethernet network card.
-
-Native Econet
-CONFIG_ECONET_NATIVE
-  Say Y here if you have a native Econet network card installed in
-  your computer.
-
-WAN router
-CONFIG_WAN_ROUTER
-  Wide Area Networks (WANs), such as X.25, frame relay and leased
-  lines, are used to interconnect Local Area Networks (LANs) over vast
-  distances with data transfer rates significantly higher than those
-  achievable with commonly used asynchronous modem connections.
-  Usually, a quite expensive external device called a `WAN router' is
-  needed to connect to a WAN.
-
-  As an alternative, WAN routing can be built into the Linux kernel.
-  With relatively inexpensive WAN interface cards available on the
-  market, a perfectly usable router can be built for less than half
-  the price of an external router.  If you have one of those cards and
-  wish to use your Linux box as a WAN router, say Y here and also to
-  the WAN driver for your card, below.  You will then need the
-  wan-tools package which is available from <ftp://ftp.sangoma.com/>.
-  Read <file:Documentation/networking/wan-router.txt> for more
-  information.
-
-  The WAN routing support is also available as a module called
-  wanrouter.o ( = code which can be inserted in and removed from the
-  running kernel whenever you want).  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-  If unsure, say N.
-
-Fast switching (read help!)
-CONFIG_NET_FASTROUTE
-  Saying Y here enables direct NIC-to-NIC (NIC = Network Interface
-  Card) data transfers on the local network, which is fast.
-
-  IMPORTANT NOTE: This option is NOT COMPATIBLE with "Network packet
-  filtering" (CONFIG_NETFILTER). Say N here if you say Y there.
-
-  However, it will work with all options in the "Advanced router"
-  section (except for "Use TOS value as routing key" and
-  "Use FWMARK value as routing key").
-
-  At the moment, few devices support fast switching (tulip is one of
-  them, a modified 8390 driver can be found at
-  <ftp://ftp.inr.ac.ru/ip-routing/fastroute/fastroute-8390.tar.gz>).
-
-  If unsure, say N.
-
-Forwarding between high speed interfaces
-CONFIG_NET_HW_FLOWCONTROL
-  This option enables NIC (Network Interface Card) hardware throttling
-  during periods of extremal congestion. At the moment only a couple
-  of device drivers support it (really only one -- tulip, a modified
-  8390 driver can be found at
-  <ftp://ftp.inr.ac.ru/ip-routing/fastroute/fastroute-8390.tar.gz>).
-
-  Really, this option is applicable to any machine attached to a fast
-  enough network, and even a 10 Mb NIC is able to kill a not very slow
-  box, such as a 120MHz Pentium.
-
-  However, do not say Y here if you did not experience any serious
-  problems.
-
-QoS and/or fair queueing
-CONFIG_NET_SCHED
-  When the kernel has several packets to send out over a network
-  device, it has to decide which ones to send first, which ones to
-  delay, and which ones to drop. This is the job of the packet
-  scheduler, and several different algorithms for how to do this
-  "fairly" have been proposed.
-
-  If you say N here, you will get the standard packet scheduler, which
-  is a FIFO (first come, first served). If you say Y here, you will be
-  able to choose from among several alternative algorithms which can
-  then be attached to different network devices. This is useful for
-  example if some of your network devices are real time devices that
-  need a certain minimum data flow rate, or if you need to limit the
-  maximum data flow rate for traffic which matches specified criteria.
-  This code is considered to be experimental.
-
-  To administer these schedulers, you'll need the user-level utilities
-  from the package iproute2+tc at <ftp://ftp.inr.ac.ru/ip-routing/>.
-  That package also contains some documentation; for more, check out
-  <http://snafu.freedom.org/linux2.2/iproute-notes.html>.
-
-  This Quality of Service (QoS) support will enable you to use
-  Differentiated Services (diffserv) and Resource Reservation Protocol
-  (RSVP) on your Linux router if you also say Y to "QoS support",
-  "Packet classifier API" and to some classifiers below. Documentation
-  and software is at <http://icawww1.epfl.ch/linux-diffserv/>.
-
-  If you say Y here and to "/proc file system" below, you will be able
-  to read status information about packet schedulers from the file
-  /proc/net/psched.
-
-  The available schedulers are listed in the following questions; you
-  can say Y to as many as you like. If unsure, say N now.
-
-CBQ packet scheduler
-CONFIG_NET_SCH_CBQ
-  Say Y here if you want to use the Class-Based Queueing (CBQ) packet
-  scheduling algorithm for some of your network devices.  This
-  algorithm classifies the waiting packets into a tree-like hierarchy
-  of classes; the leaves of this tree are in turn scheduled by
-  separate algorithms (called "disciplines" in this context).
-
-  See the top of <file:net/sched/sch_cbq.c> for references about the
-  CBQ algorithm.
-
-  CBQ is a commonly used scheduler, so if you're unsure, you should
-  say Y here. Then say Y to all the queueing algorithms below that you
-  want to use as CBQ disciplines.  Then say Y to "Packet classifier
-  API" and say Y to all the classifiers you want to use; a classifier
-  is a routine that allows you to sort your outgoing traffic into
-  classes based on a certain criterion.
-
-  This code is also available as a module called sch_cbq.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want).  If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-CONFIG_NET_SCH_HTB
-  Say Y here if you want to use the Hierarchical Token Buckets (HTB)
-  packet scheduling algorithm for some of your network devices. See
-  URL <http://luxik.cdi.cz/~devik/qos/htb/> for complete manual and
-  in-depth articles.
-
-  HTB is very similar to the CBQ regarding its goals however is has 
-  different properties and different algorithm.
-
-  This code is also available as a module called sch_htb.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want).  If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-CSZ packet scheduler
-CONFIG_NET_SCH_CSZ
-  Say Y here if you want to use the Clark-Shenker-Zhang (CSZ) packet
-  scheduling algorithm for some of your network devices.  At the
-  moment, this is the only algorithm that can guarantee service for
-  real-time applications (see the top of <file:net/sched/sch_csz.c>
-  for details and references about the algorithm).
-
-  Note: this scheduler is currently broken.
-
-  This code is also available as a module called sch_csz.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-ATM pseudo-scheduler
-CONFIG_NET_SCH_ATM
-  Say Y here if you want to use the ATM pseudo-scheduler.  This
-  provides a framework for invoking classifiers (aka "filters"), which
-  in turn select classes of this queuing discipline.  Each class maps
-  the flow(s) it is handling to a given virtual circuit (see the top of
-  <file:net/sched/sch_atm.c>).
-
-  This code is also available as a module called sch_atm.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-The simplest PRIO pseudo-scheduler
-CONFIG_NET_SCH_PRIO
-  Say Y here if you want to use an n-band priority queue packet
-  "scheduler" for some of your network devices or as a leaf discipline
-  for the CBQ scheduling algorithm. If unsure, say Y.
-
-  This code is also available as a module called sch_prio.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Diffserv field marker
-CONFIG_NET_SCH_DSMARK
-  Say Y if you want to schedule packets according to the
-  Differentiated Services architecture proposed in RFC 2475.
-  Technical information on this method, with pointers to associated
-  RFCs, is available at <http://www.gta.ufrj.br/diffserv/>.
-
-  This code is also available as a module called sch_dsmark.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want).  If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-GRED queue
-CONFIG_NET_SCH_GRED
-  Say Y here if you want to use the Generic Random Early Detection
-  (RED) packet scheduling algorithm for some of your network devices
-  (see the top of <file:net/sched/sch_red.c> for details and
-  references about the algorithm).
-
-  This code is also available as a module called sch_gred.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-RED queue
-CONFIG_NET_SCH_RED
-  Say Y here if you want to use the Random Early Detection (RED)
-  packet scheduling algorithm for some of your network devices (see
-  the top of <file:net/sched/sch_red.c> for details and references
-  about the algorithm).
-
-  This code is also available as a module called sch_red.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want).  If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-SFQ queue
-CONFIG_NET_SCH_SFQ
-  Say Y here if you want to use the Stochastic Fairness Queueing (SFQ)
-  packet scheduling algorithm for some of your network devices or as a
-  leaf discipline for the CBQ scheduling algorithm (see the top of
-  <file:net/sched/sch_sfq.c> for details and references about the SFQ
-  algorithm).
-
-  This code is also available as a module called sch_sfq.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-TEQL queue
-CONFIG_NET_SCH_TEQL
-  Say Y here if you want to use the True Link Equalizer (TLE) packet
-  scheduling algorithm for some of your network devices or as a leaf
-  discipline for the CBQ scheduling algorithm. This queueing
-  discipline allows the combination of several physical devices into
-  one virtual device. (see the top of <file:net/sched/sch_teql.c> for
-  details).
-
-  This code is also available as a module called sch_teql.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-TBF queue
-CONFIG_NET_SCH_TBF
-  Say Y here if you want to use the Simple Token Bucket Filter (TBF)
-  packet scheduling algorithm for some of your network devices or as a
-  leaf discipline for the CBQ scheduling algorithm (see the top of
-  <file:net/sched/sch_tbf.c> for a description of the TBF algorithm).
-
-  This code is also available as a module called sch_tbf.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Ingress Qdisc
-CONFIG_NET_SCH_INGRESS
-  If you say Y here, you will be able to police incoming bandwidth
-  and drop packets when this bandwidth exceeds your desired rate.
-  If unsure, say Y.
-
-  This code is also available as a module called cls_ingress.o
-  ( = code which can be inserted in and removed from the running
-  kernel whenever you want).  If you want to compile it as a module,
-  say M here and read <file:Documentation/modules.txt>.
-
-QoS support
-CONFIG_NET_QOS
-  Say Y here if you want to include Quality Of Service scheduling
-  features, which means that you will be able to request certain
-  rate-of-flow limits for your network devices.
-
-  This Quality of Service (QoS) support will enable you to use
-  Differentiated Services (diffserv) and Resource Reservation Protocol
-  (RSVP) on your Linux router if you also say Y to "Packet classifier
-  API" and to some classifiers below. Documentation and software is at
-  <http://icawww1.epfl.ch/linux-diffserv/>.
-
-  Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause the configurator to skip all
-  the questions about QoS support.
-
-Rate estimator
-CONFIG_NET_ESTIMATOR
-  In order for Quality of Service scheduling to work, the current
-  rate-of-flow for a network device has to be estimated; if you say Y
-  here, the kernel will do just that.
-
-Packet classifier API
-CONFIG_NET_CLS
-  The CBQ scheduling algorithm requires that network packets which are
-  scheduled to be sent out over a network device be classified
-  according to some criterion. If you say Y here, you will get a
-  choice of several different packet classifiers with the following
-  questions.
-
-  This will enable you to use Differentiated Services (diffserv) and
-  Resource Reservation Protocol (RSVP) on your Linux router.
-  Documentation and software is at
-  <http://icawww1.epfl.ch/linux-diffserv/>.
-
-Traffic policing (needed for in/egress)
-CONFIG_NET_CLS_POLICE
-  Say Y to support traffic policing (bandwidth limits).  Needed for
-  ingress and egress rate limiting.
-
-TC index classifier
-CONFIG_NET_CLS_TCINDEX
-  If you say Y here, you will be able to classify outgoing packets
-  according to the tc_index field of the skb. You will want this
-  feature if you want to implement Differentiated Services using
-  sch_dsmark. If unsure, say Y.
-
-  This code is also available as a module called cls_tcindex.o
-  ( = code which can be inserted in and removed from the running
-  kernel whenever you want). If you want to compile it as a module,
-  say M here and read <file:Documentation/modules.txt>.
-
-Routing tables based classifier
-CONFIG_NET_CLS_ROUTE4
-  If you say Y here, you will be able to classify outgoing packets
-  according to the route table entry they matched. If unsure, say Y.
-
-  This code is also available as a module called cls_route.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want).  If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Firewall based classifier
-CONFIG_NET_CLS_FW
-  If you say Y here, you will be able to classify outgoing packets
-  according to firewall criteria you specified.
-
-  This code is also available as a module called cls_fw.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want).  If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-U32 classifier
-CONFIG_NET_CLS_U32
-  If you say Y here, you will be able to classify outgoing packets
-  according to their destination address. If unsure, say Y.
-
-  This code is also available as a module called cls_u32.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want).  If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Special RSVP classifier
-CONFIG_NET_CLS_RSVP
-  The Resource Reservation Protocol (RSVP) permits end systems to
-  request a minimum and maximum data flow rate for a connection; this
-  is important for real time data such as streaming sound or video.
-
-  Say Y here if you want to be able to classify outgoing packets based
-  on their RSVP requests.
-
-  This code is also available as a module called cls_rsvp.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want).  If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Special RSVP classifier for IPv6
-CONFIG_NET_CLS_RSVP6
-  The Resource Reservation Protocol (RSVP) permits end systems to
-  request a minimum and maximum data flow rate for a connection; this
-  is important for real time data such as streaming sound or video.
-
-  Say Y here if you want to be able to classify outgoing packets based
-  on their RSVP requests and you are using the new Internet Protocol
-  IPv6 as opposed to the older and more common IPv4.
-
-  This code is also available as a module called cls_rsvp6.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want).  If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Network code profiler
-CONFIG_NET_PROFILE
-  If you say Y here and to "/proc file system support" below, some
-  obscure and undocumented information about the network code's
-  performance will be written to /proc/net/profile. If you don't know
-  what it is about, you don't need it: say N.
-
-Network packet generator
-CONFIG_NET_PKTGEN
-  This module will inject preconfigured packets, at a configurable
-  rate, out of a given interface.  It is used for network interface
-  stress testing and performance analysis.  If you don't understand
-  what was just said, you don't need it: say N.
-
-  Documentation on how to use the packet generator can be found
-  at <file:Documentation/networking/pktgen.txt>.
-
-  This code is also available as a module called pktgen.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want).  If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Wan interfaces support
-CONFIG_WAN
-  Wide Area Networks (WANs), such as X.25, frame relay and leased
-  lines, are used to interconnect Local Area Networks (LANs) over vast
-  distances with data transfer rates significantly higher than those
-  achievable with commonly used asynchronous modem connections.
-  Usually, a quite expensive external device called a `WAN router' is
-  needed to connect to a WAN.
-
-  As an alternative, a relatively inexpensive WAN interface card can
-  allow your Linux box to directly connect to a WAN. If you have one
-  of those cards and wish to use it under Linux, say Y here and also
-  to the WAN driver for your card, below.
-
-  If unsure, say N.
-
-Comtrol Hostess SV-11 support
-CONFIG_HOSTESS_SV11
-  This is a network card for low speed synchronous serial links, at
-  up to 256Kbps. It supports both PPP and Cisco HDLC.
-
-  At this point, the driver can only be compiled as a module.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called hostess_sv11.o.
-
-COSA/SRP sync serial board support
-CONFIG_COSA
-  This is a driver for COSA and SRP synchronous serial boards. These
-  boards allow to connect synchronous serial devices (for example
-  base-band modems, or any other device with the X.21, V.24, V.35 or
-  V.36 interface) to your Linux box. The cards can work as the
-  character device, synchronous PPP network device, or the Cisco HDLC
-  network device.
-
-  To actually use the COSA or SRP board, you will need user-space
-  utilities for downloading the firmware to the cards and to set them
-  up. Look at the <http://www.fi.muni.cz/~kas/cosa/> for more
-  information about the cards (including the pointer to the user-space
-  utilities). You can also read the comment at the top of the
-  <file:drivers/net/wan/cosa.c> for details about the cards and the driver
-  itself.
-
-  The driver will be compiled as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called cosa.o. For general information about
-  modules read <file:Documentation/modules.txt>.
-
-Etinc PCISYNC serial board support
-CONFIG_DSCC4
-  This is a driver for Etinc PCISYNC boards based on the Infineon
-  (ex. Siemens) DSCC4 chipset. It is supposed to work with the four
-  ports card. Take a look at <http://www.cogenit.fr/dscc4/>
-  for further informations about the driver and his configuration.
-
-  The driver will be compiled as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called dscc4.o. For general information about
-  modules read <file:Documentation/modules.txt>.
-
-LanMedia Corp. serial boards (SSI/V.35, T1/E1, HSSI, T3)
-CONFIG_LANMEDIA
-  This is a driver for the following Lan Media family of serial
-  boards.
-
-  LMC 1000 board allows you to connect synchronous serial devices (for
-  example base-band modems, or any other device with the X.21, V.24,
-  V.35 or V.36 interface) to your Linux box.
-
-  LMC 1200 with on board DSU board allows you to connect your Linux
-  box directly to a T1 or E1 circuit.
-
-  LMC 5200 board provides a HSSI interface capable of running up to
-  52 mbits per second.
-
-  LMC 5245 board connects directly to a T3 circuit saving the
-  additional external hardware.
-
-  To change setting such as syncPPP vs cisco HDLC or clock source you
-  will need lmcctl.  It is available at <ftp://ftp.lanmedia.com/>.
-
-  This code is also available as a module called lmc.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Fibre Channel driver support
-CONFIG_NET_FC
-  Fibre Channel is a high speed serial protocol mainly used to connect
-  large storage devices to the computer; it is compatible with and
-  intended to replace SCSI.
-
-  If you intend to use Fibre Channel, you need to have a Fibre channel
-  adaptor card in your computer; say Y here and to the driver for your
-  adaptor below. You also should have said Y to "SCSI support" and
-  "SCSI generic support".
-
-Interphase 5526 Tachyon chipset based adaptor support
-CONFIG_IPHASE5526
-  Say Y here if you have a Fibre Channel adaptor of this kind.
-
-  The driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called iph5526.o. For general information about
-  modules read <file:Documentation/modules.txt>.
-
-Red Creek Hardware VPN
-CONFIG_RCPCI
-  This is a driver for hardware which provides a Virtual Private
-  Network (VPN). Say Y if you have it.
-
-  This code is also available as a module called rcpci.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Granch SBNI12 Leased Line adapter driver
-CONFIG_SBNI
-  This is a driver for ISA SBNI12-xx cards which are low cost
-  alternatives to leased line modems. Say Y if you want to insert
-  the driver into the kernel or say M to compile it as a module (the
-  module will be called sbni.o).
-
-  You can find more information and last versions of drivers and
-  utilities at <http://www.granch.ru/>. If you have any question you
-  can send email to sbni@granch.ru.
-
-  Say N if unsure.
-
-SBNI multiple-line feature support
-CONFIG_SBNI_MULTILINE
-  Schedule traffic for some parallel lines, via SBNI12 adapters.
-  If you have two computers connected with two parallel lines it's
-  possible to increase transfer rate nearly twice. You should have
-  a program named 'sbniconfig' to configure adapters.
-
-  Say N if unsure.
-
-WAN router drivers
-CONFIG_WAN_ROUTER_DRIVERS
-  If you have a WAN interface card and you want your Linux box to act
-  as a WAN router, thereby connecting you Local Area Network to the
-  outside world over the WAN connection, say Y here and then to the
-  driver for your card below. In addition, you need to say Y to "Wan
-  Router".
-
-  You will need the wan-tools package which is available from
-  <ftp://ftp.sangoma.com/>. Read
-  <file:Documentation/networking/wan-router.txt> for more information.
-
-  Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause the configurator to skip all
-  the questions about WAN router drivers. If unsure, say N.
-
-Sangoma WANPIPE(tm) multiprotocol cards
-CONFIG_VENDOR_SANGOMA
-  WANPIPE from Sangoma Technologies Inc. (<http://www.sangoma.com/>)
-  is a family of intelligent multiprotocol WAN adapters with data
-  transfer rates up to 4Mbps. They are also known as Synchronous
-  Data Link Adapters (SDLA) and are designated as S514-PCI or
-  S508-ISA.  These cards support
-
-    - X.25, Frame Relay, PPP, Cisco HDLC protocols.
-
-    - API support for protocols like HDLC (LAPB),
-      HDLC Streaming, X.25, Frame Relay and BiSync.
-
-    - Ethernet Bridging over Frame Relay protocol.
-
-    - MULTILINK PPP
-
-    - Async PPP (Modem Dialup)
-
-  If you have one or more of these cards, say M to this option; you
-  may then also want to read the file
-  <file:Documentation/networking/wanpipe.txt>.  The next questions
-  will ask you about the protocols you want the driver to support.
-
-  The driver will be compiled as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called wanpipe.o.  For general information about
-  modules read <file:Documentation/modules.txt>.
-
-WANPIPE X.25 support
-CONFIG_WANPIPE_X25
-  Say Y to this option if you are planning to connect a WANPIPE card
-  to an X.25 network.  Note, this feature also includes the X.25 API
-  support used to develop custom applications over the X.25 protocol.
-  If you say N, the X.25 support will not be included in the driver.
-  The X.25 option is supported on S514-PCI and S508-ISA cards.
-
-WANPIPE Frame Relay support
-CONFIG_WANPIPE_FR
-  Say Y to this option if you are planning to connect a WANPIPE card
-  to a frame relay network, or use frame relay API to develop
-  custom applications over the Frame  Relay protocol.
-  This feature also contains the Ethernet Bridging over Frame Relay,
-  where a WANPIPE frame relay link can be directly connected to the
-  Linux kernel bridge.  If you say N, the frame relay support will
-  not be included in the driver. The Frame Relay option is
-  supported on S514-PCI and S508-ISA cards.
-
-WANPIPE PPP support
-CONFIG_WANPIPE_PPP
-  Say Y to this option if you are planning to connect a WANPIPE card
-  to a leased line using Point-to-Point protocol (PPP). If you say N,
-  the PPP support will not be included in the driver. The PPP option
-  is supported on S514-PCI/S508-ISA cards.
-
-WANPIPE Multi-Port PPP support
-CONFIG_WANPIPE_MULTPPP
-  Say Y to this option if you are planning to connect a WANPIPE card
-  to a leased line using Point-to-Point protocol (PPP).  Note, the
-  MultiPort PPP uses the Linux Kernel SyncPPP protocol over the
-  Sangoma HDLC Streaming adapter.  In this case each Sangoma adapter
-  port can support an independent PPP connection.  For example, a
-  single Quad-Port PCI adapter can support up to four independent
-  PPP links. If you say N,the PPP support will not be included in the
-  driver.  The PPP option is supported on S514-PCI/S508-ISA cards.
-
-WANPIPE Cisco HDLC support
-CONFIG_WANPIPE_CHDLC
-  Say Y to this option if you are planning to connect a WANPIPE card
-  to a leased line using the Cisco HDLC protocol. This now supports
-  Dual Port Cisco HDLC on the S514-PCI/S508-ISA cards.
-  This support also allows user to build applications using the
-  HDLC streaming API.
-
-  CHDLC Streaming driver also supports MULTILINK PPP
-  support that can bind multiple WANPIPE T1 cards into
-  a single logical channel.
-
-  If you say  N, the Cisco HDLC support and
-  HDLC streaming API and MULTILINK PPP will not be
-  included in the driver.
-
-MultiGate (COMX) synchronous serial board support
-CONFIG_COMX
-  Say Y if you want to use any board from the MultiGate (COMX) family.
-  These boards are synchronous serial adapters for the PC,
-  manufactured by ITConsult-Pro Co, Hungary.
-
-  Read <file:Documentation/networking/comx.txt> for help on
-  configuring and using COMX interfaces.  Further info on these cards
-  can be found at <http://www.itc.hu/> or <info@itc.hu>.
-
-  You must say Y to "/proc file system support" (CONFIG_PROC_FS) to
-  use this driver.
-
-  If you want to compile this as a module, say M and read
-  <file:Documentation/modules.txt>.  The module will be called comx.o.
-
-Support for COMX/CMX/HiCOMX boards
-CONFIG_COMX_HW_COMX
-  Hardware driver for the 'CMX', 'COMX' and 'HiCOMX' boards from the
-  MultiGate family. Say Y if you have one of these.
-
-  You will need additional firmware to use these cards, which are
-  downloadable from <ftp://ftp.itc.hu/>.
-
-  If you want to compile this as a module, say M and read
-  <file:Documentation/modules.txt>.  The module will be called
-  comx-hw-comx.o.
-
-Support for LoCOMX board
-CONFIG_COMX_HW_LOCOMX
-  Hardware driver for the 'LoCOMX' board from the MultiGate family.
-  Say Y if you have a board like this.
-
-  If you want to compile this as a module, say M and read
-  <file:Documentation/modules.txt>.  The module will be called
-  comx-hw-locomx.o.
-
-Support for MixCOM board
-CONFIG_COMX_HW_MIXCOM
-  Hardware driver for the 'MixCOM' board from the MultiGate family.
-  Say Y if you have a board like this.
-
-  If you want to use the watchdog device on this card, you should
-  select it in the Watchdog Cards section of the Character Devices
-  configuration. The ISDN interface of this card is Teles 16.3
-  compatible, you should enable it in the ISDN configuration menu. The
-  driver for the flash ROM of this card is available separately on
-  <ftp://ftp.itc.hu/>.
-
-  If you want to compile this as a module, say M and read
-  <file:Documentation/modules.txt>. The module will be called
-  comx-hw-mixcom.o.
-
-i810 TCO timer/watchdog support
-CONFIG_I810_TCO
-  Hardware driver for the TCO timer built into the Intel i810 and i815
-  chipset family.  The TCO (Total Cost of Ownership) timer is a
-  watchdog timer that will reboot the machine after its second
-  expiration. The expiration time can be configured by command
-  argument "i810_margin=<n>" where <n> is the counter initial value.
-  It is decremented every 0.6 secs, the default is 50 which gives a
-  timeout of 30 seconds and one minute until reset.
-
-  On some motherboards the driver may fail to reset the chipset's
-  NO_REBOOT flag which prevents the watchdog from rebooting the
-  machine. If this is the case you will get a kernel message like
-  "i810tco init: failed to reset NO_REBOOT flag".
-
-  If you want to compile this as a module, say M and read
-  <file:Documentation/modules.txt>.  The module will be called
-  i810-tco.o.
-
-SliceCOM/PciCOM board support
-CONFIG_COMX_HW_MUNICH
-  Hardware driver for the 'SliceCOM' (channelized E1) and 'PciCOM'
-  boards (X21) from the MultiGate family.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called comx-hw-munich.o. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-  Read linux/Documentation/networking/slicecom.txt for help on
-  configuring and using SliceCOM interfaces. Further info on these cards
-  can be found at <http://www.itc.hu> or <info@itc.hu>.
-
-Support for HDLC and syncPPP protocols on MultiGate boards
-CONFIG_COMX_PROTO_PPP
-  Cisco-HDLC and synchronous PPP protocol driver for all MultiGate
-  boards. Say Y if you want to use either protocol on your MultiGate
-  boards.
-
-  If you want to compile this as a module, say M and read
-  <file:Documentation/modules.txt>.  The module will be called
-  comx-proto-ppp.o.
-
-Support for LAPB protocol on MultiGate boards
-CONFIG_COMX_PROTO_LAPB
-  LAPB protocol driver for all MultiGate boards. Say Y if you
-  want to use this protocol on your MultiGate boards.
-
-  If you want to compile this as a module, say M and read
-  <file:Documentation/modules.txt>.  The module will be called
-  comx-proto-lapb.o.
-
-Support for Frame Relay on MultiGate boards
-CONFIG_COMX_PROTO_FR
-  Frame Relay protocol driver for all MultiGate boards. Say Y if you
-  want to use this protocol on your MultiGate boards.
-
-  If you want to compile this as a module, say M and read
-  <file:Documentation/modules.txt>.  The module will be called
-  comx-proto-fr.o.
-
-Cyclom 2X(tm) multiprotocol cards
-CONFIG_CYCLADES_SYNC
-  Cyclom 2X from Cyclades Corporation (<http://www.cyclades.com/> and
-  <http://www.cyclades.com.br/>) is an intelligent multiprotocol WAN
-  adapter with data transfer rates up to 512 Kbps. These cards support
-  the X.25 and SNA related protocols. If you have one or more of these
-  cards, say Y to this option. The next questions will ask you about
-  the protocols you want the driver to support (for now only X.25 is
-  supported).
-
-  While no documentation is available at this time please grab the
-  wanconfig tarball in
-  <http://www.conectiva.com.br/~acme/cycsyn-devel/> (with minor changes
-  to make it compile with the current wanrouter include files; efforts
-  are being made to use the original package available at
-  <ftp://ftp.sangoma.com/>).
-
-  Feel free to contact me or the cycsyn-devel mailing list at
-  acme@conectiva.com.br and cycsyn-devel@bazar.conectiva.com.br for
-  additional details, I hope to have documentation available as soon
-  as possible. (Cyclades Brazil is writing the Documentation).
-
-  The driver will be compiled as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called cyclomx.o. For general information about
-  modules read <file:Documentation/modules.txt>.
-
-Cyclom 2X X.25 support
-CONFIG_CYCLOMX_X25
-  Say Y to this option if you are planning to connect a Cyclom 2X card
-  to an X.25 network.
-
-  If you say N, the X.25 support will not be included in the driver
-  (saves about 11 KB of kernel memory).
-
-Generic HDLC driver
-CONFIG_HDLC
-  Say Y to this option if your Linux box contains a WAN card supported
-  by this driver and you are planning to connect the box to a WAN
-  ( = Wide Area Network). You will need supporting software from
-  <http://hq.pm.waw.pl/hdlc/>.
-  Generic HDLC driver currently supports raw HDLC, Cisco HDLC, Frame
-  Relay, synchronous Point-to-Point Protocol (PPP) and X.25.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called hdlc.o.
-
-  If unsure, say N here.
-
-Raw HDLC support
-CONFIG_HDLC_RAW
-  Say Y to this option if you want generic HDLC driver to support
-  raw HDLC over WAN (Wide Area Network) connections.
-
-  If unsure, say N here.
-
-Cisco HDLC support
-CONFIG_HDLC_CISCO
-  Say Y to this option if you want generic HDLC driver to support
-  Cisco HDLC over WAN (Wide Area Network) connections.
-
-  If unsure, say N here.
-
-Frame-Relay HDLC support
-CONFIG_HDLC_FR
-  Say Y to this option if you want generic HDLC driver to support
-  Frame-Relay protocol over WAN (Wide Area Network) connections.
-
-  If unsure, say N here.
-
-Frame-Relay bridging support
-CONFIG_HDLC_FR_BRIDGE
-  Say Y to this option if you want generic HDLC driver to support
-  bridging LAN frames over Frame-Relay links.
-
-  If unsure, say N here.
-
-Synchronous Point-to-Point Protocol (PPP) support
-CONFIG_HDLC_PPP
-  Say Y to this option if you want generic HDLC driver to support
-  PPP over WAN (Wide Area Network) connections.
-
-  If unsure, say N here.
-
-CCITT X.25 over HDLC support
-CONFIG_HDLC_X25
-  Say Y to this option if you want generic HDLC driver to support
-  X.25 protocol over WAN (Wide Area Network) connections.
-
-  If unsure, say N here.
-
-SDL RISCom/N2 support
-CONFIG_N2
-  This driver is for RISCom/N2 single or dual channel ISA cards
-  made by SDL Communications Inc.  If you have such a card,
-  say Y here and see <http://hq.pm.waw.pl/pub/hdlc/>.
-
-  Note that N2csu and N2dds cards are not supported by this driver.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called n2.o.
-
-  If unsure, say N here.
-
-Moxa C101 support
-CONFIG_C101
-  This driver is for C101 SuperSync ISA cards made by Moxa
-  Technologies Co., Ltd. If you have such a card,
-  say Y here and see <http://hq.pm.waw.pl/pub/hdlc/>
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called c101.o.
-
-  If unsure, say N here.
-
-Ethernet (10 or 100Mbit)
-CONFIG_NET_ETHERNET
-  Ethernet (also called IEEE 802.3 or ISO 8802-2) is the most common
-  type of Local Area Network (LAN) in universities and companies.
-
-  Common varieties of Ethernet are: 10BASE-2 or Thinnet (10 Mbps over
-  coaxial cable, linking computers in a chain), 10BASE-T or twisted
-  pair (10 Mbps over twisted pair cable, linking computers to central
-  hubs), 10BASE-F (10 Mbps over optical fiber links, using hubs),
-  100BASE-TX (100 Mbps over two twisted pair cables, using hubs),
-  100BASE-T4 (100 Mbps over 4 standard voice-grade twisted pair
-  cables, using hubs), 100BASE-FX (100 Mbps over optical fiber links)
-  [the 100BASE varieties are also known as Fast Ethernet], and Gigabit
-  Ethernet (1 Gbps over optical fiber or short copper links).
-
-  If your Linux machine will be connected to an Ethernet and you have
-  an Ethernet network interface card (NIC) installed in your computer,
-  say Y here and read the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>. You will then also have
-  to say Y to the driver for your particular NIC.
-
-  Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause the configurator to skip all
-  the questions about Ethernet network cards. If unsure, say N.
-
-Western Digital/SMC cards
-CONFIG_NET_VENDOR_SMC
-  If you have a network (Ethernet) card belonging to this class, say Y
-  and read the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  Note that the answer to this question doesn't directly affect the
-  kernel: saying N will just cause the configurator to skip all
-  the questions about Western Digital cards. If you say Y, you will be
-  asked for your specific card in the following questions.
-
-WD80*3 support
-CONFIG_WD80x3
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called wd.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-SMC Ultra MCA support
-CONFIG_ULTRAMCA
-  If you have a network (Ethernet) card of this type and are running
-  an MCA based system (PS/2), say Y and read the Ethernet-HOWTO,
-  available from <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called smc-mca.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-SMC Ultra support
-CONFIG_ULTRA
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  Important: There have been many reports that, with some motherboards
-  mixing an SMC Ultra and an Adaptec AHA154x SCSI card (or compatible,
-  such as some BusLogic models) causes corruption problems with many
-  operating systems. The Linux smc-ultra driver has a work-around for
-  this but keep it in mind if you have such a SCSI card and have
-  problems.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called smc-ultra.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt> as
-  well as <file:Documentation/networking/net-modules.txt>.
-
-SMC Ultra32 EISA support
-CONFIG_ULTRA32
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called smc-ultra32.o.  If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt> as
-  well as <file:Documentation/networking/net-modules.txt>.
-
-SMC 9194 support
-CONFIG_SMC9194
-  This is support for the SMC9xxx based Ethernet cards. Choose this
-  option if you have a DELL laptop with the docking station, or
-  another SMC9192/9194 based chipset.  Say Y if you want it compiled
-  into the kernel, and read the file
-  <file:Documentation/networking/smc9.txt> and the Ethernet-HOWTO,
-  available from <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called smc9194.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-PCI NE2000 and clones support
-CONFIG_NE2K_PCI
-  This driver is for NE2000 compatible PCI cards. It will not work
-  with ISA NE2000 cards (they have their own driver, "NE2000/NE1000
-  support" below). If you have a PCI NE2000 network (Ethernet) card,
-  say Y and read the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver also works for the following NE2000 clone cards:
-    RealTek RTL-8029  Winbond 89C940  Compex RL2000  KTI ET32P2
-    NetVin NV5000SC   Via 86C926      SureCom NE34   Winbond
-    Holtek HT80232    Holtek HT80229
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ne2k-pci.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt> as
-  well as <file:Documentation/networking/net-modules.txt>.
-
-Racal-Interlan (Micom) NI cards
-CONFIG_NET_VENDOR_RACAL
-  If you have a network (Ethernet) card belonging to this class, such
-  as the NI5010, NI5210 or NI6210, say Y and read the Ethernet-HOWTO,
-  available from <http://www.tldp.org/docs.html#howto>.
-
-  Note that the answer to this question doesn't directly affect the
-  kernel: saying N will just cause the configurator to skip all
-  the questions about NI cards. If you say Y, you will be asked for
-  your specific card in the following questions.
-
-NI5010 support
-CONFIG_NI5010
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>. Note that this is still
-  experimental code.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ni5010.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-NI5210 support
-CONFIG_NI52
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ni52.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-NI6510 support
-CONFIG_NI65
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ni65.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-RealTek RTL-8139C+ 10/100 PCI Fast Ethernet Adapter support
-CONFIG_8139CP
-  This is a driver for the Fast Ethernet PCI network cards based on
-  the RTL8139C+ chips. If you have one of those, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. This is recommended.
-  The module will be called 8139cp.o.
-
-RealTek RTL-8139 PCI Fast Ethernet Adapter support
-CONFIG_8139TOO
-  This is a driver for the Fast Ethernet PCI network cards based on
-  the RTL8139 chips. If you have one of those, say Y and read
-  <file:Documentation/networking/8139too.txt> as well as the
-  Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  This is
-  recommended.  The module will be called 8139too.o.
-
-Use PIO instead of MMIO
-CONFIG_8139TOO_PIO
-  This instructs the driver to use programmed I/O ports (PIO) instead
-  of PCI shared memory (MMIO).  This can possibly solve some problems
-  in case your mainboard has memory consistency issues.  If unsure,
-  say N.
-
-Support for uncommon RTL-8139 rev. K (automatic channel equalization)
-CONFIG_8139TOO_TUNE_TWISTER
-  This implements a function which might come in handy in case you
-  are using low quality on long cabling. It is required for RealTek
-  RTL-8139 revision K boards, and totally unused otherwise.  It tries
-  to match the transceiver to the cable characteristics. This is
-  experimental since hardly documented by the manufacturer.
-  If unsure, say Y.
-
-Support for older RTL-8129/8130 boards
-CONFIG_8139TOO_8129
-  This enables support for the older and uncommon RTL-8129 and
-  RTL-8130 chips, which support MII via an external transceiver,
-  instead of an internal one.  Disabling this option will save some
-  memory by making the code size smaller.  If unsure, say Y.
-
-Use older RX-reset method
-CONFIG_8139_OLD_RX_RESET
-  The 8139too driver was recently updated to contain a more rapid
-  reset sequence, in the face of severe receive errors.  This "new"
-  RX-reset method should be adequate for all boards.  But if you
-  experience problems, you can enable this option to restore the
-  old RX-reset behavior.  If unsure, say N.
-
-SiS 900/7016 PCI Fast Ethernet Adapter support
-CONFIG_SIS900
-  This is a driver for the Fast Ethernet PCI network cards based on
-  the SiS 900 and SiS 7016 chips. The SiS 900 core is also embedded in
-  SiS 630 and SiS 540 chipsets.  If you have one of those, say Y and
-  read the Ethernet-HOWTO, available at
-  <http://www.tldp.org/docs.html#howto>.  Please read
-  <file:Documentation/networking/sis900.txt> and comments at the
-  beginning of <file:drivers/net/sis900.c> for more information.
-
-  This driver also supports AMD 79C901 HomePNA so that you can use
-  your phone line as a network cable.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  This is
-  recommended.  The module will be called sis900.o.
-
-Packet Engines Yellowfin Gigabit-NIC / Symbios 53c885 support
-CONFIG_YELLOWFIN
-  Say Y here if you have a Packet Engines G-NIC PCI Gigabit Ethernet
-  adapter or the SYM53C885 Ethernet controller. The Gigabit adapter is
-  used by the Beowulf Linux cluster project.  See
-  <http://cesdis.gsfc.nasa.gov/linux/drivers/yellowfin.html> for more
-  information about this driver in particular and Beowulf in general.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  This is
-  recommended.  The module will be called yellowfin.o.
-
-Realtek 8169 Gigabit Ethernet support
-CONFIG_R8169
-  Say Y here if you have a Realtek 8169 PCI Gigabit Ethernet adapter.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  This is
-  recommended.  The module will be called r8169.o.
-
-General Instruments Surfboard 1000
-CONFIG_NET_SB1000
-  This is a driver for the General Instrument (also known as
-  NextLevel) SURFboard 1000 internal
-  cable modem. This is an ISA card which is used by a number of cable
-  TV companies to provide cable modem access. It's a one-way
-  downstream-only cable modem, meaning that your upstream net link is
-  provided by your regular phone modem.
-
-  At present this driver only compiles as a module, so say M here if
-  you have this card. The module will be called sb1000.o. Then read
-  <file:Documentation/networking/README.sb1000> for information on how
-  to use this module, as it needs special ppp scripts for establishing
-  a connection. Further documentation and the necessary scripts can be
-  found at:
-
-  <http://www.jacksonville.net/~fventuri/>
-  <http://home.adelphia.net/~siglercm/sb1000.html>
-  <http://linuxpower.cx/~cable/>
-
-  If you don't have this card, of course say N.
-
-Adaptec Starfire support
-CONFIG_ADAPTEC_STARFIRE
-  Say Y here if you have an Adaptec Starfire (or DuraLAN) PCI network
-  adapter. The DuraLAN chip is used on the 64 bit PCI boards from
-  Adaptec e.g. the ANA-6922A. The older 32 bit boards use the tulip
-  driver.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  This is
-  recommended.  The module will be called starfire.o.
-
-Alteon AceNIC/3Com 3C985/NetGear GA620 Gigabit support
-CONFIG_ACENIC
-  Say Y here if you have an Alteon AceNIC, 3Com 3C985(B), NetGear
-  GA620, SGI Gigabit or Farallon PN9000-SX PCI Gigabit Ethernet
-  adapter. The driver allows for using the Jumbo Frame option (9000
-  bytes/frame) however it requires that your switches can handle this
-  as well. To enable Jumbo Frames, add `mtu 9000' to your ifconfig
-  line.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  This is
-  recommended.  The module will be called acenic.o.
-
-Omit support for old Tigon I based AceNICs
-CONFIG_ACENIC_OMIT_TIGON_I
-  Say Y here if you only have Tigon II based AceNICs and want to leave
-  out support for the older Tigon I based cards which are no longer
-  being sold (ie. the original Alteon AceNIC and 3Com 3C985 (non B
-  version)).  This will reduce the size of the driver object by
-  app. 100KB.  If you are not sure whether your card is a Tigon I or a
-  Tigon II, say N here.
-
-  The safe and default value for this is N.
-
-SysKonnect SK-98xx and SK-95xx Gigabit Ethernet Adapter family support
-CONFIG_SK98LIN
-  Say Y here if you have a SysKonnect SK-98xx or SK-95xx Gigabit 
-  Ethernet Server Adapter. The following adapters are supported by 
-  this driver:
-  - SK-9521 10/100/1000Base-T Adapter
-  - SK-9821 Gigabit Ethernet 1000Base-T Server Adapter
-  - SK-9822 Gigabit Ethernet 1000Base-T Dual Port Server Adapter
-  - SK-9841 Gigabit Ethernet 1000Base-LX Server Adapter
-  - SK-9842 Gigabit Ethernet 1000Base-LX Dual Port Server Adapter
-  - SK-9843 Gigabit Ethernet 1000Base-SX Server Adapter
-  - SK-9844 Gigabit Ethernet 1000Base-SX Dual Port Server Adapter
-  - SK-9861 Gigabit Ethernet 1000Base-SX Server Adapter
-  - SK-9862 Gigabit Ethernet 1000Base-SX Dual Port Server Adapter
-  - SK-9871 Gigabit Ethernet 1000Base-ZX Server Adapter
-  - SK-9872 Gigabit Ethernet 1000Base-ZX Dual Port Server Adapter
-  - SK-9821 V2.0 Gigabit Ethernet 10/100/1000Base-T Adapter
-  - SK-9841 V2.0 Gigabit Ethernet 1000Base-LX Adapter
-  - SK-9843 V2.0 Gigabit Ethernet 1000Base-SX Adapter
-  - SK-9851 V2.0 Gigabit Ethernet 1000Base-SX Adapter
-  - SK-9861 V2.0 Gigabit Ethernet 1000Base-SX Adapter
-  - SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter
-
-  The adapters support Jumbo Frames.
-  The dual link adapters support link-failover and dual port features.
-  The V2.0 adapters support the scatter-gather functionality with
-  sendfile(). Read Documentation/networking/sk98lin.txt for information about
-  optional driver parameters.
-  Questions concerning this driver may be addressed to:
-    linux@syskonnect.de
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. This is recommended.
-  The module will be called sk98lin.o.
-
-Sun GEM support
-CONFIG_SUNGEM
-  Support for the Sun GEM chip, aka Sun GigabitEthernet/P 2.0.  See also
-  <http://www.sun.com/products-n-solutions/hardware/docs/pdf/806-3985-10.pdf>.
-
-  This chip is also used by Apple under the name GMAC in all their recent
-  machines starting with the first iBook. This includes all AGP capable
-  Apple machines except some early G4s and iMacs that still used a
-  Tulip chip. This driver obsoletes the GMAC driver for these machines.
-  
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called sungem.o.
-
-Broadcom Tigon3 support
-CONFIG_TIGON3
-  This driver supports Broadcom Tigon3 based gigabit Ethernet cards.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  This is
-  recommended.  The module will be called tg3.o.
-
-MyriCOM Gigabit Ethernet support
-CONFIG_MYRI_SBUS
-  This driver supports MyriCOM Sbus gigabit Ethernet cards.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  This is
-  recommended.  The module will be called myri_sbus.o.
-
-D-Link 2000-based Gigabit Ethernet support
-CONFIG_DL2K
-  This driver supports D-Link 2000-based gigabit ethernet cards, which
-  includes
-       D-Link DGE-550T Gigabit Ethernet Adapter.
-       D-Link DL2000-based Gigabit Ethernet Adapter.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  This is
-  recommended.  The module will be called dl2k.o.
-
-EtherExpress Pro/100 support (e100, Alternate Intel driver)
-CONFIG_E100
-  This driver supports Intel(R) PRO/100 family of adapters, which
-  includes:
-
-     Controller  Adapter Name                       Board IDs
-     ----------  ------------                       ---------
-
-     82558       PRO/100+ PCI Adapter               668081-xxx,
-                                                    689661-xxx
-     82558       PRO/100+ Management Adapter        691334-xxx,
-                                                    701738-xxx,
-                                                    721383-xxx
-     82558       PRO/100+ Dual Port Server Adapter  714303-xxx,
-                                                    711269-xxx,
-                                                    A28276-xxx
-     82558       PRO/100+ PCI Server Adapter        710550-xxx
-     82550       PRO/100 S Server Adapter           752438-xxx
-     82559                                          A56831-xxx,
-                                                    A10563-xxx,
-                                                    A12171-xxx,
-                                                    A12321-xxx,
-                                                    A12320-xxx,
-                                                    A12170-xxx
-                                                    748568-xxx
-                                                    748565-xxx
-     82550       PRO/100 S Desktop Adapter          751767-xxx
-     82559                                          748592-xxx,
-                                                    A12167-xxx,
-                                                    A12318-xxx,
-                                                    A12317-xxx,
-                                                    A12165-xxx,
-                                                    748569-xxx
-     82559       PRO/100+ Server Adapter            729757-xxx
-     82559       PRO/100 S Management Adapter       748566-xxx,
-                                                    748564-xxx
-     82550       PRO/100 S Dual Port Server Adapter A56831-xxx
-     82551       PRO/100 M Desktop Adapter          A80897-xxx
-                 PRO/100 S Advanced Management Adapter
-                                                    747842-xxx,
-                                                    745171-xxx
-     CNR         PRO/100 VE Desktop Adapter         A10386-xxx,
-                                                    A10725-xxx,
-                                                    A23801-xxx,
-                                                    A19716-xxx
-                 PRO/100 VM Desktop Adapter         A14323-xxx,
-                                                    A19725-xxx,
-                                                    A23801-xxx,
-                                                    A22220-xxx,
-                                                    A23796-xxx
-
-
-  To verify that your adapter is supported, find the board ID number
-  on the adapter. Look for a label that has a barcode and a number
-  in the format 123456-001 (six digits hyphen three digits). Match
-  this to the list of numbers above.
-
-  For more information on how to identify your adapter, go to the
-  Adapter & Driver ID Guide at:
-
-    http://support.intel.com/support/network/adapter/pro100/21397.htm
-
-  For the latest Intel PRO/100 network driver for Linux, see:
-
-    http://appsr.intel.com/scripts-df/support_intel.asp
-
-  More specific information on configuring the driver is in
-  <file:Documentation/networking/e100.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called e100.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-Intel(R) PRO/1000 Gigabit Ethernet support
-CONFIG_E1000
-  This driver supports Intel(R) PRO/1000 gigabit ethernet family of
-  adapters, which includes:
-
-     Controller  Adapter Name                         Board IDs
-     ----------  ------------                         ---------
-     82542       PRO/1000 Gigabit Server Adapter      700262-xxx,
-                                                      717037-xxx
-     82543       PRO/1000 F Server Adapter            738640-xxx,
-                                                      A38888-xxx
-     82543       PRO/1000 T Server Adapter            A19845-xxx,
-                                                      A33948-xxx
-     82544       PRO/1000 XT Server Adapter           A51580-xxx
-     82544       PRO/1000 XF Server Adapter           A50484-xxx
-     82544       PRO/1000 T Desktop Adapter           A62947-xxx
-     82540       PRO/1000 MT Desktop Adapter          A78408-xxx
-     82541       PRO/1000 MT Desktop Adapter          C91016-xxx
-     82545       PRO/1000 MT Server Adapter           A92165-xxx
-     82546       PRO/1000 MT Dual Port Server Adapter A92111-xxx
-     82545       PRO/1000 MF Server Adapter           A91622-xxx
-     82545       PRO/1000 MF Server Adapter(LX)       A91624-xxx
-     82546       PRO/1000 MF Dual Port Server Adapter A91620-xxx 
-
-  For more information on how to identify your adapter, go to the
-  Adapter & Driver ID Guide at:
-
-   <http://support.intel.com/support/network/adapter/pro100/21397.htm>
-
-  For general information and support, go to the Intel support
-  website at:
-
-   <http://support.intel.com>
-
-  More specific information on configuring the driver is in 
-  <file:Documentation/networking/e1000.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called e1000.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-AMD LANCE and PCnet (AT1500 and NE2100) support
-CONFIG_LANCE
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>. Some LinkSys cards are
-  of this type.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  This is
-  recommended.  The module will be called lance.o.
-
-SGI IOC3 Ethernet
-CONFIG_SGI_IOC3_ETH
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-National Semiconductor DP83902AV support
-CONFIG_STNIC
-  Support for cards based on the National Semiconductor DP83902AV
-  ST-NIC Serial Network Interface Controller for Twisted Pair.  This
-  is a 10Mbit/sec Ethernet controller.  Product overview and specs at
-  <http://www.national.com/pf/DP/DP83902A.html>.
-
-  If unsure, say N.
-
-3COM cards
-CONFIG_NET_VENDOR_3COM
-  If you have a network (Ethernet) card belonging to this class, say Y
-  and read the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  Note that the answer to this question doesn't directly affect the
-  kernel: saying N will just cause the configurator to skip all
-  the questions about 3COM cards. If you say Y, you will be asked for
-  your specific card in the following questions.
-
-3c501 "EtherLink" support
-CONFIG_EL1
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.  Also, consider buying a
-  new card, since the 3c501 is slow, broken, and obsolete: you will
-  have problems.  Some people suggest to ping ("man ping") a nearby
-  machine every minute ("man cron") when using this card.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called 3c501.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-3c503 "EtherLink II" support
-CONFIG_EL2
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called 3c503.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-3c505 "EtherLink Plus" support
-CONFIG_ELPLUS
-  Information about this network (Ethernet) card can be found in
-  <file:Documentation/networking/3c505.txt>.  If you have a card of
-  this type, say Y and read the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt> as well as
-  <file:Documentation/networking/net-modules.txt>.  The module will be
-  called 3c505.o.
-
-3c507 (EtherLink 16) support
-CONFIG_EL16
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called 3c507.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-3c523 "EtherlinkMC" support
-CONFIG_ELMC
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called 3c523.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-3c527 "EtherLink/MC 32" support
-CONFIG_ELMC_II
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called 3c527.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-3c509/3c529 (MCA)/3c579 "EtherLink III"  support
-CONFIG_EL3
-  If you have a network (Ethernet) card belonging to the 3Com
-  EtherLinkIII series, say Y and read the Ethernet-HOWTO, available
-  from <http://www.tldp.org/docs.html#howto>.
-
-  If your card is not working you may need to use the DOS
-  setup disk to disable Plug & Play mode, and to select the default
-  media type.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt> as well as
-  <file:Documentation/networking/net-modules.txt>.  The module will be
-  called 3c509.o.
-
-3c515 ISA Fast EtherLink
-CONFIG_3C515
-  If you have a 3Com ISA EtherLink XL "Corkscrew" 3c515 Fast Ethernet
-  network card, say Y and read the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt> as well as
-  <file:Documentation/networking/net-modules.txt>.  The module will be
-  called 3c515.o.
-
-3c590/3c900 series (592/595/597) "Vortex/Boomerang/Cyclone" support
-CONFIG_VORTEX
-  This option enables driver support for a large number of 10mbps and
-  10/100mbps EISA, PCI and PCMCIA 3Com network cards:
-
-  "Vortex"    (Fast EtherLink 3c590/3c592/3c595/3c597) EISA and PCI
-  "Boomerang" (EtherLink XL 3c900 or 3c905)            PCI
-  "Cyclone"   (3c540/3c900/3c905/3c980/3c575/3c656)    PCI and Cardbus
-  "Tornado"   (3c905)                                  PCI
-  "Hurricane" (3c555/3cSOHO)                           PCI
-
-  If you have such a card, say Y and read the Ethernet-HOWTO,
-  available from <http://www.tldp.org/docs.html#howto>. More
-  specific information is in
-  <file:Documentation/networking/vortex.txt> and in the comments at
-  the beginning of <file:drivers/net/3c59x.c>.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called 3c59x.o.
-
-3cr990 series "Typhoon" support
-CONFIG_TYPHOON
-  This option enables driver support for the 3cr990 series of cards:
-
-  3C990-TX, 3CR990-TX-95, 3CR990-TX-97, 3CR990-FX-95, 3CR990-FX-97,
-  3CR990SVR, 3CR990SVR95, 3CR990SVR97, 3CR990-FX-95 Server,
-  3CR990-FX-97 Server, 3C990B-TX-M, 3C990BSVR
-
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.linuxdoc.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called typhoon.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-Other ISA cards
-CONFIG_NET_ISA
-  If your network (Ethernet) card hasn't been mentioned yet and its
-  bus system (that's the way the cards talks to the other components
-  of your computer) is ISA (as opposed to EISA, VLB or PCI), say Y.
-  Make sure you know the name of your card. Read the Ethernet-HOWTO,
-  available from <http://www.tldp.org/docs.html#howto>.
-
-  If unsure, say Y.
-
-  Note that the answer to this question doesn't directly affect the
-  kernel: saying N will just cause the configurator to skip all
-  the remaining ISA network card questions. If you say Y, you will be
-  asked for your specific card in the following questions.
-
-Generic ARCnet support
-CONFIG_ARCNET
-  If you have a network card of this type, say Y and check out the
-  (arguably) beautiful poetry in
-  <file:Documentation/networking/arcnet.txt>.
-
-  You need both this driver, and the driver for the particular ARCnet
-  chipset of your card. If you don't know, then it's probably a
-  COM90xx type card, so say Y (or M) to "ARCnet COM90xx chipset
-  support" below.
-
-  You might also want to have a look at the Ethernet-HOWTO, available
-  from <http://www.tldp.org/docs.html#howto>(even though ARCnet
-  is not really Ethernet).
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called arcnet.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-Enable old ARCNet packet format (RFC 1051)
-CONFIG_ARCNET_1051
-  This allows you to use RFC1051 with your ARCnet card via the virtual
-  arc0s device. You only need arc0s if you want to talk to ARCnet
-  software complying with the "old" standard, specifically, the DOS
-  arcnet.com packet driver, Amigas running AmiTCP, and some variants
-  of NetBSD. You do not need to say Y here to communicate with
-  industry-standard RFC1201 implementations, like the arcether.com
-  packet driver or most DOS/Windows ODI drivers. RFC1201 is included
-  automatically as the arc0 device. Please read the ARCnet
-  documentation in <file:Documentation/networking/arcnet.txt> for more
-  information about using arc0e and arc0s.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called rfc1051.o.
-
-Enable standard ARCNet packet format (RFC 1201)
-CONFIG_ARCNET_1201
-  This allows you to use RFC1201 with your ARCnet card via the virtual
-  arc0 device.  You need to say Y here to communicate with
-  industry-standard RFC1201 implementations, like the arcether.com
-  packet driver or most DOS/Windows ODI drivers.  Please read the
-  ARCnet documentation in <file:Documentation/networking/arcnet.txt>
-  for more information about using arc0.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called rfc1201.o.
-
-Enable raw mode packet interface
-CONFIG_ARCNET_RAW
-  ARCnet "raw mode" packet encapsulation, no soft headers.  Unlikely
-  to work unless talking to a copy of the same Linux arcnet driver,
-  but perhaps marginally faster in that case.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called arc-rawmode.o.
-
-ARCnet COM90xx (normal) chipset driver
-CONFIG_ARCNET_COM90xx
-  This is the chipset driver for the standard COM90xx cards. If you
-  have always used the old ARCnet driver without knowing what type of
-  card you had, this is probably the one for you.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called com90xx.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-ARCnet COM90xx (IO mapped) chipset driver
-CONFIG_ARCNET_COM90xxIO
-  This is the chipset driver for the COM90xx cards, using them in
-  IO-mapped mode instead of memory-mapped mode. This is slower than
-  the normal driver. Only use it if your card doesn't support shared
-  memory.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called com90io.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-ARCnet COM90xx (RIM I) chipset driver
-CONFIG_ARCNET_RIM_I
-  This is yet another chipset driver for the COM90xx cards, but this
-  time only using memory-mapped mode, and no IO ports at all. This
-  driver is completely untested, so if you have one of these cards,
-  please mail dwmw2@infradead.org, especially if it works!
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you
-  want). The module will be called arc-rimi.o.  If you want to compile
-  it as a module, say M here and read <file:Documentation/modules.txt>
-  as  well as <file:Documentation/networking/net-modules.txt>.
-
-ARCnet COM20020 chipset driver
-CONFIG_ARCNET_COM20020
-  This is the driver for the new COM20020 chipset. It supports such
-  things as promiscuous mode, so packet sniffing is possible, and
-  extra diagnostic information.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called com20020.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt> as
-  well as <file:Documentation/networking/net-modules.txt>.
-
-Cabletron E21xx support
-CONFIG_E2100
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called e2100.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-CS89x0 support (Daynaport CS and LC cards)
-CONFIG_CS89x0
-  Support for CS89x0 chipset based Ethernet cards. If you have a
-  network (Ethernet) card of this type, say Y and read the
-  Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto> as well as
-  <file:Documentation/networking/cs89x0.txt>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt> as well as
-  <file:Documentation/networking/net-modules.txt>.  The module will be
-  called cs89x.o.
-
-DEPCA, DE10x, DE200, DE201, DE202, DE422 support
-CONFIG_DEPCA
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto> as well as
-  <file:drivers/net/depca.c>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt> as well as
-  <file:Documentation/networking/net-modules.txt>.  The module will be
-  called
-  depca.o.
-
-EtherWORKS 3 (DE203, DE204, DE205) support
-CONFIG_EWRK3
-  This driver supports the DE203, DE204 and DE205 network (Ethernet)
-  cards. If this is for you, say Y and read
-  <file:Documentation/networking/ewrk3.txt> in the kernel source as
-  well as the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt> as well as
-  <file:Documentation/networking/net-modules.txt>.  The module will be
-  called ewrk3.o.
-
-SEEQ8005 support
-CONFIG_SEEQ8005
-  This is a driver for the SEEQ 8005 network (Ethernet) card.  If this
-  is for you, read the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt> as well as
-  <file:Documentation/networking/net-modules.txt>.  The module will be
-  called ewrk3.o.
-
-AT1700/1720 support
-CONFIG_AT1700
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt> as well as
-  <file:Documentation/networking/net-modules.txt>.  The module will be
-  called at1700.o.
-
-FMV-181/182/183/184 support
-CONFIG_FMV18X
-  If you have a Fujitsu FMV-181/182/183/184 network (Ethernet) card,
-  say Y and read the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  If you use an FMV-183 or FMV-184 and it is not working, you may need
-  to disable Plug & Play mode of the card.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called fmv18x.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-EtherExpressPro and EtherExpress 10 (i82595) support
-CONFIG_EEXPRESS_PRO
-  If you have a network (Ethernet) card of this type, say Y. This
-  driver supports intel i82595{FX,TX} based boards. Note however
-  that the EtherExpress PRO/100 Ethernet card has its own separate
-  driver.  Please read the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called eepro.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-EtherExpress 16 support
-CONFIG_EEXPRESS
-  If you have an EtherExpress16 network (Ethernet) card, say Y and
-  read the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.  Note that the Intel
-  EtherExpress16 card used to be regarded as a very poor choice
-  because the driver was very unreliable. We now have a new driver
-  that should do better.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt> as well as
-  <file:Documentation/networking/net-modules.txt>.  The module will be
-  called eexpress.o.
-
-Packet Engines Hamachi GNIC-II support
-CONFIG_HAMACHI
-  If you have a Gigabit Ethernet card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt> as well as
-  <file:Documentation/networking/net-modules.txt>.  The module will be
-  called hamachi.o.
-
-HP PCLAN+ (27247B and 27252A) support
-CONFIG_HPLAN_PLUS
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called hp-plus.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-HP PCLAN (27245 and other 27xxx series) support
-CONFIG_HPLAN
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called hp.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-HP 10/100VG PCLAN (ISA, EISA, PCI) support
-CONFIG_HP100
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt> as well as
-  <file:Documentation/networking/net-modules.txt>.  The module will be
-  called hp100.o.
-
-NE2000/NE1000 support
-CONFIG_NE2000
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.  Many Ethernet cards
-  without a specific driver are compatible with NE2000.
-
-  If you have a PCI NE2000 card however, say N here and Y to "PCI
-  NE2000 support", above. If you have a NE2000 card and are running on
-  an MCA system (a bus system used on some IBM PS/2 computers and
-  laptops), say N here and Y to "NE/2 (ne2000 MCA version) support",
-  below.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ne.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-National Semiconductor DP8381x series PCI Ethernet support
-CONFIG_NATSEMI
-  This driver is for the National Semiconductor DP83810 series,
-  which is used in cards from PureData, NetGear, Linksys
-  and others, including the 83815 chip.
-  More specific information and updates are available from
-  <http://www.scyld.com/network/natsemi.html>.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called natsemi.o.
-
-NatSemi workaround for high errors
-CONFIG_NATSEMI_CABLE_MAGIC
-  Some systems see lots of errors with NatSemi ethernet controllers
-  on certain cables.  If you are seeing lots of errors, try turning
-  this option on.  Some boards have incorrect values for supporting
-  resistors that can cause this change to break.  If you turn this
-  option on and your network suddenly stops working, turn this
-  option off.
-
-SK_G16 support
-CONFIG_SK_G16
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-NE/2 (ne2000 MCA version) support
-CONFIG_NE2_MCA
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ne2.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-SKnet MCA support
-CONFIG_SKMC
-  These are Micro Channel Ethernet adapters. You need to say Y to "MCA
-  support" in order to use this driver.  Supported cards are the SKnet
-  Junior MC2 and the SKnet MC2(+).  The driver automatically
-  distinguishes between the two cards. Note that using multiple boards
-  of different type hasn't been tested with this driver.  Say Y if you
-  have one of these Ethernet adapters.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module is called sk_mca.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-IBM LAN Adapter/A support
-CONFIG_IBMLANA
-  This is a Micro Channel Ethernet adapter.  You need to set
-  CONFIG_MCA to use this driver.  It is both available as an in-kernel
-  driver and as a module ( = code which can be inserted in and removed
-  from the running kernel whenever you want).  If you want to compile
-  it as a module, say M here and read <file:Documentation/modules.txt>
-  as well as <file:Documentation/networking/net-modules.txt>. The only
-  currently supported card is the IBM LAN Adapter/A for Ethernet.  It
-  will both support 16K and 32K memory windows, however a 32K window
-  gives a better security against packet losses.  Usage of multiple
-  boards with this driver should be possible, but has not been tested
-  up to now due to lack of hardware.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called ibmlana.o.
-
-EISA, VLB, PCI and on board controllers
-CONFIG_NET_PCI
-  This is another class of network cards which attach directly to the
-  bus. If you have one of those, say Y and read the Ethernet-HOWTO,
-  available from <http://www.tldp.org/docs.html#howto>.
-
-  Note that the answer to this question doesn't directly affect the
-  kernel: saying N will just cause the configurator to skip all
-  the questions about this class of network cards. If you say Y, you
-  will be asked for your specific card in the following questions. If
-  you are unsure, say Y.
-
-AMD PCnet32 (VLB and PCI) support
-CONFIG_PCNET32
-  If you have a PCnet32 or PCnetPCI based network (Ethernet) card,
-  answer Y here and read the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called pcnet32.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-AMD 8111 (new PCI lance) support
-CONFIG_AMD8111_ETH
-  If you have an AMD 8111-based PCI lance ethernet card,
-  answer Y here and read the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called amd8111e.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-Ansel Communications EISA 3200 support
-CONFIG_AC3200
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ac3200.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-Mylex EISA LNE390A/LNE390B support
-CONFIG_LNE390
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called lne390.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-Novell/Eagle/Microdyne NE3210 EISA support
-CONFIG_NE3210
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.  Note that this driver
-  will NOT WORK for NE3200 cards as they are completely different.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ne3210.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-Apricot Xen-II on board Ethernet
-CONFIG_APRICOT
-  If you have a network (Ethernet) controller of this type, say Y and
-  read the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt> as well as
-  <file:Documentation/networking/net-modules.txt>.  The module will be
-  called apricot.o.
-
-Generic DECchip & DIGITAL EtherWORKS PCI/EISA
-CONFIG_DE4X5
-  This is support for the DIGITAL series of PCI/EISA Ethernet cards.
-  These include the DE425, DE434, DE435, DE450 and DE500 models.  If
-  you have a network card of this type, say Y and read the
-  Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>. More specific
-  information is contained in
-  <file:Documentation/networking/de4x5.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called de4x5.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-DECchip Tulip (dc21x4x) PCI support
-CONFIG_TULIP
-  This driver is developed for the SMC EtherPower series Ethernet
-  cards and also works with cards based on the DECchip 
-  21040/21041/21140 (Tulip series) chips.  Some LinkSys PCI cards are
-  of this type.  (If your card is NOT SMC EtherPower 10/100 PCI
-  (smc9332dst), you can also try the driver for "Generic DECchip"
-  cards, above.  However, most people with a network card of this type
-  will say Y here.) Do read the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.  More specific
-  information is contained in 
-  <file:Documentation/networking/tulip.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called tulip.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-New Tulip bus configuration
-CONFIG_TULIP_MWI 
-  This configures your Tulip card specifically for the card and
-  system cache line size type you are using.
-
-  This is experimental code, not yet tested on many boards.
-
-  If unsure, say N.
-
-Use PCI shared memory for NIC registers
-CONFIG_TULIP_MMIO
-  Use PCI shared memory for the NIC registers, rather than going through 
-  the Tulip's PIO (programmed I/O ports).  Faster, but could produce 
-  obscure bugs if your mainboard has memory controller timing issues.
-  If in doubt, say N.
-
-Digi Intl. RightSwitch SE-X support
-CONFIG_DGRS
-  This is support for the Digi International RightSwitch series of
-  PCI/EISA Ethernet switch cards. These include the SE-4 and the SE-6
-  models.  If you have a network card of this type, say Y and read the
-  Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.  More specific
-  information is contained in <file:Documentation/networking/dgrs.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called dgrs.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-EtherExpress Pro/100 support
-CONFIG_EEPRO100
-  If you have an Intel EtherExpress PRO/100 PCI network (Ethernet)
-  card, say Y and read the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called eepro100.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt> as
-  well as <file:Documentation/networking/net-modules.txt>.
-
-Use PIO instead of MMIO
-CONFIG_EEPRO100_PIO
-  This instructs the driver to use programmed I/O ports (PIO) instead
-  of PCI shared memory (MMIO).  This can possibly solve some problems
-  in case your mainboard has memory consistency issues.  If unsure,
-  say N.
-
-Enable Power Management
-CONFIG_EEPRO100_PM
-  Many Intel EtherExpress PRO/100 PCI network cards are capable
-  of providing power management capabilities.  To make use of these
-  capabilities, say Y.
-
-  WARNING:  This option is intended for kernel developers and testers.
-  It is still very experimental, with some people reporting complete
-  lockups.
-
-  It is recommended to say N here.
-
-Myson MTD-8xx PCI Ethernet support
-CONFIG_FEALNX
-  Say Y here to support the Mysom MTD-800 family of PCI-based Ethernet
-  cards. Specifications and data at
-  <http://www.myson.com.hk/mtd/datasheet/>.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called fealnx.o.
-
-LP486E on board Ethernet
-CONFIG_LP486E
-  Say Y here to support the 82596-based on-board Ethernet controller
-  for the Panther motherboard, which is one of the two shipped in the
-  Intel Professional Workstation.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called lp486e.o.
-
-ICL EtherTeam 16i/32 support
-CONFIG_ETH16I
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called eth16i.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-TI ThunderLAN support
-CONFIG_TLAN
-  If you have a PCI Ethernet network card based on the ThunderLAN chip
-  which is supported by this driver, say Y and read the
-  Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  Devices currently supported by this driver are Compaq Netelligent,
-  Compaq NetFlex and Olicom cards.  Please read the file
-  <file:Documentation/networking/tlan.txt> for more details.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called tlan.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-  Please email feedback to  torben.mathiasen@compaq.com.
-
-VIA Rhine support
-CONFIG_VIA_RHINE
-  If you have a VIA "rhine" based network card (Rhine-I (3043) or
-  Rhine-2 (VT86c100A)), say Y here.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called via-rhine.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt> as
-  well as <file:Documentation/networking/net-modules.txt>.
-
-VIA Rhine MMIO support (EXPERIMENTAL)
-CONFIG_VIA_RHINE_MMIO
-  This instructs the driver to use PCI shared memory (MMIO) instead of
-  programmed I/O ports (PIO). Enabling this gives an improvement in
-  processing time in parts of the driver.
-
-  It is not known if this works reliably on all "rhine" based cards,
-  but it has been tested successfully on some DFE-530TX adapters.
-
-  If unsure, say N.
-
-Davicom DM910x/DM980x support
-CONFIG_DM9102
-  This driver is for DM9102(A)/DM9132/DM9801 compatible PCI cards from
-  Davicom (<http://www.davicom.com.tw/>).  If you have such a network
-  (Ethernet) card, say Y.  Some information is contained in the file
-  <file:Documentation/networking/dmfe.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called dmfe.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-Racal-Interlan EISA ES3210 support
-CONFIG_ES3210
-  If you have a network (Ethernet) card of this type, say Y and read
-  the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called es3210.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/networking/net-modules.txt>.
-
-SMC EtherPower II
-CONFIG_EPIC100
-  This driver is for the SMC EtherPower II 9432 PCI Ethernet NIC,
-  which is based on the SMC83c17x (EPIC/100).
-  More specific information and updates are available from
-  <http://www.scyld.com/network/epic100.html>.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called epic100.o.
-
-DEC LANCE Ethernet controller support
-CONFIG_DECLANCE
-  This driver is for the series of Ethernet controllers produced by
-  DEC (now Compaq) based on the AMD Lance chipset, including the
-  DEPCA series.  (This chipset is better known via the NE2100 cards.)
-
-SGI Seeq Ethernet controller support
-CONFIG_SGISEEQ
-  Say Y here if you have an Seeq based Ethernet network card. This is
-  used in many Silicon Graphics machines.
-
-Sundance Alta PCI Ethernet support
-CONFIG_SUNDANCE
-  This driver is for the Sundance "Alta" chip.
-  More specific information and updates are available from
-  <http://www.scyld.com/network/sundance.html>.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called sundance.o.
-
-Sundance Alta memory-mapped I/O support
-CONFIG_SUNDANCE_MMIO
-  Enable memory-mapped I/O for interaction with Sundance NIC registers.
-  Do NOT enable this by default, PIO (enabled when MMIO is disabled)
-  is known to solve bugs on certain chips.
-
-  If unsure, say N.
-
-Sun3/Sun3x on-board LANCE support
-CONFIG_SUN3LANCE
-  Most Sun3 and Sun3x motherboards (including the 3/50, 3/60 and 3/80)
-  featured an AMD Lance 10Mbit Ethernet controller on board; say Y
-  here to compile in the Linux driver for this and enable Ethernet.
-  General Linux information on the Sun 3 and 3x series (now
-  discontinued) is at
-  <http://www.angelfire.com/ca2/tech68k/sun3.html>.
-
-  If you're not building a kernel for a Sun 3, say N.
-
-Sun3 on-board Intel 82586 support
-CONFIG_SUN3_82586
-  This driver enables support for the on-board Intel 82586 based
-  Ethernet adapter found on Sun 3/1xx and 3/2xx motherboards.  Note
-  that this driver does not support 82586-based adapters on additional
-  VME boards.
-
-Winbond W89c840 PCI Ethernet support
-CONFIG_WINBOND_840
-  This driver is for the Winbond W89c840 chip.  It also works with
-  the TX9882 chip on the Compex RL100-ATX board.
-  More specific information and updates are available from
-  <http://www.scyld.com/network/drivers.html>.
-
-Zenith Z-Note support
-CONFIG_ZNET
-  The Zenith Z-Note notebook computer has a built-in network
-  (Ethernet) card, and this is the Linux driver for it. Note that the
-  IBM Thinkpad 300 is compatible with the Z-Note and is also supported
-  by this driver. Read the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-Philips SAA9730 Ethernet support
-CONFIG_LAN_SAA9730
-  The SAA9730 is a combined multimedia and peripheral controller used
-  in thin clients, Internet access terminals, and diskless
-  workstations.
-  See <http://www.semiconductors.philips.com/pip/SAA9730_flyer_1>.
-
-Pocket and portable adapters
-CONFIG_NET_POCKET
-  Cute little network (Ethernet) devices which attach to the parallel
-  port ("pocket adapters"), commonly used with laptops. If you have
-  one of those, say Y and read the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  If you want to plug a network (or some other) card into the PCMCIA
-  (or PC-card) slot of your laptop instead (PCMCIA is the standard for
-  credit card size extension cards used by all modern laptops), you
-  need the pcmcia-cs package (location contained in the file
-  <file:Documentation/Changes>) and you can say N here.
-
-  Laptop users should read the Linux Laptop home page at
-  <http://www.cs.utexas.edu/users/kharker/linux-laptop/>.
-
-  Note that the answer to this question doesn't directly affect the
-  kernel: saying N will just cause the configurator to skip all
-  the questions about this class of network devices. If you say Y, you
-  will be asked for your specific device in the following questions.
-
-AT-LAN-TEC/RealTek pocket adapter support
-CONFIG_ATP
-  This is a network (Ethernet) device which attaches to your parallel
-  port. Read <file:drivers/net/atp.c> as well as the Ethernet-HOWTO,
-  available from <http://www.tldp.org/docs.html#howto>, if you
-  want to use this.  If you intend to use this driver, you should have
-  said N to the "Parallel printer support", because the two drivers
-  don't like each other.
-
-  If you want to compile this driver as a module however ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want), say M here and read
-  <file:Documentation/modules.txt>.  The module will be called atp.o.
-
-D-Link DE600 pocket adapter support
-CONFIG_DE600
-  This is a network (Ethernet) device which attaches to your parallel
-  port. Read <file:Documentation/networking/DLINK.txt> as well as the
-  Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>, if you want to use
-  this. It is possible to have several devices share a single parallel
-  port and it is safe to compile the corresponding drivers into the
-  kernel.
-
-  If you want to compile this driver as a module however ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want), say M here and read
-  <file:Documentation/modules.txt>.
-  The module will be called de600.o.
-
-D-Link DE620 pocket adapter support
-CONFIG_DE620
-  This is a network (Ethernet) device which attaches to your parallel
-  port. Read <file:Documentation/networking/DLINK.txt> as well as the
-  Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>, if you want to use
-  this. It is possible to have several devices share a single parallel
-  port and it is safe to compile the corresponding drivers into the
-  kernel.
-
-  If you want to compile this driver as a module however ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want), say M here and read
-  <file:Documentation/modules.txt>.
-  The module will be called de620.o.
-
-Token Ring driver support
-CONFIG_TR
-  Token Ring is IBM's way of communication on a local network; the
-  rest of the world uses Ethernet. To participate on a Token Ring
-  network, you need a special Token ring network card. If you are
-  connected to such a Token Ring network and want to use your Token
-  Ring card under Linux, say Y here and to the driver for your
-  particular card below and read the Token-Ring mini-HOWTO, available
-  from <http://www.tldp.org/docs.html#howto>. Most people can
-  say N here.
-
-IBM Tropic chipset based adapter support
-CONFIG_IBMTR
-  This is support for all IBM Token Ring cards that don't use DMA. If
-  you have such a beast, say Y and read the Token-Ring mini-HOWTO,
-  available from <http://www.tldp.org/docs.html#howto>.
-
-  Warning: this driver will almost definitely fail if more than one
-  active Token Ring card is present.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ibmtr.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-IBM Olympic chipset PCI adapter support
-CONFIG_IBMOL
-  This is support for all non-Lanstreamer IBM PCI Token Ring Cards.
-  Specifically this is all IBM PCI, PCI Wake On Lan, PCI II, PCI II
-  Wake On Lan, and PCI 100/16/4 adapters.
-
-  If you have such an adapter, say Y and read the Token-Ring
-  mini-HOWTO, available from <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called olympic.o. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-  Also read <file:Documentation/networking/olympic.txt> or check the
-  Linux Token Ring Project site for the latest information at
-  <http://www.linuxtr.net/>.
-
-IBM Lanstreamer chipset PCI adapter support
-CONFIG_IBMLS
-  This is support for IBM Lanstreamer PCI Token Ring Cards.
-
-  If you have such an adapter, say Y and read the Token-Ring
-  mini-HOWTO, available from <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a modules ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The modules will be called lanstreamer.o. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-Generic TMS380 Token Ring ISA/PCI/MCA/EISA adapter support
-CONFIG_TMS380TR
-  This driver provides generic support for token ring adapters
-  based on the Texas Instruments TMS380 series chipsets.  This
-  includes the SysKonnect TR4/16(+) ISA (SK-4190), SysKonnect
-  TR4/16(+) PCI (SK-4590), SysKonnect TR4/16 PCI (SK-4591),
-  Compaq 4/16 PCI, Thomas-Conrad TC4048 4/16 PCI, and several
-  Madge adapters.  If you say Y here, you will be asked to select
-  which cards to support below.  If you're using modules, each
-  class of card will be supported by a separate module.
-
-  If you have such an adapter and would like to use it, say Y and
-  read the Token-Ring mini-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  Also read the file <file:Documentation/networking/tms380tr.txt> or
-  check <http://www.auk.cx/tms380tr/>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called tms380tr.o. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-Generic TMS380 PCI support
-CONFIG_TMSPCI
-  This tms380 module supports generic TMS380-based PCI cards.
-
-  These cards are known to work:
-     - Compaq 4/16 TR PCI
-     - SysKonnect TR4/16 PCI (SK-4590/SK-4591)
-     - Thomas-Conrad TC4048 PCI 4/16
-     - 3Com Token Link Velocity
-
-  This driver is available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called tmspci.o. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-Generic TMS380 ISA support
-CONFIG_TMSISA
-  This tms380 module supports generic TMS380-based ISA cards.
-
-  These cards are known to work:
-     - SysKonnect TR4/16 ISA (SK-4190)
-
-  This driver is available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called tmsisa.o. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-Madge Smart 16/4 PCI Mk2 support
-CONFIG_ABYSS
-  This tms380 module supports the Madge Smart 16/4 PCI Mk2
-  cards (51-02).
-
-  This driver is available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called abyss.o. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-Madge Smart 16/4 Ringnode MicroChannel
-CONFIG_MADGEMC
-  This tms380 module supports the Madge Smart 16/4 MC16 and MC32
-  MicroChannel adapters.
-
-  This driver is available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called madgemc.o. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-SMC ISA/MCA Token Ring adapter support
-CONFIG_SMCTR
-  This is support for the ISA and MCA SMC Token Ring cards,
-  specifically SMC TokenCard Elite (8115T) and SMC TokenCard Elite/A
-  (8115T/A) adapters.
-
-  If you have such an adapter and would like to use it, say Y or M and
-  read the Token-Ring mini-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto> and the file
-  <file:Documentation/networking/smctr.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called smctr.o. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-3COM 3C359 Token Link Velocity XL PCI adapter support
-CONFIG_3C359
-  This is support for the 3Com PCI Velocity XL cards, specifically
-  the 3Com 3C359, please note this is not for the 3C339 cards, you
-  should use the tms380 driver instead.
-
-  If you have such an adapter, say Y and read the Token-Ring
-  mini-HOWTO, available from <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will will be called 3c359.o. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt.
-
-  Also read the file <file:Documentation/networking/3c359.txt> or check the 
-  Linux Token Ring Project site for the latest information at
-  <http://www.linuxtr.net>
-
-Sun Happy Meal 10/100baseT support
-CONFIG_HAPPYMEAL
-  This driver supports the "hme" interface present on most Ultra
-  systems and as an option on older Sbus systems. This driver supports
-  both PCI and Sbus devices. This driver also supports the "qfe" quad
-  100baseT device available in both PCI and Sbus configurations.
-
-  This support is also available as a module called sunhme.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Sun Lance support
-CONFIG_SUNLANCE
-  This driver supports the "le" interface present on all 32-bit Sparc
-  systems, on some older Ultra systems and as an Sbus option.  These
-  cards are based on the AMD Lance chipset, which is better known
-  via the NE2100 cards.
-
-  This support is also available as a module called sunlance.o ( =
-  code which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Sun BigMAC 10/100baseT support
-CONFIG_SUNBMAC
-  This driver supports the "be" interface available as an Sbus option.
-  This is Sun's older 100baseT Ethernet device.
-
-  This support is also available as a module called sunbmac.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Sun QuadEthernet support
-CONFIG_SUNQE
-  This driver supports the "qe" 10baseT Ethernet device, available as
-  an Sbus option. Note that this is not the same as Quad FastEthernet
-  "qfe" which is supported by the Happy Meal driver instead.
-
-  This support is also available as a module called sunqe.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Traffic Shaper
-CONFIG_SHAPER
-  The traffic shaper is a virtual network device that allows you to
-  limit the rate of outgoing data flow over some other network device.
-  The traffic that you want to slow down can then be routed through
-  these virtual devices. See
-  <file:Documentation/networking/shaper.txt> for more information.
-
-  An alternative to this traffic shaper is the experimental
-  Class-Based Queueing (CBQ) scheduling support which you get if you
-  say Y to "QoS and/or fair queueing" above.
-
-  To set up and configure shaper devices, you need the shapecfg
-  program, available from <ftp://shadow.cabi.net/pub/Linux/> in the
-  shaper package.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called shaper.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.  If
-  unsure, say N.
-
-FDDI driver support
-CONFIG_FDDI
-  Fiber Distributed Data Interface is a high speed local area network
-  design; essentially a replacement for high speed Ethernet. FDDI can
-  run over copper or fiber. If you are connected to such a network and
-  want a driver for the FDDI card in your computer, say Y here (and
-  then also Y to the driver for your FDDI card, below). Most people
-  will say N.
-
-Digital DEFEA and DEFPA adapter support
-CONFIG_DEFXX
-  This is support for the DIGITAL series of EISA (DEFEA) and PCI
-  (DEFPA) controllers which can connect you to a local FDDI network.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called defxx.o.
-
-SysKonnect FDDI PCI support
-CONFIG_SKFP
-  Say Y here if you have a SysKonnect FDDI PCI adapter.
-  The following adapters are supported by this driver:
-  - SK-5521 (SK-NET FDDI-UP)
-  - SK-5522 (SK-NET FDDI-UP DAS)
-  - SK-5541 (SK-NET FDDI-FP)
-  - SK-5543 (SK-NET FDDI-LP)
-  - SK-5544 (SK-NET FDDI-LP DAS)
-  - SK-5821 (SK-NET FDDI-UP64)
-  - SK-5822 (SK-NET FDDI-UP64 DAS)
-  - SK-5841 (SK-NET FDDI-FP64)
-  - SK-5843 (SK-NET FDDI-LP64)
-  - SK-5844 (SK-NET FDDI-LP64 DAS)
-  - Netelligent 100 FDDI DAS Fibre SC
-  - Netelligent 100 FDDI SAS Fibre SC
-  - Netelligent 100 FDDI DAS UTP
-  - Netelligent 100 FDDI SAS UTP
-  - Netelligent 100 FDDI SAS Fibre MIC
-
-  Read <file:Documentation/networking/skfp.txt> for information about
-  the driver.
-
-  Questions concerning this driver can be addressed to:
-    linux@syskonnect.de
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  This is
-  recommended.  The module will be called skfp.o.
-
-HIgh Performance Parallel Interface (HIPPI) support
-CONFIG_HIPPI
-  HIgh Performance Parallel Interface (HIPPI) is a 800Mbit/sec and
-  1600Mbit/sec dual-simplex switched or point-to-point network. HIPPI
-  can run over copper (25m) or fiber (300m on multi-mode or 10km on
-  single-mode). HIPPI networks are commonly used for clusters and to
-  connect to super computers. If you are connected to a HIPPI network
-  and have a HIPPI network card in your computer that you want to use
-  under Linux, say Y here (you must also remember to enable the driver
-  for your HIPPI card below). Most people will say N here.
-
-Essential RoadRunner HIPPI PCI adapter support
-CONFIG_ROADRUNNER
-  Say Y here if this is your PCI HIPPI network card.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called rrunner.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.  If
-  unsure, say N.
-
-Use large TX/RX rings
-CONFIG_ROADRUNNER_LARGE_RINGS
-  If you say Y here, the RoadRunner driver will preallocate up to 2 MB
-  of additional memory to allow for fastest operation, both for
-  transmitting and receiving. This memory cannot be used by any other
-  kernel code or by user space programs. Say Y here only if you have
-  the memory.
-
-Acorn Ether1 support
-CONFIG_ARM_ETHER1
-  If you have an Acorn system with one of these (AKA25) network cards,
-  you should say Y to this option if you wish to use it with Linux.
-
-Acorn/ANT Ether3 support
-CONFIG_ARM_ETHER3
-  If you have an Acorn system with one of these network cards, you
-  should say Y to this option if you wish to use it with Linux.
-
-I-Cubed EtherH support
-CONFIG_ARM_ETHERH
-  If you have an Acorn system with one of these network cards, you
-  should say Y to this option if you wish to use it with Linux.
-
-EBSA-110 Ethernet interface (AM79C961A)
-CONFIG_ARM_AM79C961A
-  If you wish to compile a kernel for the EBSA-110, then you should
-  always answer Y to this.
-
-Support Thumb instructions
-CONFIG_ARM_THUMB
-  Say Y if you want to have kernel support for ARM Thumb instructions,
-  fault handlers, and system calls.
-
-  The Thumb instruction set is a compressed form of the standard ARM
-  instruction set resulting in smaller binaries at the expense of
-  slightly less efficient code.
-
-  If you don't know what this all is, saying Y is a safe choice.
-
-Support CD-ROM drives that are not SCSI or IDE/ATAPI
-CONFIG_CD_NO_IDESCSI
-  If you have a CD-ROM drive that is neither SCSI nor IDE/ATAPI, say Y
-  here, otherwise N. Read the CD-ROM-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  Note that the answer to this question doesn't directly affect the
-  kernel: saying N will just cause the configurator to skip all
-  the questions about these CD-ROM drives. If you are unsure what you
-  have, say Y and find out whether you have one of the following
-  drives.
-
-  For each of these drivers, a file Documentation/cdrom/{driver_name}
-  exists. Especially in cases where you do not know exactly which kind
-  of drive you have you should read there. Most of these drivers use a
-  file drivers/cdrom/{driver_name}.h where you can define your
-  interface parameters and switch some internal goodies.
-
-  All these CD-ROM drivers are also usable as a module ( = code which
-  can be inserted in and removed from the running kernel whenever you
-  want). If you want to compile them as module, say M instead of Y and
-  read <file:Documentation/modules.txt>.
-
-  If you want to use any of these CD-ROM drivers, you also have to
-  answer Y or M to "ISO 9660 CD-ROM file system support" below (this
-  answer will get "defaulted" for you if you enable any of the Linux
-  CD-ROM drivers).
-
-Sony CDU31A/CDU33A CD-ROM support
-CONFIG_CDU31A
-  These CD-ROM drives have a spring-pop-out caddyless drawer, and a
-  rectangular green LED centered beneath it.  NOTE: these CD-ROM
-  drives will not be auto detected by the kernel at boot time; you
-  have to provide the interface address as an option to the kernel at
-  boot time as described in <file:Documentation/cdrom/cdu31a> or fill
-  in your parameters into <file:drivers/cdrom/cdu31a.c>.  Try "man
-  bootparam" or see the documentation of your boot loader (lilo or
-  loadlin) about how to pass options to the kernel.
-
-  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
-  file system support" below, because that's the file system used on
-  CD-ROMs.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called cdu31a.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Standard Mitsumi [no XA/Multisession] CD-ROM support
-CONFIG_MCD
-  This is the older of the two drivers for the older Mitsumi models
-  LU-005, FX-001 and FX-001D. This is not the right driver for the
-  FX-001DE and the triple or quad speed models (all these are
-  IDE/ATAPI models). Please also the file
-  <file:Documentation/cdrom/mcd>.
-
-  With the old LU-005 model, the whole drive chassis slides out for cd
-  insertion. The FX-xxx models use a motorized tray type mechanism.
-  Note that this driver does not support XA or MultiSession CDs
-  (PhotoCDs). There is a new driver (next question) which can do
-  this. If you want that one, say N here.
-
-  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
-  file system support" below, because that's the file system used on
-  CD-ROMs.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called mcd.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-IRQ channel for Mitsumi CD-ROM
-CONFIG_MCD_IRQ
-  This allows you to specify the default value of the IRQ used by the
-  driver. This setting can be overridden by passing the "mcd="
-  parameter to the kernel at boot time (or at module load time if you
-  said M to "Standard Mitsumi CD-ROM support").
-
-I/O base address for Mitsumi CD-ROM
-CONFIG_MCD_BASE
-  This allows you to specify the default value of the I/O base address
-  used by the driver. This setting can be overridden by passing the
-  "mcd=" parameter to the kernel at boot time (or at module load time
-  if you said M to "Standard Mitsumi CD-ROM support").
-
-Mitsumi [XA/MultiSession] CD-ROM support
-CONFIG_MCDX
-  Use this driver if you want to be able to read XA or MultiSession
-  CDs (PhotoCDs) as well as ordinary CDs with your Mitsumi LU-005,
-  FX-001 or FX-001D CD-ROM drive. In addition, this driver uses much
-  less kernel memory than the old one, if that is a concern. This
-  driver is able to support more than one drive, but each drive needs
-  a separate interface card. Please read the file
-  <file:Documentation/cdrom/mcdx>.
-
-  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
-  file system support" below, because that's the file system used on
-  CD-ROMs.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called mcdx.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Matsushita/Panasonic/Creative, Longshine, TEAC CD-ROM support
-CONFIG_SBPCD
-  This driver supports most of the drives which use the Panasonic or
-  Sound Blaster interface.  Please read the file
-  <file:Documentation/cdrom/sbpcd>.
-
-  The Matsushita CR-521, CR-522, CR-523, CR-562, CR-563 drives
-  (sometimes labeled "Creative"), the Creative Labs CD200, the
-  Longshine LCS-7260, the "IBM External ISA CD-ROM" (in fact a CR-56x
-  model), the TEAC CD-55A fall under this category.  Some other
-  "electrically compatible" drives (Vertos, Genoa, some Funai models)
-  are currently not supported; for the Sanyo H94A drive currently a
-  separate driver (asked later) is responsible.  Most drives have a
-  uniquely shaped faceplate, with a caddyless motorized drawer, but
-  without external brand markings.  The older CR-52x drives have a
-  caddy and manual loading/eject, but still no external markings.  The
-  driver is able to do an extended auto-probing for interface
-  addresses and drive types; this can help to find facts in cases you
-  are not sure, but can consume some time during the boot process if
-  none of the supported drives gets found.  Once your drive got found,
-  you should enter the reported parameters into
-  <file:drivers/cdrom/sbpcd.h> and set "DISTRIBUTION 0" there.
-
-  This driver can support up to four CD-ROM controller cards, and each
-  card can support up to four CD-ROM drives; if you say Y here, you
-  will be asked how many controller cards you have.  If compiled as a
-  module, only one controller card (but with up to four drives) is
-  usable.
-
-  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
-  file system support" below, because that's the file system used on
-  CD-ROMs.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called sbpcd.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Matsushita/Panasonic, ... second CD-ROM controller support
-CONFIG_SBPCD2
-  Say Y here only if you have two CD-ROM controller cards of this type
-  (usually only if you have more than four drives).  You should enter
-  the parameters for the second, third and fourth interface card into
-  <file:drivers/cdrom/sbpcd.h> before compiling the new kernel.  Read
-  the file <file:Documentation/cdrom/sbpcd>.
-
-Matsushita/Panasonic, ... third CD-ROM controller support
-CONFIG_SBPCD3
-  Say Y here only if you have three CD-ROM controller cards of this
-  type (usually only if you have more than six drives).  You should
-  enter the parameters for the second, third and fourth interface card
-  into <file:include/linux/sbpcd.h> before compiling the new kernel.
-  Read the file <file:Documentation/cdrom/sbpcd>.
-
-Matsushita/Panasonic, ... fourth CD-ROM controller support
-CONFIG_SBPCD4
-  Say Y here only if you have four CD-ROM controller cards of this
-  type (usually only if you have more than eight drives).  You should
-  enter the parameters for the second, third and fourth interface card
-  into <file:include/linux/sbpcd.h> before compiling the new kernel.
-  Read the file <file:Documentation/cdrom/sbpcd>.
-
-Aztech/Orchid/Okano/Wearnes/TXC/CyDROM CD-ROM support
-CONFIG_AZTCD
-  This is your driver if you have an Aztech CDA268-01A, Orchid
-  CD-3110, Okano or Wearnes CDD110, Conrad TXC, or CyCD-ROM CR520 or
-  CR540 CD-ROM drive.  This driver -- just like all these CD-ROM
-  drivers -- is NOT for CD-ROM drives with IDE/ATAPI interfaces, such
-  as Aztech CDA269-031SE. Please read the file
-  <file:Documentation/cdrom/aztcd>.
-
-  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
-  file system support" below, because that's the file system used on
-  CD-ROMs.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called aztcd.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Sony CDU535 CD-ROM support
-CONFIG_CDU535
-  This is the driver for the older Sony CDU-535 and CDU-531 CD-ROM
-  drives. Please read the file <file:Documentation/cdrom/sonycd535>.
-
-  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
-  file system support" below, because that's the file system used on
-  CD-ROMs.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called sonycd535.o. If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-Goldstar R420 CD-ROM support
-CONFIG_GSCD
-  If this is your CD-ROM drive, say Y here.  As described in the file
-  <file:Documentation/cdrom/gscd>, you might have to change a setting
-  in the file <file:drivers/cdrom/gscd.h> before compiling the
-  kernel.  Please read the file <file:Documentation/cdrom/gscd>.
-
-  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
-  file system support" below, because that's the file system used on
-  CD-ROMs.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called gscd.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Philips/LMS CM206 CD-ROM support
-CONFIG_CM206
-  If you have a Philips/LMS CD-ROM drive cm206 in combination with a
-  cm260 host adapter card, say Y here. Please also read the file
-  <file:Documentation/cdrom/cm206>.
-
-  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
-  file system support" below, because that's the file system used on
-  CD-ROMs.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called cm206.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Optics Storage DOLPHIN 8000AT CD-ROM support
-CONFIG_OPTCD
-  This is the driver for the 'DOLPHIN' drive with a 34-pin Sony
-  compatible interface. It also works with the Lasermate CR328A. If
-  you have one of those, say Y. This driver does not work for the
-  Optics Storage 8001 drive; use the IDE-ATAPI CD-ROM driver for that
-  one. Please read the file <file:Documentation/cdrom/optcd>.
-
-  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
-  file system support" below, because that's the file system used on
-  CD-ROMs.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called optcd.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Sanyo CDR-H94A CD-ROM support
-CONFIG_SJCD
-  If this is your CD-ROM drive, say Y here and read the file
-  <file:Documentation/cdrom/sjcd>. You should then also say Y or M to
-  "ISO 9660 CD-ROM file system support" below, because that's the
-  file system used on CD-ROMs.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called sjcd.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-ISP16/MAD16/Mozart soft configurable cdrom interface support
-CONFIG_ISP16_CDI
-  These are sound cards with built-in cdrom interfaces using the OPTi
-  82C928 or 82C929 chips. Say Y here to have them detected and
-  possibly configured at boot time. In addition, You'll have to say Y
-  to a driver for the particular cdrom drive you have attached to the
-  card. Read <file:Documentation/cdrom/isp16> for details.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called isp16.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-iSeries Virtual I/O CD Support
-CONFIG_VIOCD
-  If you are running Linux on an IBM iSeries system and you want to
-  read a CD drive owned by OS/400, say Y here.
-
-Quota support
-CONFIG_QUOTA
-  If you say Y here, you will be able to set per user limits for disk
-  usage (also called disk quotas). Currently, it works only for the
-  ext2 file system. You need additional software in order to use quota
-  support; for details, read the Quota mini-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>. Probably the quota
-  support is only useful for multi user systems. If unsure, say N.
-
-Memory Technology Device (MTD) support
-CONFIG_MTD
-  Memory Technology Devices are flash, RAM and similar chips, often
-  used for solid state file systems on embedded devices. This option
-  will provide the generic support for MTD drivers to register
-  themselves with the kernel and for potential users of MTD devices
-  to enumerate the devices which are present and obtain a handle on
-  them. It will also allow you to select individual drivers for 
-  particular hardware and users of MTD devices. If unsure, say N.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  mtdcore.o
-
-MTD debugging support
-CONFIG_MTD_DEBUG
-  This turns on low-level debugging for the entire MTD sub-system.
-  Normally, you should say 'N'.
-
-MTD partitioning support
-CONFIG_MTD_PARTITIONS
-  If you have a device which needs to divide its flash chip(s) up
-  into multiple 'partitions', each of which appears to the user as
-  a separate MTD device, you require this option to be enabled. If
-  unsure, say 'Y'.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  mtdpart.o
-
-  Note, however, that you don't need this option for the DiskOnChip
-  devices. Partitioning on NFTL 'devices' is a different - that's the
-  'normal' form of partitioning used on a block device.
-
-RedBoot partition table parsing
-CONFIG_MTD_REDBOOT_PARTS
-  RedBoot is a ROM monitor and bootloader which deals with multiple
-  'images' in flash devices by putting a table in the last erase block
-  of the device, similar to a partition table, which gives the
-  offsets, lengths and names of all the images stored in the flash.
-
-  If you need code which can detect and parse this table, and register
-  MTD 'partitions' corresponding to each image in the table, enable
-  this option.
-
-  You will still need the parsing functions to be called by the driver
-  for your particular device. It won't happen automatically. The
-  SA1100 map driver (CONFIG_MTD_SA1100) has an option for this, for
-  example.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  redboot.o
-
-Compaq bootldr partition table parsing
-CONFIG_MTD_BOOTLDR_PARTS
-  The Compaq bootldr deals with multiple 'images' in flash devices
-  by putting a table in one of the first erase blocks of the device,
-  similar to a partition table, which gives the offsets, lengths and
-  names of all the images stored in the flash.
-
-  If you need code which can detect and parse this table, and register
-  MTD 'partitions' corresponding to each image in the table, enable
-  this option.
-
-  You will still need the parsing functions to be called by the driver
-  for your particular device. It won't happen automatically. The 
-  SA1100 map driver (CONFIG_MTD_SA1100) has an option for this, for 
-  example.
-
-ARM Firmware Suite flash layout / partition parsing
-CONFIG_MTD_AFS_PARTS
-  The ARM Firmware Suite allows the user to divide flash devices into
-  multiple 'images'. Each such image has a header containing its name
-  and offset/size etc.
-
-  If you need code which can detect and parse these tables, and
-  register MTD 'partitions' corresponding to each image detected,
-  enable this option.
-
-  You will still need the parsing functions to be called by the driver
-  for your particular device.  It won't happen automatically.  The 
-  'armflash' map driver (CONFIG_MTD_ARMFLASH) does this, for example.
-
-MTD debugging verbosity (0 = quiet, 3 = noisy)
-CONFIG_MTD_DEBUG_VERBOSE
-  Determines the verbosity level of the MTD debugging messages.
-
-Direct chardevice access to MTD devices
-CONFIG_MTD_CHAR
-  This provides a character device for each MTD device present in
-  the system, allowing the user to read and write directly to the
-  memory chips, and also use ioctl() to obtain information about
-  the device, or to erase parts of it.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  mtdchar.o
-
-Caching block device access to MTD devices
-CONFIG_MTD_BLOCK
-  Although most flash chips have an erase size too large to be useful
-  as block devices, it is possible to use MTD devices which are based
-  on RAM chips in this manner. This block device is a user of MTD
-  devices performing that function.
-
-  At the moment, it is also required for the Journalling Flash File
-  System(s) to obtain a handle on the MTD device when it's mounted
-  (although JFFS and JFFS2 don't actually use any of the functionality
-  of the mtdblock device).
-
-  Later, it may be extended to perform read/erase/modify/write cycles
-  on flash chips to emulate a smaller block size. Needless to say,
-  this is very unsafe, but could be useful for file systems which are
-  almost never written to.
-
-  You do not need this option for use with the DiskOnChip devices. For
-  those, enable NFTL support (CONFIG_NFTL) instead.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  mtdblock.o
-
-Readonly block device access to MTD devices
-CONFIG_MTD_BLOCK_RO
-  This allows you to mount read-only file systems (such as cramfs)
-  from an MTD device, without the overhead (and danger) of the caching
-  driver.
-
-  You do not need this option for use with the DiskOnChip devices. For
-  those, enable NFTL support (CONFIG_NFTL) instead.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  mtdblock_ro.o
-
-FTL (Flash Translation Layer) support
-CONFIG_FTL
-  This provides support for the original Flash Translation Layer which
-  is part of the PCMCIA specification. It uses a kind of pseudo-
-  file system on a flash device to emulate a block device with
-  512-byte sectors, on top of which you put a 'normal' file system.
-
-  You may find that the algorithms used in this code are patented
-  unless you live in the Free World where software patents aren't
-  legal - in the USA you are only permitted to use this on PCMCIA
-  hardware, although under the terms of the GPL you're obviously
-  permitted to copy, modify and distribute the code as you wish. Just
-  not use it.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  ftl.o
-
-NFTL (NAND Flash Translation Layer) support
-CONFIG_NFTL
-  This provides support for the NAND Flash Translation Layer which is
-  used on M-Systems' DiskOnChip devices. It uses a kind of pseudo-
-  file system on a flash device to emulate a block device with
-  512-byte sectors, on top of which you put a 'normal' file system.
-
-  You may find that the algorithms used in this code are patented
-  unless you live in the Free World where software patents aren't
-  legal - in the USA you are only permitted to use this on DiskOnChip
-  hardware, although under the terms of the GPL you're obviously
-  permitted to copy, modify and distribute the code as you wish. Just
-  not use it.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  nftl.o
-
-Write support for NFTL (EXPERIMENTAL)
-CONFIG_NFTL_RW
-  If you're lucky, this will actually work. Don't whinge if it
-  doesn't.  Send mail to the MTD mailing list
-  <linux-mtd@lists.infradead.org> if you want to help to make it more
-  reliable.
-
-Detect flash chips by Common Flash Interface (CFI) probe
-CONFIG_MTD_CFI
-  The Common Flash Interface specification was developed by Intel,
-  AMD and other flash manufactures that provides a universal method
-  for probing the capabilities of flash devices. If you wish to
-  support any device that is CFI-compliant, you need to enable this
-  option. Visit <http://www.amd.com/products/nvd/overview/cfi.html>
-  for more information on CFI.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  cfi_probe.o
-
-CFI Advanced configuration options
-CONFIG_MTD_CFI_ADV_OPTIONS
-  If you need to specify a specific endianness for access to flash
-  chips, or if you wish to reduce the size of the kernel by including
-  support for only specific arrangements of flash chips, say 'Y'. This
-  option does not directly affect the code, but will enable other 
-  configuration options which allow you to do so.
-
-  If unsure, say 'N'.
-
-Specific CFI Flash geometry selection
-CONFIG_MTD_CFI_GEOMETRY
-  This option does not affect the code directly, but will enable 
-  some other configuration options which would allow you to reduce
-  the size of the kernel by including support for only certain 
-  arrangements of CFI chips. If unsure, say 'N' and all options 
-  which are supported by the current code will be enabled.
-
-Support 8-bit buswidth
-CONFIG_MTD_CFI_B1
-  If you wish to support CFI devices on a physical bus which is
-  8 bits wide, say 'Y'.
-
-Support 16-bit buswidth
-CONFIG_MTD_CFI_B2
-  If you wish to support CFI devices on a physical bus which is
-  16 bits wide, say 'Y'.
-
-Support 32-bit buswidth
-CONFIG_MTD_CFI_B4
-  If you wish to support CFI devices on a physical bus which is
-  32 bits wide, say 'Y'.
-
-Support 1-chip flash interleave
-CONFIG_MTD_CFI_I1
-  If your flash chips are not interleaved - i.e. you only have one
-  flash chip addressed by each bus cycle, then say 'Y'.
-
-Support 2-chip flash interleave
-CONFIG_MTD_CFI_I2
-  If your flash chips are interleaved in pairs - i.e. you have two
-  flash chips addressed by each bus cycle, then say 'Y'.
-
-Support 4-chip flash interleave
-CONFIG_MTD_CFI_I4
-  If your flash chips are interleaved in fours - i.e. you have four
-  flash chips addressed by each bus cycle, then say 'Y'.
-
-# Choice: mtd_data_swap
-Flash cmd/query data swapping
-CONFIG_MTD_CFI_NOSWAP
-  This option defines the way in which the CPU attempts to arrange
-  data bits when writing the 'magic' commands to the chips. Saying
-  'NO', which is the default when CONFIG_MTD_CFI_ADV_OPTIONS isn't
-  enabled, means that the CPU will not do any swapping; the chips
-  are expected to be wired to the CPU in 'host-endian' form. 
-  Specific arrangements are possible with the BIG_ENDIAN_BYTE and
-  LITTLE_ENDIAN_BYTE, if the bytes are reversed.
-
-  If you have a LART, on which the data (and address) lines were
-  connected in a fashion which ensured that the nets were as short
-  as possible, resulting in a bit-shuffling which seems utterly
-  random to the untrained eye, you need the LART_ENDIAN_BYTE option.
-
-  Yes, there really exists something sicker than PDP-endian :)
-
-CFI support for Intel/Sharp Extended Command Set chips
-CONFIG_MTD_CFI_INTELEXT
-  The Common Flash Interface defines a number of different command
-  sets which a CFI-compliant chip may claim to implement. This code
-  provides support for one of those command sets, used on Intel
-  StrataFlash and other parts.
-
-CFI support for AMD/Fujitsu Standard Command Set chips
-CONFIG_MTD_CFI_AMDSTD
-  The Common Flash Interface defines a number of different command
-  sets which a CFI-compliant chip may claim to implement. This code
-  provides support for one of those command sets, used on chips 
-  chips including the AMD Am29LV320.
-
-CFI support for Intel/Sharp Standard Commands
-CONFIG_MTD_CFI_INTELSTD
-  The Common Flash Interface defines a number of different command
-  sets which a CFI-compliant chip may claim to implement. This code
-  provides support for one of those command sets.
-
-pre-CFI Sharp chip support
-CONFIG_MTD_SHARP
-  This option enables support for flash chips using Sharp-compatible
-  commands, including some which are not CFI-compatible and hence 
-  cannot be used with the CONFIG_MTD_CFI_INTELxxx options.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  sharp.o
-
-AMD compatible flash chip support (non-CFI)
-CONFIG_MTD_AMDSTD
-  This option enables support for flash chips using AMD-compatible
-  commands, including some which are not CFI-compatible and hence 
-  cannot be used with the CONFIG_MTD_CFI_AMDSTD option.
-
-  It also works on AMD compatible chips that do conform to CFI.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  amd_flash.o
-
-Support for RAM chips in bus mapping
-CONFIG_MTD_RAM
-  This option enables basic support for RAM chips accessed through 
-  a bus mapping driver.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  map_ram.o
-
-Support for ROM chips in bus mapping
-CONFIG_MTD_ROM
-  This option enables basic support for ROM chips accessed through 
-  a bus mapping driver.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  map_rom.o
-
-JEDEC device support
-CONFIG_MTD_JEDEC
-  Enable older older JEDEC flash interface devices for self
-  programming flash.  It is commonly used in older AMD chips.  It is
-  only called JEDEC because the JEDEC association
-  <http://www.jedec.org/> distributes the identification codes for the
-  chips. WARNING!!!! This code does not compile and is incomplete as
-  are the specific JEDEC devices drivers.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  jedec.o
-
-CFI Flash device mapped on StrongARM SA11x0
-CONFIG_MTD_SA1100
-  This enables access to the flash chips on most platforms based on
-  the SA1100 and SA1110, including the Assabet and the Compaq iPAQ.
-  If you have such a board, say 'Y'.
-
-Support for Compaq bootldr partition tables on SA11x0
-CONFIG_MTD_SA1100_REDBOOT_PARTITIONS
-  Enabling this option will cause the kernel to look for a RedBoot 
-  FIS (Flash Image System) table in the last erase block of the flash
-  chips detected. If you are using RedBoot on your SA11x0-based board
-  and want Linux to present 'partitions' matching the images which
-  RedBoot has listed, say 'Y'.
-
-Support for Compaq bootldr partition tables on SA11x0
-CONFIG_MTD_SA1100_BOOTLDR_PARTITIONS
-  Enabling this option will cause the kernel to look for a Compaq
-  bootldr partition table on the flash chips detected.  If you are
-  using the Compaq bootldr on your SA11x0-based board and want Linux 
-  to present 'partitions' matching the images which the bootldr has
-  listed, say 'Y'.
-
-Flash chip mapping in physical memory
-CONFIG_MTD_PHYSMAP
-  This provides a 'mapping' driver which allows the CFI probe and
-  command set driver code to communicate with flash chips which
-  are mapped physically into the CPU's memory. You will need to
-  configure the physical address and size of the flash chips on
-  your particular board as well as the bus width.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  physmap.o
-
-Physical start location of flash chip mapping
-CONFIG_MTD_PHYSMAP_START
-  This is the physical memory location at which the flash chips
-  are mapped on your particular target board. Refer to the
-  memory map which should hopefully be in the documentation for
-  your board.
-
-Physical length of flash chip mapping
-CONFIG_MTD_PHYSMAP_LEN
-  This is the total length of the mapping of the flash chips on
-  your particular board. If there is space, or aliases, in the
-  physical memory map between the chips, this could be larger
-  than the total amount of flash present. Refer to the memory
-  map which should hopefully be in the documentation for your
-  board.
-
-Buswidth of flash in bytes
-CONFIG_MTD_PHYSMAP_BUSWIDTH
-  This is the total width of the data bus of the flash devices
-  in octets. For example, if you have a data bus width of 32
-  bits, you would set the bus width octet value to 4. This is
-  used internally by the CFI drivers.
-
-Flash chip mapping on Sun Microsystems boardsets
-CONFIG_MTD_SUN_UFLASH
-  This provides a 'mapping' driver which supports the way in 
-  which user-programmable flash chips are connected on various 
-  Sun Microsystems boardsets.  This driver will require CFI support 
-  in the kernel, so if you did not enable CFI previously, do that now.
-
-Flash chip mapping on Nora
-CONFIG_MTD_NORA
-  If you had to ask, you don't have one. Say 'N'.
-
-Flash chip mapping on Photron PNC-2000
-CONFIG_MTD_PNC2000
-  PNC-2000 is the name of Network Camera product from PHOTRON
-  Ltd. in Japan. It uses CFI-compliant flash.
-
-Flash chip mapping on RPXlite or CLLF PPC board
-CONFIG_MTD_RPXLITE
-  The RPXLite PowerPC board has CFI-compliant chips mapped in
-  a strange sparse mapping. This 'mapping' driver supports that
-  arrangement, allowing the CFI probe and command set driver code
-  to communicate with the chips on the RPXLite board. More at
-  <http://www.embeddedplanet.com/rpx_lite_specification_sheet.htm>.
-
-Flash chip mapping on AMD SC520 CDP board
-CONFIG_MTD_SC520CDP
-  The SC520 CDP board has two banks of CFI-compliant chips and one
-  Dual-in-line JEDEC chip. This 'mapping' driver supports that
-  arrangement, implementing three MTD devices.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  sc520cdp.o
-
-Flash chip mapping on Arcom Control Systems SBC-MediaGX
-CONFIG_MTD_SBC_GXX
-  This provides a driver for the on-board flash of Arcom Control
-  Systems' SBC-GXn family of boards, formerly known as SBC-MediaGX.
-  By default the flash is split into 3 partitions which are accessed
-  as separate MTD devices.  This board utilizes Intel StrataFlash.
-  More info at
-  <http://www.arcomcontrols.com/products/icp/pc104/processors/>.
-
-CFI Flash device mapped on D-Box2
-CONFIG_MTD_DBOX2
-  This enables access routines for the flash chips on the Nokia/Sagem
-  D-Box 2 board. If you have one of these boards and would like to use
-  the flash chips on it, say 'Y'.
-
-CFI Flash device mapped on the XScale IQ80310 board
-CONFIG_MTD_IQ80310
-  This enables access routines for the flash chips on the Intel XScale
-  IQ80310 evaluation board. If you have one of these boards and would 
-  like to use the flash chips on it, say 'Y'.
-
-CFI Flash device mapped on AMD NetSc520
-CONFIG_MTD_NETSC520
-  This enables access routines for the flash chips on the AMD NetSc520
-  demonstration board. If you have one of these boards and would like 
-  to use the flash chips on it, say 'Y'.
-
-Flash chip mapping on Arcom Control Systems ELAN-104NC
-CONFIG_MTD_ELAN_104NC
-  This provides a driver for the on-board flash of the Arcom Control
-  System's ELAN-104NC development board. By default the flash
-  is split into 3 partitions which are accessed as separate MTD
-  devices. This board utilizes Intel StrataFlash. More info at
-  <http://www.arcomcontrols.com/products/icp/pc104/processors/>.
-
-Flash chip mapping on Compaq iPAQ/Bitsy
-CONFIG_MTD_BITSY
-  This provides a driver for the on-board flash found in Compaq's
-  iPAQ Palm PC and their research prototype the Itsy. iPAQ info at
-  <http://www5.compaq.com/products/handhelds/pocketpc/> and the
-  Itsy <http://www.research.digital.com/wrl/projects/Itsy/index.html>.
-Flash chip mapping on Compaq iPAQ/Bitsy
-CONFIG_MTD_DC21285
-  This provides a driver for the flash accessed using Intel's
-  21285 bridge used with Intel's StrongARM processors. More info at
-  <http://developer.intel.com/design/bridge/quicklist/dsc-21285.htm>.
-
-Flash chip mapping on ITE QED-4N-S01B, Globespan IVR or custom board
-CONFIG_MTD_CSTM_MIPS_IXX
-  This provides a mapping driver for the Integrated Tecnology Express,
-  Inc (ITE) QED-4N-S01B eval board and the Globespan IVR Reference
-  Board.  It provides the necessary addressing, length, buswidth, vpp
-  code and addition setup of the flash device for these boards.  In
-  addition, this mapping driver can be used for other boards via
-  setting of the CONFIG_MTD_CSTM_MIPS_IXX_START/LEN/BUSWIDTH
-  parameters.  This mapping will provide one mtd device using one
-  partition.  The start address can be offset from the beginning of
-  flash and the len can be less than the total flash device size to
-  allow a window into the flash.  Both CFI and JEDEC probes are
-  called.
-
-Physical start location of flash chip mapping
-CONFIG_MTD_CSTM_MIPS_IXX_START
-  This is the physical memory location that the MTD driver will
-  use for the flash chips on your particular target board. 
-  Refer to the memory map which should hopefully be in the 
-  documentation for your board.
-
-Physical length of flash chip mapping
-CONFIG_MTD_CSTM_MIPS_IXX_LEN
-  This is the total length that the MTD driver will use for the 
-  flash chips on your particular board.  Refer to the memory
-  map which should hopefully be in the documentation for your
-  board.
-
-Physical bus width of flash mapping in bytes
-CONFIG_MTD_CSTM_MIPS_IXX_BUSWIDTH
-  This is the total bus width of the mapping of the flash chips
-  on your particular board.
-
-JEDEC Flash device mapped on Mixcom piggyback card
-CONFIG_MTD_MIXMEM
-  This supports the paging arrangement for access to flash chips
-  on the MixCOM piggyback card, allowing the flash chip drivers
-  to get on with their job of driving the flash chips without
-  having to know about the paging. If you have one of these boards,
-  you probably want to enable this mapping driver. More info is at
-  <http://www.itc.hu/>.
-
-JEDEC Flash device mapped on Octagon 5066 SBC
-CONFIG_MTD_OCTAGON
-  This provides a 'mapping' driver which supports the way in which
-  the flash chips are connected in the Octagon-5066 Single Board
-  Computer. More information on the board is available at
-  <http://www.octagonsystems.com/Products/5066/5066.html>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  octagon-5066.o
-
-JEDEC Flash device mapped on Tempustech VMAX SBC301
-CONFIG_MTD_VMAX
-  This provides a 'mapping' driver which supports the way in which
-  the flash chips are connected in the Tempustech VMAX SBC301 Single
-  Board Computer. More information on the board is available at
-  <http://www.tempustech.com/tt301.htm>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  vmax301.o
-
-Support for NAND flash devices
-CONFIG_MTD_NAND
-  This enables support for accessing all type of NAND flash
-  devices.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  nand.o
-
-Support for software ECC algorithm
-CONFIG_MTD_NAND_ECC
-  This enables software-based ECC for use with NAND flash chips. It
-  can detect and correct 1 bit errors per 256 byte blocks. This
-  should be used to increase the reliability of the data stored and
-  read on the device.
-
-Support for verify read after write
-CONFIG_MTD_NAND_VERIFY_WRITE
-  This adds an extra check when data is written to the flash. The
-  NAND flash device internally checks only bits transitioning
-  from 1 to 0. There is a rare possibility that even though the
-  device thinks the write was successful, a bit could have been
-  flipped accidentally due to device wear, gamma rays, whatever.
-  Enable this if you are really paranoid.
-
-Support for the SPIA board
-CONFIG_MTD_NAND_SPIA
-  If you had to ask, you don't have one. Say 'N'.
-
-M-Systems Disk-On-Chip 1000 support
-CONFIG_MTD_DOC1000
-  This provides an MTD device driver for the M-Systems DiskOnChip
-  1000 devices, which are obsolete so you probably want to say 'N'.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  doc1000.o
-
-M-Systems Disk-On-Chip 2000 and Millennium support
-CONFIG_MTD_DOC2000
-  This provides an MTD device driver for the M-Systems DiskOnChip
-  2000 and Millennium devices.  Originally designed for the DiskOnChip
-  2000, it also now includes support for the DiskOnChip Millennium.
-  If you have problems with this driver and the DiskOnChip Millennium,
-  you may wish to try the alternative Millennium driver below. To use
-  the alternative driver, you will need to undefine DOC_SINGLE_DRIVER
-  in the <file:drivers/mtd/devices/docprobe.c> source code.
-
-  If you use this device, you probably also want to enable the NFTL
-  'NAND Flash Translation Layer' option below, which is used to
-  emulate a block device by using a kind of file system on the flash
-  chips.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  doc2000.o
-
-Alternative Disk-On-Chip Millennium support
-CONFIG_MTD_DOC2001
-  This provides an alternative MTD device driver for the M-Systems 
-  DiskOnChip Millennium devices.  Use this if you have problems with
-  the combined DiskOnChip 2000 and Millennium driver above.  To get
-  the DiskOnChip probe code to load and use this driver instead of
-  the other one, you will need to undefine DOC_SINGLE_DRIVER near
-  the beginning of <file:drivers/mtd/devices/docprobe.c>.
-
-  If you use this device, you probably also want to enable the NFTL
-  'NAND Flash Translation Layer' option below, which is used to
-  emulate a block device by using a kind of file system on the flash
-  chips.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  doc2001.o
-
-Probe for DiskOnChip devices
-CONFIG_MTD_DOCPROBE
-  This isn't a real config option, it's derived.
-
-Advanced detection options for DiskOnChip
-CONFIG_MTD_DOCPROBE_ADVANCED
-  This option allows you to specify nonstandard address at which to
-  probe for a DiskOnChip, or to change the detection options.  You
-  are unlikely to need any of this unless you are using LinuxBIOS.
-  Say 'N'.
-
-Probe for 0x55 0xAA BIOS Extension Signature
-CONFIG_MTD_DOCPROBE_55AA
-  Check for the 0x55 0xAA signature of a DiskOnChip, and do not
-  continue with probing if it is absent.  The signature will always be
-  present for a DiskOnChip 2000 or a normal DiskOnChip Millennium.
-  Only if you have overwritten the first block of a DiskOnChip
-  Millennium will it be  absent.  Enable this option if you are using
-  LinuxBIOS or if you need to recover a DiskOnChip Millennium on which
-  you have managed to wipe the first block.
-
-Physical address of DiskOnChip
-CONFIG_MTD_DOCPROBE_ADDRESS
-  By default, the probe for DiskOnChip devices will look for a
-  DiskOnChip at every multiple of 0x2000 between 0xC8000 and 0xEE000.
-  This option allows you to specify a single address at which to probe
-  for the device, which is useful if you have other devices in that
-  range which get upset when they are probed.
-
-  (Note that on PowerPC, the normal probe will only check at
-  0xE4000000.)
-
-  Normally, you should leave this set to zero, to allow the probe at
-  the normal addresses.
-
-Probe high addresses
-CONFIG_MTD_DOCPROBE_HIGH
-  By default, the probe for DiskOnChip devices will look for a
-  DiskOnChip at every multiple of 0x2000 between 0xC8000 and 0xEE000.
-  This option changes to make it probe between 0xFFFC8000 and
-  0xFFFEE000.  Unless you are using LinuxBIOS, this is unlikely to be
-  useful to you.  Say 'N'.
-
-Ramix PMC551 PCI Mezzanine ram card support
-CONFIG_MTD_PMC551
-  This provides a MTD device driver for the Ramix PMC551 RAM PCI card
-  from Ramix Inc. <http://www.ramix.com/products/memory/pmc551.html>.
-  These devices come in memory configurations from 32M - 1G.  If you
-  have one, you probably want to enable this.
-
-  If this driver is compiled as a module you get the ability to select
-  the size of the aperture window pointing into the devices memory.
-  What this means is that if you have a 1G card, normally the kernel
-  will use a 1G memory map as its view of the device.  As a module,
-  you can select a 1M window into the memory and the driver will
-  "slide" the window around the PMC551's memory.  This was
-  particularly useful on the 2.2 kernels on PPC architectures as there
-  was limited kernel space to deal with.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  pmc551.o
-
-PMC551 256M DRAM Bugfix
-CONFIG_MTD_PMC551_BUGFIX
-  Some of Ramix's PMC551 boards with 256M configurations have invalid
-  column and row mux values.  This option will fix them, but will
-  break other memory configurations.  If unsure say N.
-
-PMC551 Debugging
-CONFIG_MTD_PMC551_DEBUG
-  This option makes the PMC551 more verbose during its operation and
-  is only really useful if you are developing on this driver or
-  suspect a possible hardware or driver bug.  If unsure say N.
-
-Use extra onboard system memory as MTD device
-CONFIG_MTD_SLRAM
-  If your CPU cannot cache all of the physical memory in your machine,
-  you can still use it for storage or swap by using this driver to
-  present it to the system as a Memory Technology Device.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  slram.o
-
-Debugging RAM test driver
-CONFIG_MTD_MTDRAM
-  This enables a test MTD device driver which uses vmalloc() to
-  provide storage.  You probably want to say 'N' unless you're
-  testing stuff.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  mtdram.o
-
-MTDRAM erase block size in KB
-CONFIG_MTDRAM_ERASE_SIZE
-  This allows you to configure the size of the erase blocks in the
-  device emulated by the MTDRAM driver.  If the MTDRAM driver is built
-  as a module, it is also possible to specify this as a parameter when
-  loading the module.
-
-MTDRAM device size in KB
-CONFIG_MTDRAM_TOTAL_SIZE
-  This allows you to configure the total size of the MTD device
-  emulated by the MTDRAM driver.  If the MTDRAM driver is built
-  as a module, it is also possible to specify this as a parameter when
-  loading the module.
-
-SRAM Hexadecimal Absolute position or 0
-CONFIG_MTDRAM_ABS_POS
-  If you have system RAM accessible by the CPU but not used by Linux
-  in normal operation, you can give the physical address at which the
-  available RAM starts, and the MTDRAM driver will use it instead of
-  allocating space from Linux's available memory. Otherwise, leave 
-  this set to zero. Most people will want to leave this as zero.
-
-CFI Flash device mapping on the Flaga Digital Module
-CONFIG_MTD_CFI_FLAGADM
-  Mapping for the Flaga digital module.  If you don´t have one, ignore
-  this setting.
-
-Momenco Ocelot boot flash device
-CONFIG_MTD_OCELOT
-  This enables access routines for the boot flash device and for the
-  NVRAM on the Momenco Ocelot board.  If you have one of these boards
-  and would like access to either of these, say 'Y'.
-
-Support for absent chips in bus mapping
-CONFIG_MTD_ABSENT
-  This option enables support for a dummy probing driver used to
-  allocated placeholder MTD devices on systems that have socketed
-  or removable media.  Use of this driver as a fallback chip probe
-  preserves the expected registration order of MTD device nodes on
-  the system regardless of media presence.  Device nodes created
-  with this driver will return -ENODEV upon access.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  map_absent.o
-
-MTD emulation using block device
-CONFIG_MTD_BLKMTD
-  This driver allows a block device to appear as an MTD. It would
-  generally be used in the following cases:
-
-    Using Compact Flash as an MTD, these usually present themselves to
-    the system as an ATA drive.
-    Testing MTD users (eg JFFS2) on large media and media that might
-    be removed during a write (using the floppy drive).
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  blkmtd.o
-
-Cirrus CDB89712 evaluation board mappings
-CONFIG_MTD_CDB89712
-  This enables access to the flash or ROM chips on the CDB89712 board.
-  (This board has 8 MB of Intel Strataflash, a 128 byte boot ROM, and 48 KB of
-  internal SRAM.  This driver provides MTD devices for all three components.)
-  If you have such a board, say 'Y'.
-
-Detect non-CFI AMD/JEDEC-compatible flash chips
-CONFIG_MTD_JEDECPROBE
-  This option enables JEDEC-style probing of flash chips which are not
-  compatible with the Common Flash Interface, but will use the common
-  CFI-targetted flash drivers for any chips which are identified which
-  are in fact compatible in all but the probe method. This actually
-  covers most AMD/Fujitsu-compatible chips, and will shortly cover also
-  non-CFI Intel chips (that code is in MTD CVS and should shortly be sent
-  for inclusion in Linus' tree)
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  jedec_probe.o
-
-BIOS flash chip on Intel L440GX boards
-CONFIG_MTD_L440GX
-  Support for treating the BIOS flash chip on Intel L440GX motherboards
-  as an MTD device - with this you can reprogram your BIOS.
-
-  BE VERY CAREFUL.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  l440gx.o
-
-28F160xx flash driver for LART
-CONFIG_MTD_LART
-  This enables the flash driver for LART. Please note that you do
-  not need any mapping/chip driver for LART. This one does it all
-  for you, so go disable all of those if you enabled some of them (:
-
-Older (theoretically obsoleted now) drivers for non-CFI chips
-CONFIG_MTD_OBSOLETE_CHIPS
-  This option does not enable any code directly, but will allow you to
-  select some other chip drivers which are now considered obsolete,
-  because the generic CONFIG_JEDEC_PROBE code above should now detect
-  the chips which are supported by these drivers, and allow the generic
-  CFI-compatible drivers to drive the chips. Say 'N' here unless you have
-  already tried the CONFIG_JEDEC_PROBE method and reported its failure
-  to the MTD mailing list at <linux-mtd@lists.infradead.org>
-
-CFI Flash device mapped on Hitachi SolutionEngine
-CONFIG_MTD_SOLUTIONENGINE
-  This enables access to the flash chips on the Hitachi SolutionEngine and
-  similar boards. Say 'Y' if you are building a kernel for such a board.
-
-CFI Flash device mapped on TQM8XXL PPC board
-CONFIG_MTD_TQM8XXL
-  The TQM8xxL PowerPC board has up to two banks of CFI-compliant
-  chips, currently uses AMD one. This 'mapping' driver supports
-  that arrangement, allowing the CFI probe and command set driver
-  code to communicate with the chips on the TQM8xxL board. More at
-  <http://www.denx.de/embedded-ppc-en.html>.
-
-Darkness
-CONFIG_MEMORY_SET
-  This is an option about which you will never be asked a question.
-  Therefore, I conclude that you do not exist - go away.
-
-  There is a grue here.
-
-Physical memory size
-CONFIG_MEMORY_SIZE
-  This sets the default memory size assumed by your SH kernel. It can
-  be overridden as normal by the 'mem=' argument on the kernel command
-  line. If unsure, consult your board specifications or just leave it
-  as 0x00400000 which was the default value before this became
-  configurable.
-
-Cache and PCI noncoherent
-CONFIG_SH_PCIDMA_NONCOHERENT
-  Enable this option if your platform does not have a CPU cache which
-  remains coherent with PCI DMA. It is safest to say 'Y', although you
-  will see better performance if you can say 'N', because the PCI DMA
-  code will not have to flush the CPU's caches. If you have a PCI host
-  bridge integrated with your SH CPU, refer carefully to the chip specs
-  to see if you can say 'N' here. Otherwise, leave it as 'Y'.
-
-USB (Universal Serial Bus) support
-CONFIG_USB
-  Universal Serial Bus (USB) is a specification for a serial bus
-  subsystem which offers higher speeds and more features than the
-  traditional PC serial port.  The bus supplies power to peripherals
-  and allows for hot swapping.  Up to 127 USB peripherals can be
-  connected to a single USB port in a tree structure.  The USB port is
-  the root of the tree, the peripherals are the leaves and the inner
-  nodes are special USB devices called hubs.  Many newer PC's have USB
-  ports and newer peripherals such as scanners, keyboards, mice,
-  modems, and printers support the USB protocol and can be connected
-  to the PC via those ports.
-
-  Say Y here if your computer has a USB port and you want to use USB
-  devices.  You then need to say Y to at least one of "UHCI support"
-  or "OHCI support" below (the type of interface that the USB hardware
-  in your computer provides to the operating system) and then choose
-  from among the drivers for USB peripherals.  You may want to check
-  out the information provided in <file:Documentation/usb/> and
-  especially the links given in <file:Documentation/usb/usb-help.txt>.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called usbcore.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-USB verbose debug messages
-CONFIG_USB_DEBUG
-  Say Y here if you want the USB core & hub drivers to produce a bunch
-  of debug messages to the system log. Select this if you are having a
-  problem with USB support and want to see more of what is going on.
-
-USB long timeout for slow-responding devices (some MGE Ellipse UPSes)
-CONFIG_USB_LONG_TIMEOUT
-  This option makes the standard time out a bit longer.  Basically,
-  some devices are just slow to respond, so this makes usb more
-  patient.  There should be no harm in selecting this, but it is
-  needed for some MGE Ellipse UPSes.
-
-  If you have an MGE Ellipse UPS, or you see timeouts in HID
-  transactions, say Y; otherwise say N.
-
-EHCI (USB 2.0) support
-CONFIG_USB_EHCI_HCD
-  The Enhanced Host Controller Interface (EHCI) is standard for USB 2.0
-  "high speed" (480 Mbit/sec, 60 Mbyte/sec) host controller hardware.
-  If your USB host controller supports USB 2.0, you will likely want to
-  configure this Host Controller Driver.  At this writing, the primary
-  implementation of EHCI is a chip from NEC, widely available in add-on
-  PCI cards, but implementations are in the works from other vendors
-  including Intel and Philips.  Motherboard support is appearing.
-
-  EHCI controllers are packaged with "companion" host controllers (OHCI
-  or UHCI) to handle USB 1.1 devices connected to root hub ports.  Ports
-  will connect to EHCI if it the device is high speed, otherwise they
-  connect to a companion controller.  If you configure EHCI, you should
-  probably configure the OHCI (for NEC and some other vendors) USB Host
-  Controller Driver too.
-
-  You may want to read <file:Documentation/usb/ehci.txt>.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ehci-hcd.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-UHCI (Intel PIIX4, VIA, ...) support
-CONFIG_USB_UHCI
-  The Universal Host Controller Interface is a standard by Intel for
-  accessing the USB hardware in the PC (which is also called the USB
-  host controller). If your USB host controller conforms to this
-  standard, you may want to say Y, but see below. All recent boards
-  with Intel PCI chipsets (like intel 430TX, 440FX, 440LX, 440BX,
-  i810, i820) conform to this standard. Also all VIA PCI chipsets
-  (like VIA VP2, VP3, MVP3, Apollo Pro, Apollo Pro II or Apollo Pro
-  133).
-
-  Currently there exist two drivers for UHCI host controllers: this
-  one and the so-called JE driver, which you can get from
-  "UHCI alternate (JE) support", below. You need only one.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called usb-uhci.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-UHCI (Intel PIIX4, VIA, ...) alternate (JE) support
-CONFIG_USB_UHCI_ALT
-  The Universal Host Controller Interface is a standard by Intel for
-  accessing the USB hardware in the PC (which is also called the USB
-  host controller). If your USB host controller conforms to this
-  standard, you may want to say Y, but see below. All recent boards
-  with Intel PCI chipsets (like intel 430TX, 440FX, 440LX, 440BX,
-  i810, i820) conform to this standard. Also all VIA PCI chipsets
-  (like VIA VP2, VP3, MVP3, Apollo Pro, Apollo Pro II or Apollo Pro
-  133). If unsure, say Y.
-
-  Currently there exist two drivers for UHCI host controllers: this
-  so-called JE driver, and the one you get from "UHCI support", above.
-  You need only one.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called uhci.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-OHCI (Compaq, iMacs, OPTi, SiS, ALi, ...) support
-CONFIG_USB_OHCI
-  The Open Host Controller Interface is a standard by
-  Compaq/Microsoft/National for accessing the USB PC hardware (also
-  called USB host controller). If your USB host controller conforms to
-  this standard, say Y. The USB host controllers on most non-Intel
-  architectures and on several x86 compatibles with non-Intel chipsets
-  -- like SiS (aktual 610, 610 and so on) or ALi (ALi IV, ALi V,
-  Aladdin Pro..) -- conform to this standard.
-
-  You may want to read <file:Documentation/usb/ohci.txt>.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called usb-ohci.o. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-USB Human Interface Device (full HID) support
-CONFIG_USB_HID
-  Say Y here if you want full HID support to connect keyboards,
-  mice, joysticks, graphic tablets, or any other HID based devices
-  to your computer via USB. You also need to select HID Input layer
-  support (below) if you want to use keyboards, mice, joysticks and
-  the like.
-
-  You can't use this driver and the HIDBP (Boot Protocol) keyboard
-  and mouse drivers at the same time. More information is available:
-  <file:Documentation/input/input.txt>.
-
-  If unsure, say Y.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called hid.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-USB HID Input layer support
-CONFIG_USB_HIDINPUT
-  Say Y here if you want to use a USB keyboard, mouse or joystick,
-  or any other HID input device. You also need Input layer support, 
-  (CONFIG_INPUT) which you select under "Input core support".
-
-  If unsure, say Y.
-
-/dev/usb/hiddev raw HID device support
-CONFIG_USB_HIDDEV
-  Say Y here if you want to support HID devices (from the USB
-  specification standpoint) that aren't strictly user interface
-  devices, like monitor controls and Uninterruptable Power Supplies.
-
-  This module supports these devices separately using a separate
-  event interface on /dev/usb/hiddevX (char 180:96 to 180:111).
-  This driver requires CONFIG_USB_HID.
-
-  If unsure, say Y.
-
-USB HIDBP Keyboard (basic) support
-CONFIG_USB_KBD
-  Say Y here only if you are absolutely sure that you don't want
-  to use the generic HID driver for your USB keyboard and prefer
-  to use the keyboard in its limited Boot Protocol mode instead.
-
-  This is almost certainly not what you want.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called usbkbd.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-  If even remotely unsure, say N.
-
-USB HIDBP Mouse (basic) support
-CONFIG_USB_MOUSE
-  Say Y here only if you are absolutely sure that you don't want
-  to use the generic HID driver for your USB keyboard and prefer
-  to use the keyboard in its limited Boot Protocol mode instead.
-
-  This is almost certainly not what you want.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called usbmouse.o. If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-  If even remotely unsure, say N.
-
-Wacom Intuos/Graphire tablet support
-CONFIG_USB_WACOM
-  Say Y here if you want to use the USB version of the Wacom Intuos
-  or Graphire tablet.  Make sure to say Y to "Mouse support"
-  (CONFIG_INPUT_MOUSEDEV) and/or "Event interface support"
-  (CONFIG_INPUT_EVDEV) as well.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called wacom.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Griffin Technology PowerMate support
-CONFIG_USB_POWERMATE
-  Say Y here if you want to use the Griffin Technology, Inc. USB
-  PowerMate device. This device is an aluminum dial which can
-  measure clockwise and anticlockwise rotation. The dial also
-  acts as a pushbutton. The base contains an LED which can be
-  instructed to pulse or to switch to a particular intensity.
-
-  You can download userspace tools from http://sowerbutts.com/powermate/
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called powermate.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Aiptek 6000U/8000U tablet support
-CONFIG_USB_AIPTEK
-  Say Y here if you want to use the USB version of the Aiptek 6000U/8000U
-  tablet.  Make sure to say Y to "Event interface support"
-  (CONFIG_INPUT_EVDEV) as well.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called aiptek.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Use input layer for ADB devices
-CONFIG_INPUT_ADBHID
-  Say Y here if you want to have ADB (Apple Desktop Bus) HID devices
-  such as keyboards, mice, joysticks, or graphic tablets handled by
-  the input layer.  If you say Y here, make sure to say Y to the
-  corresponding drivers "Keyboard support" (CONFIG_INPUT_KEYBDEV),
-  "Mouse Support" (CONFIG_INPUT_MOUSEDEV) and "Event interface
-  support" (CONFIG_INPUT_EVDEV) as well.
-
-  If you say N here, you still have the option of using the old ADB
-  keyboard and mouse drivers.
-
-  If unsure, say Y.
-
-Input core support
-CONFIG_INPUT
-  Say Y here if you want to enable any of the following options for
-  USB Human Interface Device (HID) support.
-
-  Say Y here if you want to enable any of the USB HID options in the
-  USB support section which require Input core support.
-
-  Otherwise, say N.
-
-Keyboard support
-CONFIG_INPUT_KEYBDEV
-  Say Y here if you want your USB HID keyboard (or an ADB keyboard
-  handled by the input layer) to be able to serve as a system
-  keyboard.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called keybdev.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Mouse support
-CONFIG_INPUT_MOUSEDEV
-  Say Y here if you want your USB HID mouse (or ADB mouse handled by
-  the input layer) to be accessible as char devices 13:32+ -
-  /dev/input/mouseX and 13:63 - /dev/input/mice as an emulated ImPS/2
-  mouse.  That way, all user space programs will be able to use your
-  mouse.
-
-  If unsure, say Y.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called mousedev.o. If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-Horizontal screen resolution
-CONFIG_INPUT_MOUSEDEV_SCREEN_X
-  If you're using a digitizer, or a graphic tablet, and want to use
-  it as a mouse then the mousedev driver needs to know the X window
-  screen resolution you are using to correctly scale the data. If
-  you're not using a digitizer, this value is ignored.
-
-Vertical screen resolution
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y
-  If you're using a digitizer, or a graphic tablet, and want to use
-  it as a mouse then the mousedev driver needs to know the X window
-  screen resolution you are using to correctly scale the data. If
-  you're not using a digitizer, this value is ignored.
-
-Joystick support
-CONFIG_INPUT_JOYDEV
-  Say Y here if you want your USB HID joystick or gamepad to be
-  accessible as char device 13:0+ - /dev/input/jsX device.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called joydev.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Event interface support
-CONFIG_INPUT_EVDEV
-  Say Y here if you want your USB or ADB HID device events be
-  accessible under char device 13:64+ - /dev/input/eventX in a generic
-  way.  This is the future ...
-
-USB Scanner support
-CONFIG_USB_SCANNER
-  Say Y here if you want to connect a USB scanner to your computer's
-  USB port. Please read <file:Documentation/usb/scanner.txt> for more
-  information.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called scanner.o. If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-HP 5300C scanner support 
-CONFIG_USB_HP5300
-  Say Y here if you want to connect a HP5300C scanner to your
-  computer's USB port.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called hp5300.o. If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-USB Audio support
-CONFIG_USB_AUDIO
-  Say Y here if you want to connect USB audio equipment such as
-  speakers to your computer's USB port.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called audio.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-EMI 2|6 USB Audio interface support
-CONFIG_USB_EMI26
-  This driver loads firmware to Emagic EMI 2|6 low latency USB
-  Audio interface.
-
-  After firmware load the device is handled with standard linux
-  USB Audio driver.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called audio.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-USB Modem (CDC ACM) support
-CONFIG_USB_ACM
-  This driver supports USB modems and ISDN adapters which support the
-  Communication Device Class Abstract Control Model interface.
-  Please read <file:Documentation/usb/acm.txt> for details.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called acm.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-USB serial converter support
-CONFIG_USB_SERIAL
-  Say Y here if you have a USB device that provides normal serial
-  ports, or acts like a serial device, and you want to connect it to
-  your USB bus.
-
-  Please read <file:Documentation/usb/usb-serial.txt> for more
-  information on the specifics of the different devices that are
-  supported, and on how to use them.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called usbserial.o. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-USB Generic Serial Driver
-CONFIG_USB_SERIAL_GENERIC
-  Say Y here if you want to use the generic USB serial driver.  Please
-  read <file:Documentation/usb/usb-serial.txt> for more information on
-  using this driver.  It is recommended that the "USB Serial converter
-  support" be compiled as a module for this driver to be used
-  properly.
-
-USB ConnectTech WhiteHEAT Serial Driver
-CONFIG_USB_SERIAL_WHITEHEAT
-  Say Y here if you want to use a ConnectTech WhiteHEAT 4 port
-  USB to serial converter device.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called whiteheat.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-USB Handspring Visor Driver
-CONFIG_USB_SERIAL_VISOR
-  Say Y here if you want to connect to your HandSpring Visor, Palm
-  m500 or m505 through its USB docking station. See
-  <http://usbvisor.sourceforge.net/> for more information on using this
-  driver.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called visor.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-USB PocketPC PDA Driver
-CONFIG_USB_SERIAL_IPAQ
-  Say Y here if you want to connect to your Compaq iPAQ, HP Jornada,
-  or any other PDA running Windows CE 3.0 or PocketPC 2002 using a USB
-  cradle/cable. For information on using the driver,
-  read <file:Documentation/usb/usb-serial.txt>.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ipaq.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-USB IR Dongle Serial Driver
-CONFIG_USB_SERIAL_IR
-  Say Y here if you want to enable simple serial support for USB IrDA
-  devices.  This is useful if you do not want to use the full IrDA
-  stack.
-  
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ir-usb.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-USB Belkin and Paracom Single Port Serial Driver
-CONFIG_USB_SERIAL_BELKIN
-  Say Y here if you want to use a Belkin USB Serial single port
-  adaptor (F5U103 is one of the model numbers) or the Peracom single
-  port USB to serial adapter.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called belkin_sa.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-USB FTDI Single Port Serial Driver
-CONFIG_USB_SERIAL_FTDI_SIO
-  Say Y here if you want to use a FTDI SIO single port USB to serial
-  converter device. The implementation I have is called the USC-1000.
-  This driver has also be tested with the 245 and 232 devices.
-
-  See <http://ftdi-usb-sio.sourceforge.net/> for more
-  information on this driver and the device.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ftdi_sio.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-USB Keyspan PDA Single Port Serial Driver
-CONFIG_USB_SERIAL_KEYSPAN_PDA
-  Say Y here if you want to use a Keyspan PDA single port USB to
-  serial converter device.  This driver makes use of firmware
-  developed from scratch by Brian Warner.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called keyspan_pda.o. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-USB Xircom / Entregra Single Port Serial Driver
-CONFIG_USB_SERIAL_XIRCOM
-  Say Y here if you want to use a Xircom or Entregra single port USB to
-  serial converter device.  This driver makes use of firmware
-  developed from scratch by Brian Warner.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called keyspan_pda.o. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-USB Keyspan USA-xxx Serial Driver
-CONFIG_USB_SERIAL_KEYSPAN
-  Say Y here if you want to use Keyspan USB to serial converter
-  devices.  This driver makes use of Keyspan's official firmware
-  and was developed with their support.  You must also include
-  firmware to support your particular device(s).
-
-  See <http://misc.nu/hugh/keyspan.html> for more information.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called keyspan.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-USB Keyspan USA-28 Firmware
-CONFIG_USB_SERIAL_KEYSPAN_USA28
-  Say Y here to include firmware for the USA-28 converter.
-
-USB Keyspan USA-28X Firmware
-CONFIG_USB_SERIAL_KEYSPAN_USA28X
-  Say Y here to include firmware for the USA-28X converter.
-  Be sure you have a USA-28X, there are also 28XA and 28XB
-  models, the label underneath has the actual part number.
-
-USB Keyspan USA-28XA Firmware
-CONFIG_USB_SERIAL_KEYSPAN_USA28XA
-  Say Y here to include firmware for the USA-28XA converter.
-  Be sure you have a USA-28XA, there are also 28X and 28XB
-  models, the label underneath has the actual part number.
-
-USB Keyspan USA-28XB Firmware
-CONFIG_USB_SERIAL_KEYSPAN_USA28XB
-  Say Y here to include firmware for the USA-28XB converter.
-  Be sure you have a USA-28XB, there are also 28X and 28XA
-  models, the label underneath has the actual part number.
-
-USB Keyspan USA-19 Firmware
-CONFIG_USB_SERIAL_KEYSPAN_USA19
-  Say Y here to include firmware for the USA-19 converter.
-
-USB Keyspan USA-18X Firmware
-CONFIG_USB_SERIAL_KEYSPAN_USA18X
-  Say Y here to include firmware for the USA-18X converter.
-
-USB Keyspan USA-19W Firmware
-CONFIG_USB_SERIAL_KEYSPAN_USA19W
-  Say Y here to include firmware for the USA-19W converter.
-
-USB Keyspan USA-19QW Firmware
-CONFIG_USB_SERIAL_KEYSPAN_USA19QW
-  Say Y here to include firmware for the USA-19QW converter.
-
-USB Keyspan USA-19QI Firmware
-CONFIG_USB_SERIAL_KEYSPAN_USA19QI
-  Say Y here to include firmware for the USA-19QI converter.
-
-USB Keyspan USA-49W Firmware
-CONFIG_USB_SERIAL_KEYSPAN_USA49W
-  Say Y here to include firmware for the USA-49W converter.
-
-USB ZyXEL omni.net LCD Plus Driver
-CONFIG_USB_SERIAL_OMNINET
-  Say Y here if you want to use a ZyXEL omni.net LCD ISDN TA.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called omninet.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-USB Digi International AccelePort USB Serial Driver
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT
-  Say Y here if you want to use Digi AccelePort USB 2 or 4 devices,
-  2 port (plus parallel port) and 4 port USB serial converters.  The
-  parallel port on the USB 2 appears as a third serial port on Linux.
-  The Digi Acceleport USB 8 is not yet supported by this driver.
-
-  This driver works under SMP with the usb-uhci driver.  It does not
-  work under SMP with the uhci driver.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called digi_acceleport.o.  If you want to compile
-  it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-USB Empeg empeg-car Mark I/II Driver
-CONFIG_USB_SERIAL_EMPEG
-  Say Y here if you want to connect to your Empeg empeg-car Mark I/II
-  mp3 player via USB.  The driver uses a single ttyUSB{0,1,2,...}
-  device node.  See <file:Documentation/usb/usb-serial.txt> for more
-  tidbits of information.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called empeg.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-USB MCT Single Port Serial Driver
-CONFIG_USB_SERIAL_MCT_U232
-  Say Y here if you want to use a USB Serial single port adapter from
-  Magic Control Technology Corp. (U232 is one of the model numbers).
-
-  This driver also works with Sitecom U232-P25 and D-Link DU-H3SP USB
-  BAY devices.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called mct_u232.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-USB Prolific 2303 Single Port Serial Driver
-CONFIG_USB_SERIAL_PL2303
-  Say Y here if you want to use the PL2303 USB Serial single port
-  adapter from Prolific.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called pl2303.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-USB KOBIL chipcard reader
-CONFIG_USB_SERIAL_KOBIL_SCT
-  Say Y here if you want to use one of the following KOBIL USB chipcard 
-  readers: TWIN, KAAN Standard Plus, SecOVID Reader Plus, B1 PRO, KAAN PRO
-
-  Note that you need a current CT-API.
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called kobil_sct.o. If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-USB REINER SCT cyberJack pinpad/e-com chipcard reader
-CONFIG_USB_SERIAL_CYBERJACK
-  Say Y here if you want to use a cyberJack pinpad/e-com USB chipcard
-  reader. This is an interface to ISO 7816 compatible contactbased
-  chipcards, e.g. GSM SIMs.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called cyberjack.o. If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-  If unsure, say N.
-
-USB Edgeport Serial Driver
-CONFIG_USB_SERIAL_EDGEPORT
-  Say Y here if you want to use any of the following devices from
-  Inside Out Networks (Digi):
-       Edgeport/4
-       Rapidport/4
-       Edgeport/4t
-       Edgeport/2
-       Edgeport/4i
-       Edgeport/2i
-       Edgeport/421
-       Edgeport/21
-       Edgeport/8
-       Edgeport/8 Dual
-       Edgeport/2D8
-       Edgeport/4D8
-       Edgeport/8i
-       Edgeport/2 DIN
-       Edgeport/4 DIN
-       Edgeport/16 Dual
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called io_edgeport.o.  If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-USB PalmConnect (and other KL5KUSB105-based) Single Port Serial Driver
-CONFIG_USB_SERIAL_KLSI
-  Say Y here if you want to use a KL5KUSB105 - based single port
-  serial adapter. The most widely known -- and currently the only
-  tested -- device in this category is the PalmConnect USB Serial
-  adapter sold by Palm Inc. for use with their Palm III and Palm V
-  series PDAs.
-
-  Please read <file:Documentation/usb/usb-serial.txt> for more
-  information.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called kl5kusb105.o. If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-USB Serial Converter verbose debug
-CONFIG_USB_SERIAL_DEBUG
-  Say Y here if you want verbose debug messages from the USB Serial
-  Drivers sent to the kernel debug log.
-
-USB Printer support
-CONFIG_USB_PRINTER
-  Say Y here if you want to connect a USB printer to your computer's
-  USB port.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called printer.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-USB IBM (Xirlink) C-It Camera support
-CONFIG_USB_IBMCAM
-  Say Y here if you want to connect a IBM "C-It" camera, also known as
-  "Xirlink PC Camera" to your computer's USB port.  For more
-  information, read <file:Documentation/usb/ibmcam.txt>.
-
-  This driver uses the Video For Linux API.  You must enable
-  (Y or M in config) Video For Linux (under Character Devices)
-  to use this driver.  Information on this API and pointers to
-  "v4l" programs may be found on the WWW at
-  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ibmcam.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>. This
-  camera has several configuration options which can be specified when
-  you load the module.  Read <file:Documentation/usb/ibmcam.txt> to
-  learn more.
-
-CONFIG_USB_KONICAWC
-  Say Y here if you want support for webcams based on a Konica
-  chipset. This is known to work with the Intel YC76 webcam.
-
-  This driver uses the Video For Linux API.  You must enable
-  (Y or M in config) Video For Linux (under Character Devices)
-  to use this driver.  Information on this API and pointers to
-  "v4l" programs may be found on the WWW at
-  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called konicawc.o. If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-USB OV511 Camera support
-CONFIG_USB_OV511
-  Say Y here if you want to connect this type of camera to your
-  computer's USB port. See <file:Documentation/usb/ov511.txt> for more
-  information and for a list of supported cameras.
-
-  This driver uses the Video For Linux API. You must say Y or M to
-  "Video For Linux" (under Character Devices) to use this driver.
-  Information on this API and pointers to "v4l" programs may be found
-  on the WWW at <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ov511.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-USB Communication Class Ethernet device support
-CONFIG_USB_CDCETHER
-  This driver supports devices conforming to the Communication Device
-  Class Ethernet Control Model.  This is used in some cable modems.
-  For more details on the specification, get the Communication Device
-  Class specification from <http://www.usb.org/>.
-
-  This driver should work with the following devices:
-        * Ericsson PipeRider (all variants)
-        * Motorola (DM100 and SB4100)
-        * Broadcom Cable Modem (reference design)
-        * Toshiba PCX1100U and possibly other cable modems
-        * Sharp Zaurus SL-5000D
-
-  The device creates a network device (ethX, where X depends on what
-  other networking devices you have in use), as for a normal PCI
-  or ISA based ethernet network card.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called CDCEther.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-NetChip 1080-based USB Host-to-Host Link
-CONFIG_USB_NET1080
-  The NetChip 1080 is a USB 1.1 host controller.  NetChip has a web
-  site with technical information at <http://www.netchip.com/>.
-
-Philips webcam support
-CONFIG_USB_PWC
-  Say Y or M here if you want to use one of these Philips USB webcams:
-  PCA645, PCA646, PCVC675, PCVC680, PCVC690, PCVC730, PCVC740, or
-  the Askey VC010. The PCA635, PCVC665 and PCVC720 are not supported
-  by this driver and never will be.
-
-  This driver has an optional plugin, which is distributed as a binary
-  module only.  It contains code that allow you to use higher
-  resolutions and framerates but may not be distributed as source.
-  But even without this plugin you can these cams for most
-  applications.
-
-  See <file:Documentation/usb/philips.txt> for more information and
-  installation instructions.
-
-  The built-in microphone is enabled by selecting USB Audio support.
-
-  This driver uses the Video For Linux API. You must say Y or M to
-  "Video For Linux" (under Character Devices) to use this driver.
-  Information on this API and pointers to "v4l" programs may be found
-  on the WWW at <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called pwc.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-USB SE401 Camera support
-CONFIG_USB_SE401
-  Say Y here if you want to connect this type of camera to your
-  computer's USB port. See <file:Documentation/usb/se401.txt> for more
-  information and for a list of supported cameras.
-
-  This driver uses the Video For Linux API. You must say Y or M to
-  "Video For Linux" (under Multimedia Devices) to use this driver.
-  Information on this API and pointers to "v4l" programs may be found
-  on the WWW at <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called se401.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-USB STV680 (Pencam) Camera support
-CONFIG_USB_STV680
-  Say Y here if you want to connect this type of camera to your
-  computer's USB port. This includes the Pencam line of cameras.
-  See <file:Documentation/usb/stv680.txt> for more information and for
-  a list of supported cameras.
-
-  This driver uses the Video For Linux API. You must say Y or M to
-  "Video For Linux" (under Multimedia Devices) to use this driver.
-  Information on this API and pointers to "v4l" programs may be found
-  on the WWW at <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called stv680.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Vicam
-CONFIG_USB_VICAM
-  Say Y here if you have 3com homeconnect camera (vicam).
-
-  This driver uses the Video For Linux API. You must say Y or M to
-  "Video For Linux" (under Multimedia Devices) to use this driver.
-  Information on this API and pointers to "v4l" programs may be found
-  on the WWW at <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called vicam.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-
-Pegasus/Pegasus II based USB-Ethernet device support
-CONFIG_USB_PEGASUS
-  Say Y here if you know you have Pegasus or Pegasus-II based adapter.
-  If in doubt then look at linux/drivers/usb/pegasus.h for the complete
-  list of supported devices.
-  If your particular adapter is not in the list and you are _sure_ it
-  is Pegasus or Pegasus-II based then send me (petkan@users.sourceforge.net)
-  vendor and device IDs.
-  
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called pegasus.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Realtek RTL8150 based USB-Ethernet device support
-CONFIG_USB_RTL8150
-  Say Y here if you have RTL8150 based usb-ethernet adapter.
-  Send me (petkan@users.sourceforge.net) any comments you may have.
-  You can also check for updates at <http://pegasus2.sourceforge.net/>
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called rtl8150.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-USB KLSI KL5USB101-based Ethernet device support
-CONFIG_USB_KAWETH
-  Say Y here if you want to use one of the following 10Mbps only
-  USB Ethernet adapters based on the KLSI KL5KUSB101B chipset:
-       3Com 3C19250
-       ADS USB-10BT
-       ATEN USB Ethernet
-       ASANTE USB To Ethernet Adapter
-       AOX Endpoints USB Ethernet
-       Correga K.K.
-       D-Link DSB-650C and DU-E10
-       Entrega / Portgear E45
-       I-O DATA USB-ET/T
-       Jaton USB Ethernet Device Adapter
-       Kingston Technology USB Ethernet Adapter
-       Linksys USB10T
-       Mobility USB-Ethernet Adapter
-       NetGear EA-101
-       Peracom Enet and Enet2
-       Portsmith Express Ethernet Adapter
-       Shark Pocket Adapter
-       SMC 2202USB
-       Sony Vaio port extender
-
-  This driver is likely to work with most 10Mbps only USB Ethernet
-  adapters, including some "no brand" devices. It does NOT work on
-  SmartBridges smartNIC or on Belkin F5U111 devices - you should use
-  the CATC NetMate driver for those. If you are not sure which one
-  you need, select both, and the correct one should be selected for
-  you.
-
-  This driver makes the adapter appear as a normal Ethernet interface,
-  typically on eth0, if it is the only ethernet device, or perhaps on
-  eth1, if you have a PCI or ISA ethernet card installed.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called kaweth.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-USB CATC NetMate-based Ethernet device support
-CONFIG_USB_CATC
-  Say Y if you want to use one of the following 10Mbps USB Ethernet
-  device based on the EL1210A chip. Supported devices are:
-    Belkin F5U011
-    Belkin F5U111
-    CATC NetMate
-    CATC NetMate II
-    smartBridges smartNIC
-
-  This driver makes the adapter appear as a normal Ethernet interface,
-  typically on eth0, if it is the only ethernet device, or perhaps on
-  eth1, if you have a PCI or ISA ethernet card installed.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called catc.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-USB Kodak DC-2xx Camera support
-CONFIG_USB_DC2XX
-  Say Y here if you want to connect this type of still camera to your
-  computer's USB port.  See <file:Documentation/usb/dc2xx.txt> for
-  more information; some non-Kodak cameras may also work with this
-  driver, given application support (such as <http://www.gphoto.org/>).
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called dc2xx.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-USB Mustek MDC800 Digital Camera support
-CONFIG_USB_MDC800
-  Say Y here if you want to connect this type of still camera to
-  your computer's USB port. This driver can be used with gphoto 0.4.3
-  and higher (look at <http://www.gphoto.org/>).
-  To use it create a device node with "mknod /dev/mustek c 180 32" and
-  configure it in your software.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called mdc800.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-USB Mass Storage support
-CONFIG_USB_STORAGE
-  Say Y here if you want to connect USB mass storage devices to your
-  computer's USB port.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called usb-storage.o. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-USB Mass Storage verbose debug
-CONFIG_USB_STORAGE_DEBUG
-  Say Y here in order to have the USB Mass Storage code generate
-  verbose debugging messages.
-
-ISD-200 USB/ATA Bridge support
-CONFIG_USB_STORAGE_ISD200
-  Say Y here if you want to use USB Mass Store devices based
-  on the In-Systems Design ISD-200 USB/ATA bridge.
-
-  Some of the products that use this chip are:
-
-    - Archos Jukebox 6000
-    - ISD SmartCable for Storage
-    - Taiwan Skymaster CD530U/DEL-0241 IDE bridge
-    - Sony CRX10U CD-R/RW drive
-    - CyQ've CQ8060A CDRW drive
-    - Planex eXtreme Drive RX-25HU USB-IDE cable (not model RX-25U)
-
-USS720 parport driver
-CONFIG_USB_USS720
-  This driver is for USB parallel port adapters that use the Lucent
-  Technologies USS-720 chip. These cables are plugged into your USB
-  port and provide USB compatibility to peripherals designed with
-  parallel port interfaces.
-
-  The chip has two modes: automatic mode and manual mode. In automatic
-  mode, it looks to the computer like a standard USB printer. Only
-  printers may be connected to the USS-720 in this mode. The generic
-  USB printer driver ("USB Printer support", above) may be used in
-  that mode, and you can say N here if you want to use the chip only
-  in this mode.
-
-  Manual mode is not limited to printers, any parallel port
-  device should work. This driver utilizes manual mode.
-  Note however that some operations are three orders of magnitude
-  slower than on a PCI/ISA Parallel Port, so timing critical
-  applications might not work.
-
-  Say Y here if you own an USS-720 USB->Parport cable and intend to
-  connect anything other than a printer to it.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called uss720.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-USB device file system
-CONFIG_USB_DEVICEFS
-  If you say Y here (and to "/proc file system support" in the "File
-  systems section, above), you will get a file /proc/bus/usb/devices
-  which lists the devices currently connected to your USB bus or
-  busses, a file /proc/bus/usb/drivers which lists the USB kernel
-  client drivers currently loaded, and for every connected device a
-  file named  "/proc/bus/usb/xxx/yyy", where xxx is the bus number and
-  yyy the device number; the latter files can be used by user space
-  programs to talk directly to the device. These files are "virtual",
-  meaning they are generated on the fly and not stored on the hard
-  drive.
-
-  You may need to mount the usbdevfs file system to see the files, use
-   mount -t usbdevfs none /proc/bus/usb
-
-  For the format of the various /proc/bus/usb/ files, please read
-  <file:Documentation/usb/proc_usb_info.txt>.
-
-  Please note that this code is completely unrelated to devfs, the
-  "/dev file system support".
-
-  Most users want to say Y here.
-
-Enforce USB bandwidth allocation
-CONFIG_USB_BANDWIDTH
-  If you say Y here, the USB subsystem enforces USB bandwidth
-  allocation and will prevent some device opens from succeeding
-  if they would cause USB bandwidth usage to go above 90% of
-  the bus bandwidth.
-
-  If you say N here, these conditions will cause warning messages
-  about USB bandwidth usage to be logged and some devices or
-  drivers may not work correctly.
-
-DABUSB driver
-CONFIG_USB_DABUSB
-  A Digital Audio Broadcasting (DAB) Receiver for USB and Linux
-  brought to you by the DAB-Team (<http://dab.in.tum.de/>).  This
-  driver can be taken as an example for URB-based bulk, control, and
-  isochronous transactions. URB's are explained in
-  <file:Documentation/usb/URB.txt>.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called dabusb.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Host-to-Host USB networking
-CONFIG_USB_USBNET
-  This driver supports network links over USB with USB "Network"
-  or "data transfer" cables, often used to network laptops to PCs.
-  Such cables have chips from suppliers such as Belkin/eTEK, GeneSys
-  (GeneLink), NetChip and Prolific. Intelligent USB devices could also
-  use this approach to provide Internet access, using standard USB
-  cabling. You can find these chips also on some motherboards with
-  USB PC2PC support.
-
-  These links will have names like "usb0", "usb1", etc.  They act
-  like two-node Ethernets, so you can use 802.1d Ethernet Bridging
-  (CONFIG_BRIDGE) to simplify your network routing.
-
-  This code is also available as a kernel module (code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called usbnet.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Freecom USB/ATAPI Bridge support
-CONFIG_USB_STORAGE_FREECOM
-  Support for the Freecom USB to IDE/ATAPI adaptor.
-  Freecom has a web page at <http://www.freecom.de/>.
-
-Microtech CompactFlash/SmartMedia reader
-CONFIG_USB_STORAGE_DPCM
-  Say Y here to support the Microtech ZiO! CompactFlash/SmartMedia
-  reader, details at <http://www.microtechint.com/zio/index.html>.
-  This driver treats the flash card as a removable storage device.
-
-SanDisk SDDR-09 (and other SmartMedia) support
-CONFIG_USB_STORAGE_SDDR09
-  Say Y here to include additional code to support the Sandisk SDDR-09
-  SmartMedia reader in the USB Mass Storage driver.
-
-SanDisk SDDR-55 SmartMedia support
-CONFIG_USB_STORAGE_SDDR55
-  Say Y here to include additional code to support the Sandisk SDDR-55
-  SmartMedia reader in the USB Mass Storage driver.
-
-USB Diamond Rio500 support
-CONFIG_USB_RIO500
-  Say Y here if you want to connect a USB Rio500 mp3 player to your
-  computer's USB port. Please read <file:Documentation/usb/rio.txt>
-  for more information.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called rio500.o. If you want to compile it as
-  a module, say M here and read <file:Documenatation/modules.txt>.
-
-Auerswald device support
-CONFIG_USB_AUERSWALD
-  Say Y here if you want to connect an Auerswald USB ISDN Device
-  to your computer's USB port.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called auerswald.o. If you want to compile it as
-  a module, say M here and read <file:Documenatation/modules.txt>
-
-USB Auerswald ISDN modem support
-CONFIG_USB_AUERISDN
-  Say Y here if you want to enable the ISDN modem option
-  of your Auerswald ISDN devices. 
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called auerswald.o. If you want to compile it as
-  a module, say M here and read <file:Documenatation/modules.txt>
-
-CONFIG_USB_TIGL
-  If you own a Texas Instruments graphing calculator and use a
-  TI-GRAPH LINK USB cable (aka SilverLink), then you might be 
-  interested in this driver.
-
-  If you enable this driver, you will be able to communicate with
-  your calculator through a set of device nodes under /dev.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called tiglusb.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt.
-
-  If you don't know what the SilverLink cable is or what a Texas
-  Instruments graphing calculator is, then you probably don't need this
-  driver.
-
-  If unsure, say N.
-
-Texas Instruments parallel link cable support
-CONFIG_TIPAR
-  If you own a Texas Instruments graphing calculator and use a
-  parallel link cable, then you might be interested in this driver.
-
-  If you enable this driver, you will be able to communicate with
-  your calculator through a set of device nodes under /dev. The
-  main advantage of this driver is that you don't have to be root
-  to use this precise link cable (depending on the permissions on
-  the device nodes, though).
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called tipar.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>
-
-  If you don't know what a parallel link cable is or what a Texas
-  Instruments graphing calculator is, then you probably don't need this
-  driver.
-
-  If unsure, say N.
-
-Tieman Voyager USB Braille display support
-CONFIG_USB_BRLVOYAGER
-  Say Y here if you want to use the Voyager USB Braille display from
-  Tieman. See <file:Documentation/usb/brlvger.txt> for more
-  information.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called brlvger.o. If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-USBLCD support
-CONFIG_USB_LCD
-  Say Y here if you want to connect an USBLCD to your computer's
-  USB port. The USBLCD is a small USB interface board for
-  alphanumeric LCD modules. See <http://www.usblcd.de> for more
-  information.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called usblcd.o. If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-D-Link DSB-R100 FM radio support
-CONFIG_USB_DSBR
-  Say Y here if you want to connect this type of radio to your
-  computer's USB port. Note that the audio is not digital, and
-  you must connect the line out connector to a sound card or a
-  set of speakers.
-
-  This driver uses the Video For Linux API.  You must enable
-  (Y or M in config) Video For Linux (under Character Devices)
-  to use this driver.  Information on this API and pointers to
-  "v4l" programs may be found on the WWW at
-  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called dsbr100.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Always do synchronous disk IO for UBD
-CONFIG_BLK_DEV_UBD_SYNC
-  The User-Mode Linux port includes a driver called UBD which will let
-  you access arbitrary files on the host computer as block devices.
-  Writes to such a block device are not immediately written to the
-  host's disk; this may cause problems if, for example, the User-Mode
-  Linux 'Virtual Machine' uses a journalling file system and the host
-  computer crashes.
-
-  Synchronous operation (i.e. always writing data to the host's disk
-  immediately) is configurable on a per-UBD basis by using a special
-  kernel command line option.  Alternatively, you can say Y here to
-  turn on synchronous operation by default for all block.
-
-  If you're running a journalling file system (like reiserfs, for
-  example) in your virtual machine, you will want to say Y here.  If
-  you care for the safety of the data in your virtual machine, Y is a
-  wise choice too.  In all other cases (for example, if you're just
-  playing around with User-Mode Linux) you can choose N.
-
-Enable ptrace proxy
-CONFIG_PT_PROXY
-  This option enables a debugging interface which allows gdb to debug
-  the kernel without needing to actually attach to kernel threads.
-  If you want to do kernel debugging, say Y here; otherwise say N.
-
-Management console
-CONFIG_MCONSOLE
-  The user mode linux management console is a low-level interface to
-  the kernel, somewhat like the i386 SysRq interface.  Since there is
-  a full-blown operating system running under every user mode linux
-  instance, there is much greater flexibility possible than with the
-  SysRq mechanism.
-
-  If you answer 'Y' to this option, to use this feature, you need the
-  mconsole client (called uml_mconsole) which is present in CVS in
-  2.4.5-9um and later (path /tools/mconsole), and is also in the
-  distribution RPM package in 2.4.6 and later.
-
-  It is safe to say 'Y' here.
-
-Enable kernel debugging symbols
-CONFIG_DEBUGSYM
-  When this is enabled, the User-Mode Linux binary will include
-  debugging symbols.  This enlarges the binary by a few megabytes,
-  but aids in tracking down kernel problems in UML.  It is required
-  if you intend to do any kernel development.
-
-  If you're truly short on disk space or don't expect to report any
-  bugs back to the UML developers, say N, otherwise say Y.
-
-Enable gcov support
-CONFIG_GCOV
-  This option allows developers to retrieve coverage data from a UML
-  session.
-
-  See <http://user-mode-linux.sourceforge.net/gcov.html> for more
-  details.
-
-  If you're involved in UML kernel development and want to use gcov,
-  say Y.  If you're unsure, say N.
-
-Enable gprof support
-CONFIG_GPROF
-  This allows profiling of a User-Mode Linux kernel with the gprof
-  utility.
-
-  See <http://user-mode-linux.sourceforge.net/gprof.html> for more
-  details.
-
-  If you're involved in UML kernel development and want to use gprof,
-  say Y.  If you're unsure, say N.
-
-Host filesystem
-CONFIG_HOSTFS
-  While the User-Mode Linux port uses its own root file system for
-  booting and normal file access, this module lets the UML user
-  access files stored on the host.  It does not require any
-  network connection between the Host and UML.  An example use of
-  this might be:
-
-  mount none /tmp/fromhost -t hostfs -o /tmp/umlshare
-
-  where /tmp/fromhost is an empty directory inside UML and
-  /tmp/umlshare is a directory on the host with files the UML user
-  wishes to access.
-
-  For more information, see
-  <http://user-mode-linux.sourceforge.net/hostfs.html>.
-
-  If you'd like to be able to work with files stored on the host, 
-  say Y or M here; otherwise say N.
-
-Example IO Memory driver
-CONFIG_MMAPPER
-  The User-Mode Linux port can provide support for IO Memory
-  emulation with this option.  This allows a host file to be
-  specified as an I/O region on the kernel command line. That file
-  will be mapped into UML's kernel address space where a driver can
-  locate it and do whatever it wants with the memory, including
-  providing an interface to it for UML processes to use.
-
-  For more information, see
-  <http://user-mode-linux.sourceforge.net/iomem.html>.
-
-  If you'd like to be able to provide a simulated IO port space for
-  User-Mode Linux processes, say Y.  If unsure, say N.
-
-Virtual Serial Line
-CONFIG_SSL
-  The User-Mode Linux environment allows you to create virtual serial
-  lines on the UML that are usually made to show up on the host as
-  ttys or ptys.
-
-  See <http://user-mode-linux.sourceforge.net/input.html> for more
-  information and command line examples of how to use this facility.
-
-  Unless you have a specific reason for disabling this, say Y.
-
-Virtual network device
-CONFIG_UML_NET
-  While the User-Mode port cannot directly talk to any physical
-  hardware devices, this choice and the following transport options
-  provide one or more virtual network devices through which the UML
-  kernels can talk to each other, the host, and with the host's help,
-  machines on the outside world.
-
-  For more information, including explanations of the networking and
-  sample configurations, see
-  <http://user-mode-linux.sourceforge.net/networking.html>.
-
-  If you'd like to be able to enable networking in the User-Mode
-  linux environment, say Y; otherwise say N.  Note that you must
-  enable at least one of the following transport options to actually
-  make use of UML networking.
-
-Daemon transport
-CONFIG_UML_NET_DAEMON
-  This User-Mode Linux network transport allows one or more running
-  UMLs on a single host to communicate with each other, but not to
-  the host.
-
-  To use this form of networking, you'll need to run the UML
-  networking daemon on the host.
-
-  For more information, see
-  <http://user-mode-linux.sourceforge.net/networking.html>  That site
-  has examples of the UML command line to use to enable Daemon
-  networking.
-
-  If you'd like to set up a network with other UMLs on a single host,
-  say Y.  If you need a network between UMLs on multiple physical
-  hosts, choose the Multicast Transport.  To set up a network with
-  the host and/or other IP machines, say Y to the Ethertap or Slip
-  transports.  You'll need at least one of them, but may choose
-  more than one without conflict.  If you don't need UML networking,
-  say N.
-
-Ethertap transport
-CONFIG_UML_NET_ETHERTAP
-  The Ethertap User-Mode Linux network transport allows a single
-  running UML to exchange packets with its host over one of the
-  host's Ethertap devices, such as /dev/tap0.  Additional running
-  UMLs can use additional Ethertap devices, one per running UML.
-  While the UML believes it's on a (multi-device, broadcast) virtual
-  Ethernet network, it's in fact communicating over a point-to-point
-  link with the host.
-
-  To use this, your host kernel must have support for Ethertap
-  devices.  Also, if your host kernel is 2.4.x, it must have 
-  CONFIG_NETLINK_DEV configured as Y or M.
-
-  For more information, see
-  <http://user-mode-linux.sourceforge.net/networking.html>  That site
-  has examples of the UML command line to use to enable Ethertap
-  networking.
-
-  If you'd like to set up an IP network with the host and/or the
-  outside world, say Y to this, the Daemon Transport and/or the 
-  Slip Transport.  You'll need at least one of them, but may choose
-  more than one without conflict.  If you don't need UML networking,
-  say N.
-
-TUN/TAP transport
-CONFIG_UML_NET_TUNTAP
-  The UML TUN/TAP network transport allows a UML instance to exchange
-  packets with the host over a TUN/TAP device.  This option will only
-  work with a 2.4 host, unless you've applied the TUN/TAP patch to
-  your 2.2 host kernel.
-
-  To use this transport, your host kernel must have support for TUN/TAP
-  devices, either built-in or as a module.
-
-Multicast transport
-CONFIG_UML_NET_MCAST
-  This Multicast User-Mode Linux network transport allows multiple
-  UMLs (even ones running on different host machines!) to talk to
-  each other over a virtual ethernet network.  However, it requires
-  at least one UML with one of the other transports to act as a
-  bridge if any of them need to be able to talk to their hosts or any
-  other IP machines.
-
-  To use this, your host kernel(s) must support IP Multicasting.
-
-  For more information, see
-  <http://user-mode-linux.sourceforge.net/networking.html>  That site
-  has examples of the UML command line to use to enable Multicast
-  networking, and notes about the security of this approach.
-
-  If you need UMLs on multiple physical hosts to communicate as if
-  they shared an Ethernet network, say Y.  If you need to communicate
-  with other IP machines, make sure you select one of the other
-  transports (possibly in addition to Multicast; they're not
-  exclusive).  If you don't need to network UMLs say N to each of
-  the transports.
-
-SLIP transport
-CONFIG_UML_NET_SLIP
-  The Slip User-Mode Linux network transport allows a running UML to
-  network with its host over a point-to-point link.  Unlike Ethertap,
-  which can carry any Ethernet frame (and hence even non-IP packets),
-  the Slip transport can only carry IP packets.
-
-  To use this, your host must support Slip devices.
-
-  For more information, see
-  <http://user-mode-linux.sourceforge.net/networking.html>.  That site
-  has examples of the UML command line to use to enable Slip
-  networking, and details of a few quirks with it.
-
-  The Ethertap Transport is preferred over Slip because of its
-  limitation.  If you prefer Slip, however, say Y here.  Otherwise
-  choose the Multicast transport (to network multiple UMLs on 
-  multiple hosts), Ethertap (to network with the host and the
-  outside world), and/or the Daemon transport (to network multiple
-  UMLs on a single host).  You may choose more than one without
-  conflict.  If you don't need UML networking, say N.
-
-Microtek USB scanner support
-CONFIG_USB_MICROTEK
-  Say Y here if you want support for the Microtek X6USB and
-  possibly the Phantom 336CX, Phantom C6 and ScanMaker V6U(S)L.
-  Support for anything but the X6 is experimental.
-  Please report failures and successes.
-  The scanner will appear as a scsi generic device to the rest
-  of the system. Scsi support is required for this driver to compile
-  and work. SANE 1.0.4 or newer is needed to make use of your scanner.
-  This driver can be compiled as a module.
-
-HP53xx and Minolta Dual Scanner support
-CONFIG_USB_HPUSBSCSI
-  Say Y here if you want support for the HP 53xx series of scanners
-  and the Minolta Scan Dual. This driver is experimental.
-  The scanner will be accessible as a SCSI device.
-
-USB Bluetooth support
-CONFIG_USB_BLUETOOTH
-  Say Y here if you want to connect a USB Bluetooth device to your
-  computer's USB port. You will need the Bluetooth stack (available
-  at <http://developer.axis.com/software>) to fully use the device.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called bluetooth.o. If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-USB MIDI support
-CONFIG_USB_MIDI
-  Say Y here if you want to connect a USB MIDI device to your
-  computer's USB port. This driver is for devices that comply with
-  'Universal Serial Bus Device Class Definition for MIDI Device'.
-
-  The following devices are known to work:
-    * Steinberg USB2MIDI
-    * Roland MPU64
-    * Roland PC-300
-    * Roland SC8850
-    * Roland UM-1
-    * Roland UM-2
-    * Roland UA-100
-    * Yamaha MU1000
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called usb-midi.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Minix fs support
-CONFIG_MINIX_FS
-  Minix is a simple operating system used in many classes about OS's.
-  The minix file system (method to organize files on a hard disk
-  partition or a floppy disk) was the original file system for Linux,
-  but has been superseded by the second extended file system ext2fs.
-  You don't want to use the minix file system on your hard disk
-  because of certain built-in restrictions, but it is sometimes found
-  on older Linux floppy disks.  This option will enlarge your kernel
-  by about 28 KB. If unsure, say N.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>. The module
-  will be called minix.o.  Note that the file system of your root
-  partition (the one containing the directory /) cannot be compiled as
-  a module.
-
-Reiserfs support
-CONFIG_REISERFS_FS
-  Stores not just filenames but the files themselves in a balanced
-  tree.  Uses journalling.
-
-  Balanced trees are more efficient than traditional file system
-  architectural foundations.
-
-  In general, ReiserFS is as fast as ext2, but is very efficient with
-  large directories and small files.  Additional patches are needed
-  for NFS and quotas, please see <http://www.reiserfs.org/> for links.
-
-  It is more easily extended to have features currently found in
-  database and keyword search systems than block allocation based file
-  systems are.  The next version will be so extended, and will support
-  plugins consistent with our motto ``It takes more than a license to
-  make source code open.''
-
-  Read <http://www.reiserfs.org/> to learn more about reiserfs.
-
-  Sponsored by Threshold Networks, Emusic.com, and Bigstorage.com.
-
-  If you like it, you can pay us to add new features to it that you
-  need, buy a support contract, or pay us to port it to another OS.
-
-Enable extra Reiserfs consistency checks
-CONFIG_REISERFS_CHECK
-  If you set this to Y, then ReiserFS will perform every check it can
-  possibly imagine of its internal consistency throughout its
-  operation.  It will also go substantially slower.  More than once we
-  have forgotten that this was on, and then gone despondent over the
-  latest benchmarks.:-) Use of this option allows our team to go all
-  out in checking for consistency when debugging without fear of its
-  effect on end users.  If you are on the verge of sending in a bug
-  report, say Y and you might get a useful error message.  Almost
-  everyone should say N.
-
-Publish some reiserfs-specific info under /proc/fs/reiserfs
-CONFIG_REISERFS_PROC_INFO
-  Create under /proc/fs/reiserfs a hierarchy of files, displaying
-  various ReiserFS statistics and internal data at the expense of making
-  your kernel or module slightly larger (+8 KB). This also increases the
-  amount of kernel memory required for each mount by 440 bytes.
-  It isn't useful to average persons, and you probably can't measure the
-  performance cost of it.  If you are fine-tuning reiserfs, say Y,
-  otherwise say N.
-
-Second extended fs support
-CONFIG_EXT2_FS
-  This is the de facto standard Linux file system (method to organize
-  files on a storage device) for hard disks.
-
-  You want to say Y here, unless you intend to use Linux exclusively
-  from inside a DOS partition using the UMSDOS file system. The
-  advantage of the latter is that you can get away without
-  repartitioning your hard drive (which often implies backing
-  everything up and restoring afterwards); the disadvantage is that
-  Linux becomes susceptible to DOS viruses and that UMSDOS is somewhat
-  slower than ext2fs. Even if you want to run Linux in this fashion,
-  it might be a good idea to have ext2fs around: it enables you to
-  read more floppy disks and facilitates the transition to a *real*
-  Linux partition later. Another (rare) case which doesn't require
-  ext2fs is a diskless Linux box which mounts all files over the
-  network using NFS (in this case it's sufficient to say Y to "NFS
-  file system support" below). Saying Y here will enlarge your kernel
-  by about 44 KB.
-
-  The Ext2fs-Undeletion mini-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>, gives information about
-  how to retrieve deleted files on ext2fs file systems.
-
-  To change the behaviour of ext2 file systems, you can use the tune2fs
-  utility ("man tune2fs"). To modify attributes of files and
-  directories on ext2 file systems, use chattr ("man chattr").
-
-  Ext2fs partitions can be read from within DOS using the ext2tool
-  command line tool package (available from
-  <ftp://ibiblio.org/pub/Linux/system/filesystems/ext2/>) and from
-  within Windows NT using the ext2nt command line tool package from
-  <ftp://ibiblio.org/pub/Linux/utils/dos/>.  Explore2fs is a
-  graphical explorer for ext2fs partitions which runs on Windows 95
-  and Windows NT and includes experimental write support; it is
-  available from
-  <http://jnewbigin-pc.it.swin.edu.au/Linux/Explore2fs.htm>.
-
-  If you want to compile this file system as a module ( = code which
-  can be inserted in and removed from the running kernel whenever you
-  want), say M here and read <file:Documentation/modules.txt>.  The
-  module will be called ext2.o.  Be aware however that the file system
-  of your root partition (the one containing the directory /) cannot
-  be compiled as a module, and so this could be dangerous.  Most
-  everyone wants to say Y here.
-
-Ext3 journalling file system support (EXPERIMENTAL)
-CONFIG_EXT3_FS
-  This is the journalling version of the Second extended file system
-  (often called ext3), the de facto standard Linux file system
-  (method to organize files on a storage device) for hard disks.
-
-  The journalling code included in this driver means you do not have
-  to run e2fsck (file system checker) on your file systems after a
-  crash.  The journal keeps track of any changes that were being made
-  at the time the system crashed, and can ensure that your file system
-  is consistent without the need for a lengthy check.
-
-  Other than adding the journal to the file system, the on-disk format
-  of ext3 is identical to ext2.  It is possible to freely switch
-  between using the ext3 driver and the ext2 driver, as long as the
-  file system has been cleanly unmounted, or e2fsck is run on the file
-  system.
-
-  To add a journal on an existing ext2 file system or change the
-  behaviour of ext3 file systems, you can use the tune2fs utility ("man
-  tune2fs").  To modify attributes of files and directories on ext3
-  file systems, use chattr ("man chattr").  You need to be using
-  e2fsprogs version 1.20 or later in order to create ext3 journals
-  (available at <http://sourceforge.net/projects/e2fsprogs/>).
-
-  If you want to compile this file system as a module ( = code which
-  can be inserted in and removed from the running kernel whenever you
-  want), say M here and read <file:Documentation/modules.txt>.  The
-  module will be called ext3.o.  Be aware however that the file system
-  of your root partition (the one containing the directory /) cannot
-  be compiled as a module, and so this may be dangerous.
-
-Journal Block Device support (JBD for ext3) (EXPERIMENTAL)
-CONFIG_JBD
-  This is a generic journalling layer for block devices.  It is
-  currently used by the ext3 file system, but it could also be used to
-  add journal support to other file systems or block devices such as
-  RAID or LVM.
-
-  If you are using the ext3 file system, you need to say Y here. If
-  you are not using ext3 then you will probably want to say N.
-
-  If you want to compile this device as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called jbd.o.  If you are compiling ext3 into the kernel,
-  you cannot compile this code as a module.
-
-JBD (ext3) debugging support
-CONFIG_JBD_DEBUG
-  If you are using the ext3 journalling file system (or potentially any
-  other file system/device using JBD), this option allows you to
-  enable debugging output while the system is running, in order to
-  help track down any problems you are having.  By default the
-  debugging output will be turned off.
-
-  If you select Y here, then you will be able to turn on debugging
-  with "echo N > /proc/sys/fs/jbd-debug", where N is a number between
-  1 and 5, the higher the number, the more debugging output is
-  generated.  To turn debugging off again, do
-  "echo 0 > /proc/sys/fs/jbd-debug".
-
-Buffer Head tracing (DEBUG)
-CONFIG_BUFFER_DEBUG
-  If you are a kernel developer working with file systems or in the
-  block device layer, this buffer head tracing may help you to track
-  down bugs in your code.  This enables some debugging macros
-  (BUFFER_TRACE, etc.) which allow you to track the state of a buffer
-  through various layers of code.  The debugging code is used
-  primarily by ext3 and JBD code.
-
-  Because this option adds considerably to the size of each buffer,
-  most people will want to say N here.
-
-BeOS filesystem support (BeFS) (read only)
-CONFIG_BEFS_FS
-  The BeOS File System (BeFS) is the native file system of Be, Inc's
-  BeOS. Notable features include support for arbitrary attributes
-  on files and directories, and database-like indices on selected
-  attributes. (Also note that this driver doesn't make those features
-  available at this time). It is a 64 bit filesystem, so it supports
-  extremely large volumes and files.
-
-  If you use this filesystem, you should also say Y to at least one
-  of the NLS (native language support) options below.
-
-  If you don't know what this is about, say N.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt. The module will be
-  called befs.o.
-
-Debug BeFS
-CONFIG_BEFS_DEBUG
-  If you say Y here, you can use the 'debug' mount option to enable
-  debugging output from the driver. This is unlike previous versions
-  of the driver, where enabling this option would turn on debugging
-  output automatically.
-
-  Example:
-  mount -t befs /dev/hda2 /mnt -o debug
-
-BFS file system support
-CONFIG_BFS_FS
-  Boot File System (BFS) is a file system used under SCO UnixWare to
-  allow the bootloader access to the kernel image and other important
-  files during the boot process.  It is usually mounted under /stand
-  and corresponds to the slice marked as "STAND" in the UnixWare
-  partition.  You should say Y if you want to read or write the files
-  on your /stand slice from within Linux.  You then also need to say Y
-  to "UnixWare slices support", below.  More information about the BFS
-  file system is contained in the file
-  <file:Documentation/filesystems/bfs.txt>.
-
-  If you don't know what this is about, say N.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called bfs.o.  Note that the file system of your root
-  partition (the one containing the directory /) cannot be compiled as
-  a module.
-
-Compressed ROM file system support
-CONFIG_CRAMFS
-  Saying Y here includes support for CramFs (Compressed ROM File
-  System).  CramFs is designed to be a simple, small, and compressed
-  file system for ROM based embedded systems.  CramFs is read-only,
-  limited to 256MB file systems (with 16MB files), and doesn't support
-  16/32 bits uid/gid, hard links and timestamps.
-
-  See <file:Documentation/filesystems/cramfs.txt> and
-  <file:fs/cramfs/README> for further information.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called cramfs.o.  Note that the root file system (the one
-  containing the directory /) cannot be compiled as a module.
-
-  If unsure, say N.
-
-CMS file system support
-CONFIG_CMS_FS
-  Read only support for CMS minidisk file systems found on IBM
-  mainframe systems.  Only the basic format is supported so far.  If
-  you don't know what CMS is you probably don't want to know any more.
-
-# When the 2.5 version of configure.help goes away, the part of this that 
-# duplicates Documentation/filesystems/tmpfs.txt can drop out.
-Virtual memory file system support
-CONFIG_TMPFS
-  Tmpfs is a file system which keeps all files in virtual memory.
-  Everything in tmpfs is temporary in the sense that no files will be
-  created on your hard drive. If you reboot, everything in tmpfs will
-  be lost.
-
-  In contrast to RAM disks, which get allocated a fixed amount of
-  physical RAM, tmpfs grows and shrinks to accommodate the files it
-  contains and is able to swap unneeded pages out to swap space.
-
-  Everything is "virtual" in the sense that no files will be created
-  on your hard drive; if you reboot, everything in tmpfs will be
-  lost.
-
-  You should mount the file system somewhere to be able to use
-  POSIX shared memory. Adding the following line to /etc/fstab should
-  take care of things:
-
-  tmpfs                /dev/shm        tmpfs           defaults        0 0
-
-  Remember to create the directory that you intend to mount tmpfs on
-  if necessary (/dev/shm is automagically created if you use devfs).
-
-  You can set limits for the number of blocks and inodes used by the
-  file system with the mount options "size", "nr_blocks" and
-  "nr_inodes". These parameters accept a suffix k, m or g for kilo,
-  mega and giga and can be changed on remount.
-
-  The initial permissions of the root directory can be set with the
-  mount option "mode".
-
-  See <file:Documentation/filesystems/tmpfs.txt> for details.
-
-Simple RAM-based file system support
-CONFIG_RAMFS
-  Ramfs is a file system which keeps all files in RAM. It allows
-  read and write access.
-
-  It is more of an programming example than a usable file system.  If
-  you need a file system which lives in RAM with limit checking use
-  tmpfs.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called ramfs.o.
-
-ISO 9660 CD-ROM file system support
-CONFIG_ISO9660_FS
-  This is the standard file system used on CD-ROMs.  It was previously
-  known as "High Sierra File System" and is called "hsfs" on other
-  Unix systems.  The so-called Rock-Ridge extensions which allow for
-  long Unix filenames and symbolic links are also supported by this
-  driver.  If you have a CD-ROM drive and want to do more with it than
-  just listen to audio CDs and watch its LEDs, say Y (and read
-  <file:Documentation/filesystems/isofs.txt> and the CD-ROM-HOWTO,
-  available from <http://www.tldp.org/docs.html#howto>), thereby
-  enlarging your kernel by about 27 KB; otherwise say N.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called isofs.o.
-
-Microsoft Joliet CD-ROM extensions
-CONFIG_JOLIET
-  Joliet is a Microsoft extension for the ISO 9660 CD-ROM file system
-  which allows for long filenames in unicode format (unicode is the
-  new 16 bit character code, successor to ASCII, which encodes the
-  characters of almost all languages of the world; see
-  <http://www.unicode.org/> for more information).  Say Y here if you
-  want to be able to read Joliet CD-ROMs under Linux.
-
-Transparent decompression extension
-CONFIG_ZISOFS
-  This is a Linux-specific extension to RockRidge which lets you store
-  data in compressed form on a CD-ROM and have it transparently
-  decompressed when the CD-ROM is accessed.  See
-  <http://www.kernel.org/pub/linux/utils/fs/zisofs/> for the tools
-  necessary to create such a filesystem.  Say Y here if you want to be
-  able to read such compressed CD-ROMs.
-
-UDF file system support (read-only)
-CONFIG_UDF_FS
-  This is the new file system used on some CD-ROMs and DVDs. Say Y if
-  you intend to mount DVD discs or CDRW's written in packet mode, or
-  if written to by other UDF utilities, such as DirectCD. This UDF
-  file system support is read-only. If you want to write to UDF
-  file systems on some media, you need to say Y to "UDF read-write
-  support" below in addition. Please read
-  <file:Documentation/filesystems/udf.txt>.
-
-  This file system support is also available as a module ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). The module is called udf.o. If you want to
-  compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-  If unsure, say N.
-
-UDF write support (DANGEROUS)
-CONFIG_UDF_RW
-  Say Y if you want to test write support for UDF file systems.
-  Due to lack of support for writing to CDR/CDRW's, this option
-  is only supported for hard discs, DVD-RAM, and loopback files.
-
-DOS FAT fs support
-CONFIG_FAT_FS
-  If you want to use one of the FAT-based file systems (the MS-DOS,
-  VFAT (Windows 95) and UMSDOS (used to run Linux on top of an
-  ordinary DOS partition) file systems), then you must say Y or M here
-  to include FAT support. You will then be able to mount partitions or
-  diskettes with FAT-based file systems and transparently access the
-  files on them, i.e. MSDOS files will look and behave just like all
-  other Unix files.
-
-  This FAT support is not a file system in itself, it only provides
-  the foundation for the other file systems. You will have to say Y or
-  M to at least one of "MSDOS fs support" or "VFAT fs support" in
-  order to make use of it.
-
-  Another way to read and write MSDOS floppies and hard drive
-  partitions from within Linux (but not transparently) is with the
-  mtools ("man mtools") program suite. You don't need to say Y here in
-  order to do that.
-
-  If you need to move large files on floppies between a DOS and a
-  Linux box, say Y here, mount the floppy under Linux with an MSDOS
-  file system and use GNU tar's M option. GNU tar is a program
-  available for Unix and DOS ("man tar" or "info tar").
-
-  It is now also becoming possible to read and write compressed FAT
-  file systems; read <file:Documentation/filesystems/fat_cvf.txt> for
-  details.
-
-  The FAT support will enlarge your kernel by about 37 KB. If unsure,
-  say Y.
-
-  If you want to compile this as a module however ( = code which can
-  be inserted in and removed from the running kernel whenever you
-  want), say M here and read <file:Documentation/modules.txt>.  The
-  module will be called fat.o.  Note that if you compile the FAT
-  support as a module, you cannot compile any of the FAT-based file
-  systems into the kernel -- they will have to be modules as well.
-  The file system of your root partition (the one containing the
-  directory /) cannot be a module, so don't say M here if you intend
-  to use UMSDOS as your root file system.
-
-MSDOS fs support
-CONFIG_MSDOS_FS
-  This allows you to mount MSDOS partitions of your hard drive (unless
-  they are compressed; to access compressed MSDOS partitions under
-  Linux, you can either use the DOS emulator DOSEMU, described in the
-  DOSEMU-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>, or try dmsdosfs in
-  <ftp://ibiblio.org/pub/Linux/system/filesystems/dosfs/>. If you
-  intend to use dosemu with a non-compressed MSDOS partition, say Y
-  here) and MSDOS floppies. This means that file access becomes
-  transparent, i.e. the MSDOS files look and behave just like all
-  other Unix files.
-
-  If you want to use UMSDOS, the Unix-like file system on top of a
-  DOS file system, which allows you to run Linux from within a DOS
-  partition without repartitioning, you'll have to say Y or M here.
-
-  If you have Windows 95 or Windows NT installed on your MSDOS
-  partitions, you should use the VFAT file system (say Y to "VFAT fs
-  support" below), or you will not be able to see the long filenames
-  generated by Windows 95 / Windows NT.
-
-  This option will enlarge your kernel by about 7 KB. If unsure,
-  answer Y. This will only work if you said Y to "DOS FAT fs support"
-  as well. If you want to compile this as a module however ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want), say M here and read
-  <file:Documentation/modules.txt>.
-  The module will be called msdos.o.
-
-VFAT (Windows-95) fs support
-CONFIG_VFAT_FS
-  This option provides support for normal Windows file systems with
-  long filenames.  That includes non-compressed FAT-based file systems
-  used by Windows 95, Windows 98, Windows NT 4.0, and the Unix
-  programs from the mtools package.
-
-  You cannot use the VFAT file system for your Linux root partition
-  (the one containing the directory /); use UMSDOS instead if you
-  want to run Linux from within a DOS partition (i.e. say Y to
-  "Unix like fs on top of std MSDOS fs", below).
-
-  The VFAT support enlarges your kernel by about 10 KB and it only
-  works if you said Y to the "DOS FAT fs support" above.  Please read
-  the file <file:Documentation/filesystems/vfat.txt> for details.  If
-  unsure, say Y.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called vfat.o.
-
-Unix-like file system on top of standard MSDOS fs
-CONFIG_UMSDOS_FS
-  Say Y here if you want to run Linux from within an existing DOS
-  partition of your hard drive. The advantage of this is that you can
-  get away without repartitioning your hard drive (which often implies
-  backing everything up and restoring afterwards) and hence you're
-  able to quickly try out Linux or show it to your friends; the
-  disadvantage is that Linux becomes susceptible to DOS viruses and
-  that UMSDOS is somewhat slower than ext2fs.  Another use of UMSDOS
-  is to write files with long unix filenames to MSDOS floppies; it
-  also allows Unix-style soft-links and owner/permissions of files on
-  MSDOS floppies.  You will need a program called umssync in order to
-  make use of UMSDOS; read
-  <file:Documentation/filesystems/umsdos.txt>.
-
-  To get utilities for initializing/checking UMSDOS file system, or
-  latest patches and/or information, visit the UMSDOS home page at
-  <http://www.voyager.hr/~mnalis/umsdos/>.
-
-  This option enlarges your kernel by about 28 KB and it only works if
-  you said Y to both "DOS FAT fs support" and "MSDOS fs support"
-  above.  If you want to compile this as a module ( = code which can
-  be inserted in and removed from the running kernel whenever you
-  want), say M here and read <file:Documentation/modules.txt>.  The
-  module will be called umsdos.o.  Note that the file system of your
-  root partition (the one containing the directory /) cannot be a
-  module, so saying M could be dangerous.  If unsure, say N.
-
-/proc file system support
-CONFIG_PROC_FS
-  This is a virtual file system providing information about the status
-  of the system. "Virtual" means that it doesn't take up any space on
-  your hard disk: the files are created on the fly by the kernel when
-  you try to access them. Also, you cannot read the files with older
-  version of the program less: you need to use more or cat.
-
-  It's totally cool; for example, "cat /proc/interrupts" gives
-  information about what the different IRQs are used for at the moment
-  (there is a small number of Interrupt ReQuest lines in your computer
-  that are used by the attached devices to gain the CPU's attention --
-  often a source of trouble if two devices are mistakenly configured
-  to use the same IRQ). The program procinfo to display some
-  information about your system gathered from the /proc file system.
-
-  Before you can use the /proc file system, it has to be mounted,
-  meaning it has to be given a location in the directory hierarchy.
-  That location should be /proc. A command such as "mount -t proc proc
-  /proc" or the equivalent line in /etc/fstab does the job.
-
-  The /proc file system is explained in the file
-  <file:Documentation/filesystems/proc.txt> and on the proc(5) manpage
-  ("man 5 proc").
-
-  This option will enlarge your kernel by about 67 KB. Several
-  programs depend on this, so everyone should say Y here.
-
-Support for PReP Residual Data
-CONFIG_PREP_RESIDUAL
-  Some PReP systems have residual data passed to the kernel by the
-  firmware.  This allows detection of memory size, devices present and
-  other useful pieces of information.  Sometimes this information is
-  not present or incorrect.
-
-  Unless you expect to boot on a PReP system, there is no need to
-  select Y.
-
-PReP residual data available in /proc/residual
-CONFIG_PROC_PREPRESIDUAL
-  Enabling this option will create a /proc/residual file which allows
-  you to get at the residual data on PReP systems.  You will need a tool
-  (lsresidual) to parse it.  If you aren't on a PReP system, you don't
-  want this.
-
-/dev file system support
-CONFIG_DEVFS_FS
-  This is support for devfs, a virtual file system (like /proc) which
-  provides the file system interface to device drivers, normally found
-  in /dev. Devfs does not depend on major and minor number
-  allocations. Device drivers register entries in /dev which then
-  appear automatically, which means that the system administrator does
-  not have to create character and block special device files in the
-  /dev directory using the mknod command (or MAKEDEV script) anymore.
-
-  This is work in progress. If you want to use this, you *must* read
-  the material in <file:Documentation/filesystems/devfs/>, especially
-  the file README there.
-
-  If unsure, say N.
-
-Automatically mount devfs at boot time
-CONFIG_DEVFS_MOUNT
-  This option appears if you have CONFIG_DEVFS_FS enabled. Setting
-  this to 'Y' will make the kernel automatically mount devfs onto /dev
-  when the system is booted, before the init thread is started.
-  You can override this with the "devfs=nomount" boot option.
-
-  If unsure, say N.
-
-Debug devfs
-CONFIG_DEVFS_DEBUG
-  If you say Y here, then the /dev file system code will generate
-  debugging messages. See the file
-  <file:Documentation/filesystems/devfs/boot-options> for more
-  details.
-
-  If unsure, say N.
-
-NFS file system support
-CONFIG_NFS_FS
-  If you are connected to some other (usually local) Unix computer
-  (using SLIP, PLIP, PPP or Ethernet) and want to mount files residing
-  on that computer (the NFS server) using the Network File Sharing
-  protocol, say Y. "Mounting files" means that the client can access
-  the files with usual UNIX commands as if they were sitting on the
-  client's hard disk. For this to work, the server must run the
-  programs nfsd and mountd (but does not need to have NFS file system
-  support enabled in its kernel). NFS is explained in the Network
-  Administrator's Guide, available from
-  <http://www.tldp.org/docs.html#guide>, on its man page: "man
-  nfs", and in the NFS-HOWTO.
-
-  A superior but less widely used alternative to NFS is provided by
-  the Coda file system; see "Coda file system support" below.
-
-  If you say Y here, you should have said Y to TCP/IP networking also.
-  This option would enlarge your kernel by about 27 KB.
-
-  This file system is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module is called nfs.o. If you want to compile it as a module,
-  say M here and read <file:Documentation/modules.txt>.
-
-  If you are configuring a diskless machine which will mount its root
-  file system over NFS at boot time, say Y here and to "Kernel
-  level IP autoconfiguration" above and to "Root file system on NFS"
-  below. You cannot compile this driver as a module in this case.
-  There are two packages designed for booting diskless machines over
-  the net: netboot, available from
-  <http://ftp1.sourceforge.net/netboot/>, and Etherboot,
-  available from <http://ftp1.sourceforge.net/etherboot/>.
-
-  If you don't know what all this is about, say N.
-
-Provide NFSv3 client support
-CONFIG_NFS_V3
-  Say Y here if you want your NFS client to be able to speak the newer
-  version 3 of the NFS protocol.
-
-  If unsure, say N.
-
-Root file system on NFS
-CONFIG_ROOT_NFS
-  If you want your Linux box to mount its whole root file system (the
-  one containing the directory /) from some other computer over the
-  net via NFS (presumably because your box doesn't have a hard disk),
-  say Y. Read <file:Documentation/nfsroot.txt> for details. It is
-  likely that in this case, you also want to say Y to "Kernel level IP
-  autoconfiguration" so that your box can discover its network address
-  at boot time.
-
-  Most people say N here.
-
-NFS server support
-CONFIG_NFSD
-  If you want your Linux box to act as an NFS *server*, so that other
-  computers on your local network which support NFS can access certain
-  directories on your box transparently, you have two options: you can
-  use the self-contained user space program nfsd, in which case you
-  should say N here, or you can say Y and use the kernel based NFS
-  server. The advantage of the kernel based solution is that it is
-  faster.
-
-  In either case, you will need support software; the respective
-  locations are given in the file <file:Documentation/Changes> in the
-  NFS section.
-
-  If you say Y here, you will get support for version 2 of the NFS
-  protocol (NFSv2). If you also want NFSv3, say Y to the next question
-  as well.
-
-  Please read the NFS-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  The NFS server is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module is called nfsd.o.  If you want to compile it as a module,
-  say M here and read <file:Documentation/modules.txt>.  If unsure,
-  say N.
-
-Provide NFSv3 server support
-CONFIG_NFSD_V3
-  If you would like to include the NFSv3 server as well as the NFSv2
-  server, say Y here.  If unsure, say Y.
-
-Provide NFS over TCP server support EXPERIMENTAL
-CONFIG_NFSD_TCP
-  Enable NFS service over TCP connections.  This the officially
-  still experimental, but seems to work well.
-
-OS/2 HPFS file system support
-CONFIG_HPFS_FS
-  OS/2 is IBM's operating system for PC's, the same as Warp, and HPFS
-  is the file system used for organizing files on OS/2 hard disk
-  partitions. Say Y if you want to be able to read files from and
-  write files to an OS/2 HPFS partition on your hard drive. OS/2
-  floppies however are in regular MSDOS format, so you don't need this
-  option in order to be able to read them. Read
-  <file:Documentation/filesystems/hpfs.txt>.
-
-  This file system is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module is called hpfs.o.  If you want to compile it as a module,
-  say M here and read <file:Documentation/modules.txt>.  If unsure,
-  say N.
-
-NTFS file system support (read-only)
-CONFIG_NTFS_FS
-  NTFS is the file system of Microsoft Windows NT. Say Y if you want
-  to get read access to files on NTFS partitions of your hard drive.
-  The Linux NTFS driver supports most of the mount options of the VFAT
-  driver, see <file:Documentation/filesystems/ntfs.txt>. Saying Y here
-  will give you read-only access to NTFS partitions.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ntfs.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-NTFS write support (DANGEROUS)
-CONFIG_NTFS_RW
-  If you say Y here, you will (maybe) be able to write to NTFS file
-  systems as well as read from them. The read-write support in NTFS
-  is far from being complete and is not well tested. If you say Y
-  here, back up your NTFS volume first, since it will probably get
-  damaged. Also, download the Linux-NTFS project distribution from
-  Sourceforge at <http://linux-ntfs.sf.net/> and always run the
-  included ntfsfix utility after writing to an NTFS partition from
-  Linux to fix some of the damage done by the driver. You should run
-  ntfsfix _after_ unmounting the partition in Linux but _before_
-  rebooting into Windows. When Windows next boots, chkdsk will be
-  run automatically to fix the remaining damage.
-  Please note that write support is limited to Windows NT4 and
-  earlier versions.
-
-  If unsure, say N.
-
-System V/Xenix/V7/Coherent file system support
-CONFIG_SYSV_FS
-  SCO, Xenix and Coherent are commercial Unix systems for Intel
-  machines, and Version 7 was used on the DEC PDP-11. Saying Y
-  here would allow you to read from their floppies and hard disk
-  partitions.
-
-  If you have floppies or hard disk partitions like that, it is likely
-  that they contain binaries from those other Unix systems; in order
-  to run these binaries, you will want to install linux-abi which is a
-  a set of kernel modules that lets you run SCO, Xenix, Wyse,
-  UnixWare, Dell Unix and System V programs under Linux.  It is
-  available via FTP (user: ftp) from
-  <ftp://ftp.openlinux.org/pub/people/hch/linux-abi/>).
-  NOTE: that will work only for binaries from Intel-based systems;
-  PDP ones will have to wait until somebody ports Linux to -11 ;-)
-
-  If you only intend to mount files from some other Unix over the
-  network using NFS, you don't need the System V file system support
-  (but you need NFS file system support obviously).
-
-  Note that this option is generally not needed for floppies, since a
-  good portable way to transport files and directories between unixes
-  (and even other operating systems) is given by the tar program ("man
-  tar" or preferably "info tar").  Note also that this option has
-  nothing whatsoever to do with the option "System V IPC". Read about
-  the System V file system in
-  <file:Documentation/filesystems/sysv-fs.txt>.
-  Saying Y here will enlarge your kernel by about 27 KB.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called sysv.o.
-
-  If you haven't heard about all of this before, it's safe to say N.
-
-Amiga FFS file system support
-CONFIG_AFFS_FS
-  The Fast File System (FFS) is the common file system used on hard
-  disks by Amiga(tm) systems since AmigaOS Version 1.3 (34.20).  Say Y
-  if you want to be able to read and write files from and to an Amiga
-  FFS partition on your hard drive.  Amiga floppies however cannot be
-  read with this driver due to an incompatibility of the floppy
-  controller used in an Amiga and the standard floppy controller in
-  PCs and workstations. Read <file:Documentation/filesystems/affs.txt>
-  and <file:fs/affs/Changes>.
-
-  With this driver you can also mount disk files used by Bernd
-  Schmidt's Un*X Amiga Emulator
-  (<http://www.freiburg.linux.de/~uae/>).
-  If you want to do this, you will also need to say Y or M to "Loop
-  device support", above.
-
-  This file system is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module is called affs.o.  If you want to compile it as a module,
-  say M here and read <file:Documentation/modules.txt>.  If unsure,
-  say N.
-
-Apple Macintosh file system support
-CONFIG_HFS_FS
-  If you say Y here, you will be able to mount Macintosh-formatted
-  floppy disks and hard drive partitions with full read-write access.
-  Please read <file:fs/hfs/HFS.txt> to learn about the available mount
-  options.
-
-  This file system support is also available as a module ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). The module is called hfs.o.  If you want to
-  compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-ROM file system support
-CONFIG_ROMFS_FS
-  This is a very small read-only file system mainly intended for
-  initial ram disks of installation disks, but it could be used for
-  other read-only media as well.  Read
-  <file:Documentation/filesystems/romfs.txt> for details.
-
-  This file system support is also available as a module ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). The module is called romfs.o.  If you want to
-  compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  Note that the file system of your
-  root partition (the one containing the directory /) cannot be a
-  module.
-
-  If you don't know whether you need it, then you don't need it:
-  answer N.
-
-QNX4 file system support (read only)
-CONFIG_QNX4FS_FS
-  This is the file system used by the real-time operating systems
-  QNX 4 and QNX 6 (the latter is also called QNX RTP).
-  Further information is available at <http://www.qnx.com/>.
-  Say Y if you intend to mount QNX hard disks or floppies.
-  Unless you say Y to "QNX4FS read-write support" below, you will
-  only be able to read these file systems.
-
-  This file system support is also available as a module ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). The module is called qnx4.o. If you want to
-  compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-  If you don't know whether you need it, then you don't need it:
-  answer N.
-
-QNX4FS write support (DANGEROUS)
-CONFIG_QNX4FS_RW
-  Say Y if you want to test write support for QNX4 file systems.
-
-  It's currently broken, so for now:
-  answer N.
-
-Kernel automounter support
-CONFIG_AUTOFS_FS
-  The automounter is a tool to automatically mount remote file systems
-  on demand. This implementation is partially kernel-based to reduce
-  overhead in the already-mounted case; this is unlike the BSD
-  automounter (amd), which is a pure user space daemon.
-
-  To use the automounter you need the user-space tools from the autofs
-  package; you can find the location in <file:Documentation/Changes>.
-  You also want to answer Y to "NFS file system support", below.
-
-  If you want to use the newer version of the automounter with more
-  features, say N here and say Y to "Kernel automounter v4 support",
-  below.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called autofs.o.
-
-  If you are not a part of a fairly large, distributed network, you
-  probably do not need an automounter, and can say N here.
-
-Kernel automounter version 4 support (also supports v3)
-CONFIG_AUTOFS4_FS
-  The automounter is a tool to automatically mount remote file systems
-  on demand. This implementation is partially kernel-based to reduce
-  overhead in the already-mounted case; this is unlike the BSD
-  automounter (amd), which is a pure user space daemon.
-
-  To use the automounter you need the user-space tools from
-  <ftp://ftp.kernel.org/pub/linux/daemons/autofs/testing-v4/>; you also
-  want to answer Y to "NFS file system support", below.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called autofs4.o.  You will need to add "alias autofs
-  autofs4" to your modules configuration file.
-
-  If you are not a part of a fairly large, distributed network or
-  don't have a laptop which needs to dynamically reconfigure to the
-  local network, you probably do not need an automounter, and can say
-  N here.
-
-EFS file system support (read-only)
-CONFIG_EFS_FS
-  EFS is an older file system used for non-ISO9660 CD-ROMs and hard
-  disk partitions by SGI's IRIX operating system (IRIX 6.0 and newer
-  uses the XFS file system for hard disk partitions however).
-
-  This implementation only offers read-only access. If you don't know
-  what all this is about, it's safe to say N. For more information
-  about EFS see its home page at <http://aeschi.ch.eu.org/efs/>.
-
-  If you want to compile the EFS file system support as a module ( =
-  code which can be inserted in and removed from the running kernel
-  whenever you want), say M here and read
-  <file:Documentation/modules.txt>. The module will be called efs.o.
-
-Journalling Flash File System (JFFS) support
-CONFIG_JFFS_FS
-  JFFS is the Journalling Flash File System developed by Axis
-  Communications in Sweden, aimed at providing a crash/powerdown-safe
-  file system for disk-less embedded devices. Further information is
-  available at (<http://developer.axis.com/software/jffs/>).
-
-JFFS debugging verbosity (0 = quiet, 3 = noisy)
-CONFIG_JFFS_FS_VERBOSE
-  Determines the verbosity level of the JFFS debugging messages.
-
-Journalling Flash File System v2 (JFFS2) support
-CONFIG_JFFS2_FS
-  JFFS2 is the second generation of the Journalling Flash File System
-  for use on diskless embedded devices. It provides improved wear
-  levelling, compression and support for hard links. You cannot use
-  this on normal block devices, only on 'MTD' devices.
-
-  Further information should be made available soon at
-  <http://sources.redhat.com/jffs2/>.
-
-JFFS2 debugging verbosity (0 = quiet, 2 = noisy)
-CONFIG_JFFS2_FS_DEBUG
-  This controls the amount of debugging messages produced by the JFFS2
-  code. Set it to zero for use in production systems. For evaluation,
-  testing and debugging, it's advisable to set it to one. This will
-  enable a few assertions and will print debugging messages at the
-  KERN_DEBUG loglevel, where they won't normally be visible. Level 2
-  is unlikely to be useful - it enables extra debugging in certain
-  areas which at one point needed debugging, but when the bugs were
-  located and fixed, the detailed messages were relegated to level 2.
-
-  If reporting bugs, please try to have available a full dump of the
-  messages at debug level 1 while the misbehaviour was occurring.
-
-JFFS stats available in /proc filesystem
-CONFIG_JFFS_PROC_FS
-  Enabling this option will cause statistics from mounted JFFS file systems
-  to be made available to the user in the /proc/fs/jffs/ directory.
-
-UFS file system support (read-only)
-CONFIG_UFS_FS
-  BSD and derivate versions of Unix (such as SunOS, FreeBSD, NetBSD,
-  OpenBSD and NeXTstep) use a file system called UFS. Some System V
-  Unixes can create and mount hard disk partitions and diskettes using
-  this file system as well. Saying Y here will allow you to read from
-  these partitions; if you also want to write to them, say Y to the
-  experimental "UFS file system write support", below. Please read the
-  file <file:Documentation/filesystems/ufs.txt> for more information.
-
-  If you only intend to mount files from some other Unix over the
-  network using NFS, you don't need the UFS file system support (but
-  you need NFS file system support obviously).
-
-  Note that this option is generally not needed for floppies, since a
-  good portable way to transport files and directories between unixes
-  (and even other operating systems) is given by the tar program ("man
-  tar" or preferably "info tar").
-
-  When accessing NeXTstep files, you may need to convert them from the
-  NeXT character set to the Latin1 character set; use the program
-  recode ("info recode") for this purpose.
-
-  If you want to compile the UFS file system support as a module ( =
-  code which can be inserted in and removed from the running kernel
-  whenever you want), say M here and read
-  <file:Documentation/modules.txt>. The module will be called ufs.o.
-
-  If you haven't heard about all of this before, it's safe to say N.
-
-UFS file system write support (DANGEROUS)
-CONFIG_UFS_FS_WRITE
-  Say Y here if you want to try writing to UFS partitions. This is
-  experimental, so you should back up your UFS partitions beforehand.
-
-Advanced partition selection
-CONFIG_PARTITION_ADVANCED
-  Say Y here if you would like to use hard disks under Linux which
-  were partitioned under an operating system running on a different
-  architecture than your Linux system.
-
-  Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause the configurator to skip all
-  the questions about foreign partitioning schemes.
-
-  If unsure, say N.
-
-Acorn partition support
-CONFIG_ACORN_PARTITION
-  Support hard disks partitioned under Acorn operating systems.
-
-Xeno partition support
-CONFIG_XENO_PARTITION
-  Support Xeno-style partitions on physical disks.  The Xen
-  hypervisor can export partitions on a physical disk to clients,
-  but access to the partition table requires special hackery.
-  This will be used if this option is enabled; otherwise, 
-  it will be possible to access exported partitions by sector
-  number but not with useful names e.g. /dev/hda4.
-
-  If unsure, say Y.
-
-Native filecore partition support
-CONFIG_ACORN_PARTITION_ADFS
-  The Acorn Disc Filing System is the standard file system of the
-  RiscOS operating system which runs on Acorn's ARM-based Risc PC
-  systems and the Acorn Archimedes range of machines.  If you say
-  `Y' here, Linux will support disk partitions created under ADFS.
-
-PowerTec partition support
-CONFIG_ACORN_PARTITION_POWERTEC
-  Support reading partition tables created on Acorn machines using
-  the PowerTec SCSI drive.
-
-RISCiX partition support
-CONFIG_ACORN_PARTITION_RISCIX
-  Once upon a time, there was a native Unix port for the Acorn series
-  of machines called RISCiX.  If you say 'Y' here, Linux will be able
-  to read disks partitioned under RISCiX.
-
-ICS partition support
-CONFIG_ACORN_PARTITION_ICS
-  Say Y here if you would like to use hard disks under Linux which
-  were partitioned using the ICS interface on Acorn machines.
-
-Alpha OSF partition support
-CONFIG_OSF_PARTITION
-  Say Y here if you would like to use hard disks under Linux which
-  were partitioned on an Alpha machine.
-
-Macintosh partition map support
-CONFIG_MAC_PARTITION
-  Say Y here if you would like to use hard disks under Linux which
-  were partitioned on a Macintosh.
-
-Windows Logical Disk Manager (Dynamic Disk) support (EXPERIMENTAL)
-CONFIG_LDM_PARTITION
-  Say Y here if you would like to use hard disks under Linux which
-  were partitioned using Windows 2000's or XP's Logical Disk Manager.
-  They are also known as "Dynamic Disks".
-
-  Windows 2000 introduced the concept of Dynamic Disks to get around
-  the limitations of the PC's partitioning scheme.  The Logical Disk
-  Manager allows the user to repartition a disk and create spanned,
-  mirrored, striped or RAID volumes, all without the need for
-  rebooting.
-
-  Normal partitions are now called Basic Disks under Windows 2000 and
-  XP.
-
-  Technical documentation to accompany this driver is available from:
-  <http://linux-ntfs.sf.net/ldm/>.
-
-  If unsure, say N.
-
-Windows LDM extra logging
-CONFIG_LDM_DEBUG
-  Say Y here if you would like LDM to log verbosely.  This could be
-  helpful if the driver doesn't work as expected and you'd like to
-  report a bug.
-
-  If unsure, say N.
-
-PC BIOS (MSDOS partition tables) support
-CONFIG_MSDOS_PARTITION
-  Say Y here if you would like to use hard disks under Linux which
-  were partitioned on an x86 PC (not necessarily by DOS).
-
-Amiga partition table support
-CONFIG_AMIGA_PARTITION
-  Say Y here if you would like to use hard disks under Linux which
-  were partitioned under AmigaOS.
-
-Atari partition table support
-CONFIG_ATARI_PARTITION
-  Say Y here if you would like to use hard disks under Linux which
-  were partitioned under the Atari OS.
-
-BSD disklabel (FreeBSD partition tables) support
-CONFIG_BSD_DISKLABEL
-  FreeBSD uses its own hard disk partition scheme on your PC. It
-  requires only one entry in the primary partition table of your disk
-  and manages it similarly to DOS extended partitions, putting in its
-  first sector a new partition table in BSD disklabel format. Saying Y
-  here allows you to read these disklabels and further mount FreeBSD
-  partitions from within Linux if you have also said Y to "UFS
-  file system support", above. If you don't know what all this is
-  about, say N.
-
-Minix subpartition support
-CONFIG_MINIX_SUBPARTITION
-  Minix 2.0.0/2.0.2 subpartition table support for Linux.
-  Say Y here if you want to mount and use Minix 2.0.0/2.0.2
-  subpartitions.
-
-Sun partition table support
-CONFIG_SUN_PARTITION
-  Like most systems, SunOS uses its own hard disk partition table
-  format, incompatible with all others. Saying Y here allows you to
-  read these partition tables and further mount SunOS partitions from
-  within Linux if you have also said Y to "UFS file system support",
-  above. This is mainly used to carry data from a SPARC under SunOS to
-  your Linux box via a removable medium like magneto-optical or ZIP
-  drives; note however that a good portable way to transport files and
-  directories between unixes (and even other operating systems) is
-  given by the tar program ("man tar" or preferably "info tar"). If
-  you don't know what all this is about, say N.
-
-Solaris (x86) partition table support
-CONFIG_SOLARIS_X86_PARTITION
-  Like most systems, Solaris x86 uses its own hard disk partition
-  table format, incompatible with all others. Saying Y here allows you
-  to read these partition tables and further mount Solaris x86
-  partitions from within Linux if you have also said Y to "UFS
-  file system support", above.
-
-SGI partition support
-CONFIG_SGI_PARTITION
-  Say Y here if you would like to be able to read the hard disk
-  partition table format used by SGI machines.
-
-Intel EFI GUID partition support
-CONFIG_EFI_PARTITION
-  Say Y here if you would like to use hard disks under Linux which
-  were partitioned using EFI GPT.  Presently only useful on the
-  IA-64 platform.
-
-Ultrix partition table support
-CONFIG_ULTRIX_PARTITION
-  Say Y here if you would like to be able to read the hard disk
-  partition table format used by DEC (now Compaq) Ultrix machines.
-  Otherwise, say N.
-
-IBM disk label and partition support
-CONFIG_IBM_PARTITION
-  You have to say Y here if you would like to be able to read volume 
-  labels of IBM DASD disks. These can be ECKD DASD disks with 
-  compatible disk layout (cdl) and standard Linux disk layout (ldl), 
-  FBA DASD disks and CMS reserved minidisks.
-  Otherwise, say N and you will not be able to access these disks.
-
-ADFS file system support
-CONFIG_ADFS_FS
-  The Acorn Disc Filing System is the standard file system of the
-  RiscOS operating system which runs on Acorn's ARM-based Risc PC
-  systems and the Acorn Archimedes range of machines. If you say Y
-  here, Linux will be able to read from ADFS partitions on hard drives
-  and from ADFS-formatted floppy discs. If you also want to be able to
-  write to those devices, say Y to "ADFS write support" below.
-
-  The ADFS partition should be the first partition (i.e.,
-  /dev/[hs]d?1) on each of your drives. Please read the file
-  <file:Documentation/filesystems/adfs.txt> for further details.
-
-  This code is also available as a module called adfs.o ( = code which
-  can be inserted in and removed from the running kernel whenever you
-  want). If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-  If unsure, say N.
-
-ADFS write support (DANGEROUS)
-CONFIG_ADFS_FS_RW
-  If you say Y here, you will be able to write to ADFS partitions on
-  hard drives and ADFS-formatted floppy disks. This is experimental
-  codes, so if you're unsure, say N.
-
-JFS filesystem support
-CONFIG_JFS_FS
-  This is a port of IBM's Journalling Filesystem .  More information is
-  available in the file Documentation/filesystems/jfs.txt.
-
-  If you do not intend to use the JFS filesystem, say N.
-
-JFS Debugging
-CONFIG_JFS_DEBUG
-  If you are experiencing any problems with the JFS filesystem, say
-  Y here.  This will result in additional debugging messages to be
-  written to the system log.  Under normal circumstances, this
-  results in very little overhead.
-
-JFS Statistics
-CONFIG_JFS_STATISTICS
-  Enabling this option will cause statistics from the JFS file system
-  to be made available to the user in the /proc/fs/jfs/ directory.
-
-/dev/pts file system for Unix98 PTYs
-CONFIG_DEVPTS_FS
-  You should say Y here if you said Y to "Unix98 PTY support" above.
-  You'll then get a virtual file system which can be mounted on
-  /dev/pts with "mount -t devpts". This, together with the pseudo
-  terminal master multiplexer /dev/ptmx, is used for pseudo terminal
-  support as described in The Open Group's Unix98 standard: in order
-  to acquire a pseudo terminal, a process opens /dev/ptmx; the number
-  of the pseudo terminal is then made available to the process and the
-  pseudo terminal slave can be accessed as /dev/pts/<number>. What was
-  traditionally /dev/ttyp2 will then be /dev/pts/2, for example.
-
-  The GNU C library glibc 2.1 contains the requisite support for this
-  mode of operation; you also need client programs that use the Unix98
-  API. Please read <file:Documentation/Changes> for more information
-  about the Unix98 pty devices.
-
-  Note that the experimental "/dev file system support"
-  (CONFIG_DEVFS_FS)  is a more general facility.
-
-FreeVxFS file system support (VERITAS VxFS(TM) compatible)
-CONFIG_VXFS_FS
-  FreeVxFS is a file system driver that support the VERITAS VxFS(TM)
-  file system format.  VERITAS VxFS(TM) is the standard file system
-  of SCO UnixWare (and possibly others) and optionally available
-  for Sunsoft Solaris, HP-UX and many other operating systems.
-  Currently only readonly access is supported.
-
-  NOTE: the file system type as used by mount(1), mount(2) and
-        fstab(5) is 'vxfs' as it describes the file system format, not
-        the actual driver.
-
-  This file system is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module is called freevxfs.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.  If
-  unsure, say N. 
-
-UnixWare slices support
-CONFIG_UNIXWARE_DISKLABEL
-  Like some systems, UnixWare uses its own slice table inside a
-  partition (VTOC - Virtual Table of Contents). Its format is
-  incompatible with all other OSes. Saying Y here allows you to read
-  VTOC and further mount UnixWare partitions read-only from within
-  Linux if you have also said Y to "UFS file system support" or
-  "System V and Coherent file system support", above.
-
-  This is mainly used to carry data from a UnixWare box to your
-  Linux box via a removable medium like magneto-optical, ZIP or
-  removable IDE drives. Note, however, that a good portable way to
-  transport files and directories between unixes (and even other
-  operating systems) is given by the tar program ("man tar" or
-  preferably "info tar").
-
-  If you don't know what all this is about, say N.
-
-SMB file system support (to mount Windows shares etc.)
-CONFIG_SMB_FS
-  SMB (Server Message Block) is the protocol Windows for Workgroups
-  (WfW), Windows 95/98, Windows NT and OS/2 Lan Manager use to share
-  files and printers over local networks.  Saying Y here allows you to
-  mount their file systems (often called "shares" in this context) and
-  access them just like any other Unix directory.  Currently, this
-  works only if the Windows machines use TCP/IP as the underlying
-  transport protocol, and not NetBEUI.  For details, read
-  <file:Documentation/filesystems/smbfs.txt> and the SMB-HOWTO,
-  available from <http://www.tldp.org/docs.html#howto>.
-
-  Note: if you just want your box to act as an SMB *server* and make
-  files and printing services available to Windows clients (which need
-  to have a TCP/IP stack), you don't need to say Y here; you can use
-  the program SAMBA (available from <ftp://ftp.samba.org/pub/samba/>)
-  for that.
-
-  General information about how to connect Linux, Windows machines and
-  Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>.
-
-  If you want to compile the SMB support as a module ( = code which
-  can be inserted in and removed from the running kernel whenever you
-  want), say M here and read <file:Documentation/modules.txt>.  The
-  module will be called smbfs.o.  Most people say N, however.
-
-Use a default NLS
-CONFIG_SMB_NLS_DEFAULT
-  Enabling this will make smbfs use nls translations by default. You
-  need to specify the local charset (CONFIG_NLS_DEFAULT) in the nls
-  settings and you need to give the default nls for the SMB server as
-  CONFIG_SMB_NLS_REMOTE.
-
-  The nls settings can be changed at mount time, if your smbmount
-  supports that, using the codepage and iocharset parameters.
-
-  smbmount from samba 2.2.0 or later supports this.
-
-Default Remote NLS Option
-CONFIG_SMB_NLS_REMOTE
-  This setting allows you to specify a default value for which
-  codepage the server uses. If this field is left blank no
-  translations will be done by default. The local codepage/charset
-  default to CONFIG_NLS_DEFAULT.
-
-  The nls settings can be changed at mount time, if your smbmount
-  supports that, using the codepage and iocharset parameters.
-
-  smbmount from samba 2.2.0 or later supports this.
-
-Coda file system support (advanced network fs)
-CONFIG_CODA_FS
-  Coda is an advanced network file system, similar to NFS in that it
-  enables you to mount file systems of a remote server and access them
-  with regular Unix commands as if they were sitting on your hard
-  disk.  Coda has several advantages over NFS: support for
-  disconnected operation (e.g. for laptops), read/write server
-  replication, security model for authentication and encryption,
-  persistent client caches and write back caching.
-
-  If you say Y here, your Linux box will be able to act as a Coda
-  *client*.  You will need user level code as well, both for the
-  client and server.  Servers are currently user level, i.e. they need
-  no kernel support.  Please read
-  <file:Documentation/filesystems/coda.txt> and check out the Coda
-  home page <http://www.coda.cs.cmu.edu/>.
-
-  If you want to compile the coda client support as a module ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want), say M here and read
-  <file:Documentation/modules.txt>.  The module will be called coda.o.
-
-InterMezzo file system support (replicating fs)
-CONFIG_INTERMEZZO_FS
-  InterMezzo is a networked file system with disconnected operation
-  and kernel level write back caching.  It is most often used for
-  replicating potentially large trees or keeping laptop/desktop copies
-  in sync.
-
-  If you say Y or M your kernel or module will provide InterMezzo
-  support.  You will also need a file server daemon, which you can get
-  from <http://www.inter-mezzo.org/>.
-
-NCP file system support (to mount NetWare volumes)
-CONFIG_NCP_FS
-  NCP (NetWare Core Protocol) is a protocol that runs over IPX and is
-  used by Novell NetWare clients to talk to file servers.  It is to
-  IPX what NFS is to TCP/IP, if that helps.  Saying Y here allows you
-  to mount NetWare file server volumes and to access them just like
-  any other Unix directory.  For details, please read the file
-  <file:Documentation/filesystems/ncpfs.txt> in the kernel source and
-  the IPX-HOWTO from <http://www.tldp.org/docs.html#howto>.
-
-  You do not have to say Y here if you want your Linux box to act as a
-  file *server* for Novell NetWare clients.
-
-  General information about how to connect Linux, Windows machines and
-  Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called ncpfs.o.  Say N unless you are connected to a Novell
-  network.
-
-Packet signatures
-CONFIG_NCPFS_PACKET_SIGNING
-  NCP allows packets to be signed for stronger security. If you want
-  security, say Y.  Normal users can leave it off.  To be able to use
-  packet signing you must use ncpfs > 2.0.12.
-
-Proprietary file locking
-CONFIG_NCPFS_IOCTL_LOCKING
-  Allows locking of records on remote volumes.  Say N unless you have
-  special applications which are able to utilize this locking scheme.
-
-Clear remove/delete inhibit when needed
-CONFIG_NCPFS_STRONG
-  Allows manipulation of files flagged as Delete or Rename Inhibit.
-  To use this feature you must mount volumes with the ncpmount
-  parameter "-s" (ncpfs-2.0.12 and newer).  Say Y unless you are not
-  mounting volumes with -f 444.
-
-Use NFS namespace if available
-CONFIG_NCPFS_NFS_NS
-  Allows you to utilize NFS namespace on NetWare servers.  It brings
-  you case sensitive filenames.  Say Y.  You can disable it at
-  mount-time with the `-N nfs' parameter of ncpmount.
-
-Use LONG (OS/2) namespace if available
-CONFIG_NCPFS_OS2_NS
-  Allows you to utilize OS2/LONG namespace on NetWare servers.
-  Filenames in this namespace are limited to 255 characters, they are
-  case insensitive, and case in names is preserved.  Say Y.  You can
-  disable it at mount time with the -N os2 parameter of ncpmount.
-
-Lowercase DOS filenames on LONG namespace volume
-CONFIG_NCPFS_SMALLDOS
-  If you say Y here, every filename on a NetWare server volume using
-  the OS2/LONG namespace and created under DOS or on a volume using
-  DOS namespace will be converted to lowercase characters.
-  Saying N here will give you these filenames in uppercase.
-
-  This is only a cosmetic option since the OS2/LONG namespace is case
-  insensitive. The only major reason for this option is backward
-  compatibility when moving from DOS to OS2/LONG namespace support.
-  Long filenames (created by Win95) will not be affected.
-
-  This option does not solve the problem that filenames appear
-  differently under Linux and under Windows, since Windows does an
-  additional conversions on the client side. You can achieve similar
-  effects by saying Y to "Allow using of Native Language Support"
-  below.
-
-Use Native Language Support
-CONFIG_NCPFS_NLS
-  Allows you to use codepages and I/O charsets for file name
-  translation between the server file system and input/output. This
-  may be useful, if you want to access the server with other operating
-  systems, e.g. Windows 95. See also NLS for more Information.
-
-  To select codepages and I/O charsets use ncpfs-2.2.0.13 or newer.
-
-Symbolic links and mode permission bits
-CONFIG_NCPFS_EXTRAS
-  This enables the use of symbolic links and an execute permission
-  bit on NCPFS. The file server need not have long name space or NFS
-  name space loaded for these to work.
-
-  To use the new attributes, it is recommended to use the flags
-  '-f 600 -d 755' on the ncpmount command line.
-
-Default NLS Option
-CONFIG_NLS_DEFAULT
-  The default NLS used when mounting file system. Note, that this is
-  the NLS used by your console, not the NLS used by a specific file
-  system (if different) to store data (filenames) on a disk.
-  Currently, the valid values are:
-  big5, cp437, cp737, cp775, cp850, cp852, cp855, cp857, cp860, cp861,
-  cp862, cp863, cp864, cp865, cp866, cp869, cp874, cp932, cp936,
-  cp949, cp950, cp1250, cp1251, cp1255, euc-jp, euc-kr, gb2312, iso8859-1,
-  iso8859-2, iso8859-3, iso8859-4, iso8859-5, iso8859-6, iso8859-7,
-  iso8859-8, iso8859-9, iso8859-13, iso8859-14, iso8859-15,
-  koi8-r, koi8-ru, koi8-u, sjis, tis-620, utf8.
-  If you specify a wrong value, it will use the built-in NLS;
-  compatible with iso8859-1.
-
-  If unsure, specify it as "iso8859-1".
-
-Codepage 437 (United States, Canada)
-CONFIG_NLS_CODEPAGE_437
-  The Microsoft FAT file system family can deal with filenames in
-  native language character sets. These character sets are stored
-  in so-called DOS codepages. You need to include the appropriate
-  codepage if you want to be able to read/write these filenames on
-  DOS/Windows partitions correctly. This does apply to the filenames
-  only, not to the file contents. You can include several codepages;
-  say Y here if you want to include the DOS codepage that is used in
-  the United States and parts of Canada. This is recommended.
-
-Codepage 737 (Greek)
-CONFIG_NLS_CODEPAGE_737
-  The Microsoft FAT file system family can deal with filenames in
-  native language character sets. These character sets are stored
-  in so-called DOS codepages. You need to include the appropriate
-  codepage if you want to be able to read/write these filenames on
-  DOS/Windows partitions correctly. This does apply to the filenames
-  only, not to the file contents. You can include several codepages;
-  say Y here if you want to include the DOS codepage that is used for
-  Greek. If unsure, say N.
-
-Codepage 775 (Baltic Rim)
-CONFIG_NLS_CODEPAGE_775
-  The Microsoft FAT file system family can deal with filenames in
-  native language character sets. These character sets are stored
-  in so-called DOS codepages. You need to include the appropriate
-  codepage if you want to be able to read/write these filenames on
-  DOS/Windows partitions correctly. This does apply to the filenames
-  only, not to the file contents. You can include several codepages;
-  say Y here if you want to include the DOS codepage that is used
-  for the Baltic Rim Languages (Latvian and Lithuanian). If unsure,
-  say N.
-
-Codepage 850 (Europe)
-CONFIG_NLS_CODEPAGE_850
-  The Microsoft FAT file system family can deal with filenames in
-  native language character sets. These character sets are stored in
-  so-called DOS codepages. You need to include the appropriate
-  codepage if you want to be able to read/write these filenames on
-  DOS/Windows partitions correctly. This does apply to the filenames
-  only, not to the file contents. You can include several codepages;
-  say Y here if you want to include the DOS codepage that is used for
-  much of Europe -- United Kingdom, Germany, Spain, Italy, and [add
-  more countries here]. It has some characters useful to many European
-  languages that are not part of the US codepage 437.
-
-  If unsure, say Y.
-
-Codepage 852 (Central/Eastern Europe)
-CONFIG_NLS_CODEPAGE_852
-  The Microsoft FAT file system family can deal with filenames in
-  native language character sets. These character sets are stored in
-  so-called DOS codepages. You need to include the appropriate
-  codepage if you want to be able to read/write these filenames on
-  DOS/Windows partitions correctly. This does apply to the filenames
-  only, not to the file contents. You can include several codepages;
-  say Y here if you want to include the Latin 2 codepage used by DOS
-  for much of Central and Eastern Europe. It has all the required
-  characters for these languages: Albanian, Croatian, Czech, English,
-  Finnish, Hungarian, Irish, German, Polish, Rumanian, Serbian (Latin
-  transcription), Slovak, Slovenian, and Serbian.
-
-Codepage 855 (Cyrillic)
-CONFIG_NLS_CODEPAGE_855
-  The Microsoft FAT file system family can deal with filenames in
-  native language character sets. These character sets are stored in
-  so-called DOS codepages. You need to include the appropriate
-  codepage if you want to be able to read/write these filenames on
-  DOS/Windows partitions correctly. This does apply to the filenames
-  only, not to the file contents. You can include several codepages;
-  say Y here if you want to include the DOS codepage for Cyrillic.
-
-Codepage 857 (Turkish)
-CONFIG_NLS_CODEPAGE_857
-  The Microsoft FAT file system family can deal with filenames in
-  native language character sets. These character sets are stored in
-  so-called DOS codepages. You need to include the appropriate
-  codepage if you want to be able to read/write these filenames on
-  DOS/Windows partitions correctly. This does apply to the filenames
-  only, not to the file contents. You can include several codepages;
-  say Y here if you want to include the DOS codepage for Turkish.
-
-Codepage 860 (Portuguese)
-CONFIG_NLS_CODEPAGE_860
-  The Microsoft FAT file system family can deal with filenames in
-  native language character sets. These character sets are stored in
-  so-called DOS codepages. You need to include the appropriate
-  codepage if you want to be able to read/write these filenames on
-  DOS/Windows partitions correctly. This does apply to the filenames
-  only, not to the file contents. You can include several codepages;
-  say Y here if you want to include the DOS codepage for Portuguese.
-
-Codepage 861 (Icelandic)
-CONFIG_NLS_CODEPAGE_861
-  The Microsoft FAT file system family can deal with filenames in
-  native language character sets. These character sets are stored in
-  so-called DOS codepages. You need to include the appropriate
-  codepage if you want to be able to read/write these filenames on
-  DOS/Windows partitions correctly. This does apply to the filenames
-  only, not to the file contents. You can include several codepages;
-  say Y here if you want to include the DOS codepage for Icelandic.
-
-Codepage 862 (Hebrew)
-CONFIG_NLS_CODEPAGE_862
-  The Microsoft FAT file system family can deal with filenames in
-  native language character sets. These character sets are stored in
-  so-called DOS codepages. You need to include the appropriate
-  codepage if you want to be able to read/write these filenames on
-  DOS/Windows partitions correctly. This does apply to the filenames
-  only, not to the file contents. You can include several codepages;
-  say Y here if you want to include the DOS codepage for Hebrew.
-
-Codepage 863 (Canadian French)
-CONFIG_NLS_CODEPAGE_863
-  The Microsoft FAT file system family can deal with filenames in
-  native language character sets. These character sets are stored in
-  so-called DOS codepages. You need to include the appropriate
-  codepage if you want to be able to read/write these filenames on
-  DOS/Windows partitions correctly. This does apply to the filenames
-  only, not to the file contents. You can include several codepages;
-  say Y here if you want to include the DOS codepage for Canadian
-  French.
-
-Codepage 864 (Arabic)
-CONFIG_NLS_CODEPAGE_864
-  The Microsoft FAT file system family can deal with filenames in
-  native language character sets. These character sets are stored in
-  so-called DOS codepages. You need to include the appropriate
-  codepage if you want to be able to read/write these filenames on
-  DOS/Windows partitions correctly. This does apply to the filenames
-  only, not to the file contents. You can include several codepages;
-  say Y here if you want to include the DOS codepage for Arabic.
-
-Codepage 865 (Norwegian, Danish)
-CONFIG_NLS_CODEPAGE_865
-  The Microsoft FAT file system family can deal with filenames in
-  native language character sets. These character sets are stored in
-  so-called DOS codepages. You need to include the appropriate
-  codepage if you want to be able to read/write these filenames on
-  DOS/Windows partitions correctly. This does apply to the filenames
-  only, not to the file contents. You can include several codepages;
-  say Y here if you want to include the DOS codepage for the Nordic
-  European countries.
-
-Codepage 866 (Cyrillic/Russian)
-CONFIG_NLS_CODEPAGE_866
-  The Microsoft FAT file system family can deal with filenames in
-  native language character sets. These character sets are stored in
-  so-called DOS codepages. You need to include the appropriate
-  codepage if you want to be able to read/write these filenames on
-  DOS/Windows partitions correctly. This does apply to the filenames
-  only, not to the file contents. You can include several codepages;
-  say Y here if you want to include the DOS codepage for
-  Cyrillic/Russian.
-
-Codepage 869 (Greek)
-CONFIG_NLS_CODEPAGE_869
-  The Microsoft FAT file system family can deal with filenames in
-  native language character sets. These character sets are stored in
-  so-called DOS codepages. You need to include the appropriate
-  codepage if you want to be able to read/write these filenames on
-  DOS/Windows partitions correctly. This does apply to the filenames
-  only, not to the file contents. You can include several codepages;
-  say Y here if you want to include the DOS codepage for Greek.
-
-Thai charset (CP874, TIS-620)
-CONFIG_NLS_CODEPAGE_874
-  The Microsoft FAT file system family can deal with filenames in
-  native language character sets. These character sets are stored in
-  so-called DOS codepages. You need to include the appropriate
-  codepage if you want to be able to read/write these filenames on
-  DOS/Windows partitions correctly. This does apply to the filenames
-  only, not to the file contents. You can include several codepages;
-  say Y here if you want to include the DOS codepage for Thai.
-
-Windows CP1251 (Bulgarian, Belarusian)
-CONFIG_NLS_CODEPAGE_1251
-  The Microsoft FAT file system family can deal with filenames in
-  native language character sets. These character sets are stored in
-  so-called DOS codepages. You need to include the appropriate
-  codepage if you want to be able to read/write these filenames on
-  DOS/Windows partitions correctly. This does apply to the filenames
-  only, not to the file contents. You can include several codepages;
-  say Y here if you want to include the DOS codepage for Russian and
-  Bulgarian and Belarusian.
-
-Japanese charsets (Shift-JIS, EUC-JP)
-CONFIG_NLS_CODEPAGE_932
-  The Microsoft FAT file system family can deal with filenames in
-  native language character sets. These character sets are stored in
-  so-called DOS codepages. You need to include the appropriate
-  codepage if you want to be able to read/write these filenames on
-  DOS/Windows partitions correctly. This does apply to the filenames
-  only, not to the file contents. You can include several codepages;
-  say Y here if you want to include the DOS codepage for Shift-JIS
-  or EUC-JP. To use EUC-JP, you can use 'euc-jp' as mount option or
-  NLS Default value during kernel configuration, instead of 'cp932'.
-
-Simplified Chinese charset (CP936, GB2312)
-CONFIG_NLS_CODEPAGE_936
-  The Microsoft FAT file system family can deal with filenames in
-  native language character sets. These character sets are stored in
-  so-called DOS codepages. You need to include the appropriate
-  codepage if you want to be able to read/write these filenames on
-  DOS/Windows partitions correctly. This does apply to the filenames
-  only, not to the file contents. You can include several codepages;
-  say Y here if you want to include the DOS codepage for Simplified
-  Chinese(GBK).
-
-Korean charset (CP949, EUC-KR)
-CONFIG_NLS_CODEPAGE_949
-  The Microsoft FAT file system family can deal with filenames in
-  native language character sets. These character sets are stored in
-  so-called DOS codepages. You need to include the appropriate
-  codepage if you want to be able to read/write these filenames on
-  DOS/Windows partitions correctly. This does apply to the filenames
-  only, not to the file contents. You can include several codepages;
-  say Y here if you want to include the DOS codepage for UHC.
-
-Traditional Chinese charset (Big5)
-CONFIG_NLS_CODEPAGE_950
-  The Microsoft FAT file system family can deal with filenames in
-  native language character sets. These character sets are stored in
-  so-called DOS codepages. You need to include the appropriate
-  codepage if you want to be able to read/write these filenames on
-  DOS/Windows partitions correctly. This does apply to the filenames
-  only, not to the file contents. You can include several codepages;
-  say Y here if you want to include the DOS codepage for Traditional
-  Chinese(Big5).
-
-Central European (Codepage 1250)
-CONFIG_NLS_CODEPAGE_1250
-  If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CDROMs
-  correctly on the screen, you need to include the appropriate
-  input/output character sets. Say Y here for the Windows CP-1250
-  character set, which works for most Latin-written Slavic and Central
-  European languages: Czech, German, Hungarian, Polish, Rumanian, Croatian,
-  Slovak, Slovene.
-
-NLS ISO 8859-1 (Latin 1; Western European Languages)
-CONFIG_NLS_ISO8859_1
-  If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CD-ROMs
-  correctly on the screen, you need to include the appropriate
-  input/output character sets. Say Y here for the Latin 1 character
-  set, which covers most West European languages such as Albanian,
-  Catalan, Danish, Dutch, English, Faeroese, Finnish, French, German,
-  Galician, Irish, Icelandic, Italian, Norwegian, Portuguese, Spanish,
-  and Swedish. It is also the default for the US. If unsure, say Y.
-
-NLS ISO 8859-2 (Latin 2; Slavic/Central European Languages)
-CONFIG_NLS_ISO8859_2
-  If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CD-ROMs
-  correctly on the screen, you need to include the appropriate
-  input/output character sets. Say Y here for the Latin 2 character
-  set, which works for most Latin-written Slavic and Central European
-  languages: Czech, German, Hungarian, Polish, Rumanian, Croatian,
-  Slovak, Slovene.
-
-NLS ISO 8859-3 (Latin 3; Esperanto, Galician, Maltese, Turkish)
-CONFIG_NLS_ISO8859_3
-  If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CD-ROMs
-  correctly on the screen, you need to include the appropriate
-  input/output character sets. Say Y here for the Latin 3 character
-  set, which is popular with authors of Esperanto, Galician, Maltese,
-  and Turkish.
-
-NLS ISO 8859-4 (Latin 4; old Baltic charset)
-CONFIG_NLS_ISO8859_4
-  If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CD-ROMs
-  correctly on the screen, you need to include the appropriate
-  input/output character sets. Say Y here for the Latin 4 character
-  set which introduces letters for Estonian, Latvian, and
-  Lithuanian. It is an incomplete predecessor of Latin 7.
-
-NLS ISO 8859-5 (Cyrillic)
-CONFIG_NLS_ISO8859_5
-  If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CD-ROMs
-  correctly on the screen, you need to include the appropriate
-  input/output character sets. Say Y here for ISO8859-5, a Cyrillic
-  character set with which you can type Bulgarian, Belarusian,
-  Macedonian, Russian, Serbian, and Ukrainian. Note that the charset
-  KOI8-R is preferred in Russia.
-
-NLS ISO 8859-6 (Arabic)
-CONFIG_NLS_ISO8859_6
-  If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CD-ROMs
-  correctly on the screen, you need to include the appropriate
-  input/output character sets. Say Y here for ISO8859-6, the Arabic
-  character set.
-
-NLS ISO 8859-7 (Modern Greek)
-CONFIG_NLS_ISO8859_7
-  If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CD-ROMs
-  correctly on the screen, you need to include the appropriate
-  input/output character sets. Say Y here for ISO8859-7, the Modern
-  Greek character set.
-
-Hebrew charsets (ISO-8859-8, CP1255)
-CONFIG_NLS_ISO8859_8
-  If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CD-ROMs
-  correctly on the screen, you need to include the appropriate
-  input/output character sets. Say Y here for ISO8859-8, the Hebrew
-  character set.
-
-NLS ISO 8859-9 (Latin 5; Turkish)
-CONFIG_NLS_ISO8859_9
-  If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CD-ROMs
-  correctly on the screen, you need to include the appropriate
-  input/output character sets. Say Y here for the Latin 5 character
-  set, and it replaces the rarely needed Icelandic letters in Latin 1
-  with the Turkish ones. Useful in Turkey.
-
-NLS ISO 8859-10 (Latin 6; Nordic)
-CONFIG_NLS_ISO8859_10
-  If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CD-ROMs
-  correctly on the screen, you need to include the appropriate
-  input/output character sets. Say Y here for the Latin 6 character
-  set, which adds the last Inuit (Greenlandic) and Sami (Lappish)
-  letters that were missing in Latin 4 to cover the entire Nordic
-  area.
-
-NLS ISO 8859-13 (Latin 7; Baltic)
-CONFIG_NLS_ISO8859_13
-  If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CD-ROMs
-  correctly on the screen, you need to include the appropriate
-  input/output character sets. Say Y here for the Latin 7 character
-  set, which supports modern Baltic languages including Latvian
-  and Lithuanian.
-
-NLS ISO 8859-14 (Latin 8; Celtic)
-CONFIG_NLS_ISO8859_14
-  If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CD-ROMs
-  correctly on the screen, you need to include the appropriate
-  input/output character sets. Say Y here for the Latin 8 character
-  set, which adds the last accented vowels for Welsh (aka Cymraeg)
-  (and Manx Gaelic) that were missing in Latin 1.
-  <http://linux.speech.cymru.org/> has further information.
-
-NLS ISO 8859-15 (Latin 9; Western European languages with Euro)
-CONFIG_NLS_ISO8859_15
-  If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CD-ROMs
-  correctly on the screen, you need to include the appropriate
-  input/output character sets. Say Y here for the Latin 9 character
-  set, which covers most West European languages such as Albanian,
-  Catalan, Danish, Dutch, English, Estonian, Faeroese, Finnish,
-  French, German, Galician, Irish, Icelandic, Italian, Norwegian,
-  Portuguese, Spanish, and Swedish. Latin 9 is an update to
-  Latin 1 (ISO 8859-1) that removes a handful of rarely used
-  characters and instead adds support for Estonian, corrects the
-  support for French and Finnish, and adds the new Euro character.
-  If unsure, say Y.
-
-NLS KOI8-R (Russian)
-CONFIG_NLS_KOI8_R
-  If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CD-ROMs
-  correctly on the screen, you need to include the appropriate
-  input/output character sets. Say Y here for the preferred Russian
-  character set.
-
-NLS KOI8-U/RU (Ukrainian, Belarusian)
-CONFIG_NLS_KOI8_U
-  If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CD-ROMs
-  correctly on the screen, you need to include the appropriate
-  input/output character sets. Say Y here for the preferred Ukrainian
-  (koi8-u) and Belarusian (koi8-ru) character sets.
-
-NLS UTF8
-CONFIG_NLS_UTF8
-  If you want to display filenames with native language characters
-  from the Microsoft FAT file system family or from JOLIET CD-ROMs
-  correctly on the screen, you need to include the appropriate
-  input/output character sets. Say Y here for the UTF-8 encoding of
-  the Unicode/ISO9646 universal character set.
-
-Virtual terminal
-CONFIG_VT
-  If you say Y here, you will get support for terminal devices with
-  display and keyboard devices. These are called "virtual" because you
-  can run several virtual terminals (also called virtual consoles) on
-  one physical terminal. This is rather useful, for example one
-  virtual terminal can collect system messages and warnings, another
-  one can be used for a text-mode user session, and a third could run
-  an X session, all in parallel. Switching between virtual terminals
-  is done with certain key combinations, usually Alt-<function key>.
-
-  The setterm command ("man setterm") can be used to change the
-  properties (such as colors or beeping) of a virtual terminal. The
-  man page console_codes(4) ("man console_codes") contains the special
-  character sequences that can be used to change those properties
-  directly. The fonts used on virtual terminals can be changed with
-  the setfont ("man setfont") command and the key bindings are defined
-  with the loadkeys ("man loadkeys") command.
-
-  You need at least one virtual terminal device in order to make use
-  of your keyboard and monitor. Therefore, only people configuring an
-  embedded system would want to say N here in order to save some
-  memory; the only way to log into such a system is then via a serial
-  or network connection.
-
-  If unsure, say Y, or else you won't be able to do much with your new
-  shiny Linux system :-)
-
-Support for console on virtual terminal
-CONFIG_VT_CONSOLE
-  The system console is the device which receives all kernel messages
-  and warnings and which allows logins in single user mode. If you
-  answer Y here, a virtual terminal (the device used to interact with
-  a physical terminal) can be used as system console. This is the most
-  common mode of operations, so you should say Y here unless you want
-  the kernel messages be output only to a serial port (in which case
-  you should say Y to "Console on serial port", below).
-
-  If you do say Y here, by default the currently visible virtual
-  terminal (/dev/tty0) will be used as system console. You can change
-  that with a kernel command line option such as "console=tty3" which
-  would use the third virtual terminal as system console. (Try "man
-  bootparam" or see the documentation of your boot loader (lilo or
-  loadlin) about how to pass options to the kernel at boot time.)
-
-  If unsure, say Y.
-
-STI console
-CONFIG_STI_CONSOLE
-  The STI console is the builtin display/keyboard on HP-PARISC
-  machines.  Say Y here to build support for it into your kernel.
-  The alternative is to use your primary serial port as a console.
-
-Use MDIO for PHY configuration
-CONFIG_USE_MDIO
-  On some boards the hardware configuration of the ethernet PHY can be
-  used without any software interaction over the MDIO interface, so
-  all MII code can be omitted. Say N here if unsure or if you don't
-  need link status reports.
-
-860T FEC Ethernet
-CONFIG_FEC_ENET
-  Enable Ethernet support via the Fast Ethernet Controller (FCC) on
-  the Motorola MPC8260.
-
-Ethernet on FCC1
-CONFIG_FCC1_ENET
-  Use MPC8260 fast Ethernet controller 1 to drive Ethernet (default).
-
-Ethernet on FCC2
-CONFIG_FCC2_ENET
-  Use MPC8260 fast Ethernet controller 2 to drive Ethernet.
-
-Ethernet on FCC3
-CONFIG_FCC3_ENET
-  Use MPC8260 fast Ethernet controller 3 to drive Ethernet.
-
-CPM SCC Ethernet
-CONFIG_SCC_ENET
-  Enable Ethernet support via the Motorola MPC8xx serial
-  communications controller.
-
-# Choice: scc_ethernet
-Ethernet on SCC1
-CONFIG_SCC1_ENET
-  Use MPC8xx serial communications controller 1 to drive Ethernet
-  (default).
-
-Ethernet on SCC2
-CONFIG_SCC2_ENET
-  Use MPC8xx serial communications controller 2 to drive Ethernet.
-
-Ethernet on SCC3
-CONFIG_SCC3_ENET
-  Use MPC8xx serial communications controller 3 to drive Ethernet.
-
-Use Big CPM Ethernet Buffers
-CONFIG_ENET_BIG_BUFFERS
-  Allocate large buffers for MPC8xx Ethernet.  Increases throughput
-  and decreases the likelihood of dropped packets, but costs memory.
-
-Apple Desktop Bus (ADB) support
-CONFIG_ADB
-  Apple Desktop Bus (ADB) support is for support of devices which
-  are connected to an ADB port.  ADB devices tend to have 4 pins.
-  If you have an Apple Macintosh prior to the iMac, or a
-  "Blue and White G3", you probably want to say Y here.  Otherwise
-  say N.
-
-Support for CUDA based PowerMacs
-CONFIG_ADB_CUDA
-  This provides support for CUDA based Power Macintosh systems.  This
-  includes most OldWorld PowerMacs, the first generation iMacs, the
-  Blue&White G3 and the Yikes G4 (PCI Graphics).  All later models
-  should use CONFIG_ADB_PMU instead.
-
-  If unsure say Y.
-
-Support for PMU-based PowerMacs
-CONFIG_ADB_PMU
-  This provides support for PMU based Power Macintosh systems.  This
-  includes all PowerBooks and all AGP-based machines.
-  
-  If unsure say Y.
-
-Include MacIO ADB driver
-CONFIG_ADB_MACIO
-  Say Y here to include direct support for the ADB controller in the
-  Hydra chip used on PowerPC Macintoshes of the CHRP type.  (The Hydra
-  also includes a MESH II SCSI controller, DBDMA controller, VIA chip,
-  OpenPIC controller and two RS422/Geoports.)
-
-Support for ADB keyboard (old driver)
-CONFIG_ADB_KEYBOARD
-  This option allows you to use an ADB keyboard attached to your
-  machine. Note that this disables any other (ie. PS/2) keyboard
-  support, even if your machine is physically capable of using both at
-  the same time.
-
-  If you use an ADB keyboard (4 pin connector), say Y here.
-  If you use a PS/2 keyboard (6 pin connector), say N here.
-
-HIL keyboard support
-CONFIG_HIL
-  The "Human Interface Loop" is a older, 8-channel USB-like controller
-  used in Hewlett Packard PA-RISC based machines.  There are a few
-  cases where it is seen on PC/MAC architectures as well, usually also
-  manufactured by HP.  This driver is based off MACH and BSD drivers,
-  and implements support for a keyboard attached to the HIL port.
-  Full support for the USB-like functions and non-keyboard channels of
-  the HIL is not provided for in this driver.  There are vestiges of
-  mouse support in the driver, but it is probably not working.  The
-  necessary hardware documentation to fully support the HIL controller
-  and interface it to the linux-input API is lacking.
-
-  Enable this option if you intend to use a HIL keyboard.
-
-Include IOP (IIfx/Quadra 9x0) ADB driver
-CONFIG_ADB_IOP
-  The I/O Processor (IOP) is an Apple custom IC designed to provide
-  intelligent support for I/O controllers.  It is described at
-  <http://www.angelfire.com/ca2/dev68k/iopdesc.html> to enable direct
-  support for it, say 'Y' here.
-
-Mac II style Apple Desktop Bus support
-CONFIG_ADB_MACII
-  Say Y here if want your kernel to support Macintosh systems that use
-  the Mac II style ADB.  This includes the II, IIx, IIcx, SE/30, IIci,
-  Quadra 610, Quadra 650, Quadra 700, Quadra 800, Centris 610 and
-  Centris 650.
-
-Mac IIsi style Apple Desktop Bus support
-CONFIG_ADB_MACIISI
-  Say Y here if want your kernel to support Macintosh systems that use
-  the Mac IIsi style ADB.  This includes the IIsi, IIvi, IIvx, Classic
-  II, LC, LC II, LC III, Performa 460, and the Performa 600.
-
-Apple 68K PowerBook Power Management and Desktop Bus support
-CONFIG_ADB_PMU68K
-  Say Y here if want your kernel to support the m68k based Powerbooks.
-  This includes the PowerBook 140, PowerBook 145, PowerBook 150,
-  PowerBook 160, PowerBook 165, PowerBook 165c, PowerBook 170,
-  PowerBook 180, PowerBook, 180c, PowerBook 190cs, PowerBook 520,
-  PowerBook Duo 210, PowerBook Duo 230, PowerBook Duo 250,
-  PowerBook Duo 270c, PowerBook Duo 280 and PowerBook Duo 280c.
-
-Macintosh IIfx/Quadra 900/Quadra 950 floppy support
-CONFIG_BLK_DEV_SWIM_IOP
-  Say Y here to support the SWIM (Super Woz Integrated Machine) IOP
-  floppy controller on the Macintosh IIfx and Quadra 900/950.
-
-Macintosh NS8390 based Ethernet support
-CONFIG_MAC8390
-  If you want to include a driver to support Nubus or LC-PDS
-  Ethernet cards using an NS8390 chipset or its equivalent, say Y
-  and read the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-Macintosh CS89x0 based Ethernet support
-CONFIG_MAC89x0
-  Support for CS89x0 chipset based Ethernet cards.  If you have a
-  Nubus or LC-PDS network (Ethernet) card of this type, say Y and
-  read the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt> as well as
-  <file:Documentation/networking/net-modules.txt>.  This module will
-  be called mac89x0.o.
-
-Macintosh onboard AMD 79C940 MACE based Ethernet support
-CONFIG_MACMACE
-  Support for the onboard AMD 79C940 MACE Ethernet controller used in
-  the 660AV and 840AV Macintosh.  If you have one of these Macintoshes
-  say Y and read the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-Macintosh SONIC based Ethernet support (onboard, NuBus, LC, CS)
-CONFIG_MACSONIC
-  Support for NatSemi SONIC based Ethernet devices.  This includes
-  the onboard Ethernet in many Quadras as well as some LC-PDS,
-  a few Nubus and all known Comm Slot Ethernet cards.  If you have
-  one of these say Y and read the Ethernet-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt> as well as
-  <file:Documentation/networking/net-modules.txt>.  This module will
-  be called macsonic.o.
-
-Macintosh NCR5380 SCSI support
-CONFIG_MAC_SCSI
-  This is the NCR 5380 SCSI controller included on most of the 68030
-  based Macintoshes.  If you have one of these say Y and read the
-  SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-Macintosh NCR53c9[46] SCSI support
-CONFIG_SCSI_MAC_ESP
-  This is the NCR 53c9x SCSI controller found on most of the 68040
-  based Macintoshes.  If you have one of these say Y and read the
-  SCSI-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called mac_esp.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-Standard/generic (8250/16550 and compatible UARTs) serial support
-CONFIG_SERIAL
-  This selects whether you want to include the driver for the standard
-  serial ports.  The standard answer is Y.  People who might say N
-  here are those that are setting up dedicated Ethernet WWW/FTP
-  servers, or users that have one of the various bus mice instead of a
-  serial mouse and don't intend to use their machine's standard serial
-  port for anything.  (Note that the Cyclades and Stallion multi
-  serial port drivers do not need this driver built in for them to
-  work.)
-
-  If you want to compile this driver as a module, say M here and read
-  <file:Documentation/modules.txt>.  The module will be called
-  serial.o.
-  [WARNING: Do not compile this driver as a module if you are using
-  non-standard serial ports, since the configuration information will
-  be lost when the driver is unloaded.  This limitation may be lifted
-  in the future.]
-
-  BTW1: If you have a mouseman serial mouse which is not recognized by
-  the X window system, try running gpm first.
-
-  BTW2: If you intend to use a software modem (also called Winmodem)
-  under Linux, forget it.  These modems are crippled and require
-  proprietary drivers which are only available under Windows.
-
-  Most people will say Y or M here, so that they can use serial mice,
-  modems and similar devices connecting to the standard serial ports.
-
-Support for console on serial port
-CONFIG_SERIAL_CONSOLE
-  If you say Y here, it will be possible to use a serial port as the
-  system console (the system console is the device which receives all
-  kernel messages and warnings and which allows logins in single user
-  mode). This could be useful if some terminal or printer is connected
-  to that serial port.
-
-  Even if you say Y here, the currently visible virtual console
-  (/dev/tty0) will still be used as the system console by default, but
-  you can alter that using a kernel command line option such as
-  "console=ttyS1". (Try "man bootparam" or see the documentation of
-  your boot loader (lilo or loadlin) about how to pass options to the
-  kernel at boot time.)
-
-  If you don't have a VGA card installed and you say Y here, the
-  kernel will automatically use the first serial line, /dev/ttyS0, as
-  system console.
-
-  If unsure, say N.
-
-Support for PowerMac serial ports
-CONFIG_MAC_SERIAL
-  If you have Macintosh style serial ports (8 pin mini-DIN), say Y
-  here. If you also have regular serial ports and enable the driver
-  for them, you can't currently use the serial console feature.
-
-Comtrol Rocketport support
-CONFIG_ROCKETPORT
-  This is a driver for the Comtrol Rocketport cards which provide
-  multiple serial ports. You would need something like this to connect
-  more than two modems to your Linux box, for instance in order to
-  become a dial-in server.
-
-  If you want to compile this driver as a module, say M here and read
-  <file:Documentation/modules.txt>.  The module will be called
-  rocket.o.
-
-Digiboard Intelligent async support
-CONFIG_DIGIEPCA
-  This is a driver for Digi International's Xx, Xeve, and Xem series
-  of cards which provide multiple serial ports. You would need
-  something like this to connect more than two modems to your Linux
-  box, for instance in order to become a dial-in server. This driver
-  supports the original PC (ISA) boards as well as PCI, and EISA. If
-  you have a card like this, say Y here and read the file
-  <file:Documentation/digiepca.txt>.
-
-  NOTE: There is another, separate driver for the Digiboard PC boards:
-  "Digiboard PC/Xx Support" below. You should (and can) only select
-  one of the two drivers.
-
-  If you want to compile this driver as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called epca.o.
-
-Digiboard PC/Xx Support
-CONFIG_DIGI
-  This is a driver for the Digiboard PC/Xe, PC/Xi, and PC/Xeve cards
-  that give you many serial ports. You would need something like this
-  to connect more than two modems to your Linux box, for instance in
-  order to become a dial-in server. If you have a card like that, say
-  Y here and read the file <file:Documentation/digiboard.txt>.
-
-  If you want to compile this driver as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called pcxx.o.
-
-SDL RISCom/8 card support
-CONFIG_RISCOM8
-  This is a driver for the SDL Communications RISCom/8 multiport card,
-  which gives you many serial ports. You would need something like
-  this to connect more than two modems to your Linux box, for instance
-  in order to become a dial-in server. If you have a card like that,
-  say Y here and read the file <file:Documentation/riscom8.txt>.
-
-  Also it's possible to say M here and compile this driver as kernel
-  loadable module; the module will be called riscom8.o.
-
-Computone IntelliPort Plus serial support
-CONFIG_COMPUTONE
-  This driver supports the entire family of Intelliport II/Plus
-  controllers with the exception of the MicroChannel controllers and
-  products previous to the Intelliport II. These are multiport cards,
-  which give you many serial ports. You would need something like this
-  to connect more than two modems to your Linux box, for instance in
-  order to become a dial-in server. If you have a card like that, say
-  Y here and read <file:Documentation/computone.txt>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>. You will get
-  two modules called ip2.o and ip2main.o.
-
-Specialix IO8+ card support
-CONFIG_SPECIALIX
-  This is a driver for the Specialix IO8+ multiport card (both the
-  ISA and the PCI version) which gives you many serial ports. You
-  would need something like this to connect more than two modems to
-  your Linux box, for instance in order to become a dial-in server.
-
-  If you have a card like that, say Y here and read the file
-  <file:Documentation/specialix.txt>. Also it's possible to say M here
-  and compile this driver as kernel loadable module which will be
-  called specialix.o.
-
-Specialix DTR/RTS pin is RTS
-CONFIG_SPECIALIX_RTSCTS
-  The Specialix IO8+ card can only support either RTS or DTR. If you
-  say N here, the driver will use the pin as "DTR" when the tty is in
-  software handshake mode.  If you say Y here or hardware handshake is
-  on, it will always be RTS.  Read the file
-  <file:Documentation/specialix.txt> for more information.
-
-Specialix RIO system support
-CONFIG_RIO
-  This is a driver for the Specialix RIO, a smart serial card which
-  drives an outboard box that can support up to 128 ports.  Product
-  information is at <http://www.sphinxcst.co.uk/perle/multi.htm>.
-  There are both ISA and PCI versions.
-
-Support really old RIO/PCI cards
-CONFIG_RIO_OLDPCI
-  Older RIO PCI cards need some initialization-time configuration to
-  determine the IRQ and some control addresses.  If you have a RIO and
-  this doesn't seem to work, try setting this to Y.
-
-Cyclades async mux support
-CONFIG_CYCLADES
-  This is a driver for a card that gives you many serial ports. You
-  would need something like this to connect more than two modems to
-  your Linux box, for instance in order to become a dial-in server.
-  For information about the Cyclades-Z card, read
-  <file:drivers/char/README.cycladesZ>.
-
-  As of 1.3.9x kernels, this driver's minor numbers start at 0 instead
-  of 32.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called cyclades.o.
-
-  If you haven't heard about it, it's safe to say N.
-
-Cyclades-Z interrupt mode operation
-CONFIG_CYZ_INTR
-  The Cyclades-Z family of multiport cards allows 2 (two) driver op
-  modes: polling and interrupt. In polling mode, the driver will check
-  the status of the Cyclades-Z ports every certain amount of time
-  (which is called polling cycle and is configurable). In interrupt
-  mode, it will use an interrupt line (IRQ) in order to check the
-  status of the Cyclades-Z ports. The default op mode is polling. If
-  unsure, say N.
-
-Stallion multiport serial support
-CONFIG_STALDRV
-  Stallion cards give you many serial ports.  You would need something
-  like this to connect more than two modems to your Linux box, for
-  instance in order to become a dial-in server.  If you say Y here,
-  you will be asked for your specific card model in the next
-  questions.  Make sure to read <file:Documentation/stallion.txt> in
-  this case.  If you have never heard about all this, it's safe to
-  say N.
-
-Stallion EasyIO or EC8/32 support
-CONFIG_STALLION
-  If you have an EasyIO or EasyConnection 8/32 multiport Stallion
-  card, then this is for you; say Y.  Make sure to read
-  <file:Documentation/stallion.txt>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called stallion.o.
-
-Stallion EC8/64, ONboard, Brumby support
-CONFIG_ISTALLION
-  If you have an EasyConnection 8/64, ONboard, Brumby or Stallion
-  serial multiport card, say Y here. Make sure to read
-  <file:Documentation/stallion.txt>.
-
-  To compile it as a module ( = code which can be inserted in and
-  removed from the running kernel whenever you want), say M here and
-  read <file:Documentation/modules.txt>. The module will be called
-  istallion.o.
-
-Microgate SyncLink adapter support
-CONFIG_SYNCLINK
-  Provides support for the SyncLink ISA and PCI multiprotocol serial
-  adapters. These adapters support asynchronous and HDLC bit
-  synchronous communication up to 10Mbps (PCI adapter).
-
-  This driver can only be built as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called synclink.o.  If you want to do that, say M
-  here.
-
-CONFIG_SYNCLINKMP
-  Enable support for the SyncLink Multiport (2 or 4 ports)
-  serial adapter, running asynchronous and HDLC communications up
-  to 2.048Mbps. Each ports is independently selectable for
-  RS-232, V.35, RS-449, RS-530, and X.21
-
-  This driver may be built as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called synclinkmp.o.  If you want to do that, say M
-  here.
-
-Synchronous HDLC line discipline support
-CONFIG_N_HDLC
-  Allows synchronous HDLC communications with tty device drivers that
-  support synchronous HDLC such as the Microgate SyncLink adapter.
-
-  This driver can only be built as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called n_hdlc.o. If you want to do that, say M
-  here.
-
-Specialix SX (and SI) card support
-CONFIG_SX
-  This is a driver for the SX and SI multiport serial cards.
-  Please read the file <file:Documentation/sx.txt> for details.
-
-  This driver can only be built as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called sx.o. If you want to do that, say M here.
-
-Hayes ESP serial port support
-CONFIG_ESPSERIAL
-  This is a driver which supports Hayes ESP serial ports.  Both single
-  port cards and multiport cards are supported.  Make sure to read
-  <file:Documentation/hayes-esp.txt>.
-
-  To compile this driver as a module ( = code which can be inserted in
-  and removed from the running kernel whenever you want), say M here
-  and read <file:Documentation/modules.txt>.  The module will be
-  called esp.o.  If unsure, say N.
-
-Moxa Intellio support
-CONFIG_MOXA_INTELLIO
-  Say Y here if you have a Moxa Intellio multiport serial card.
-
-  This driver can also be built as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called moxa.o. If you want to do that, say M
-  here.
-
-Moxa SmartIO support
-CONFIG_MOXA_SMARTIO
-  Say Y here if you have a Moxa SmartIO multiport serial card.
-
-  This driver can also be built as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called mxser.o. If you want to do that, say M
-  here.
-
-Multi-Tech multiport card support
-CONFIG_ISI
-  This is a driver for the Multi-Tech cards which provide several
-  serial ports.  The driver is experimental and can currently only be
-  built as a module ( = code which can be inserted in and removed from
-  the running kernel whenever you want).  Please read
-  <file:Documentation/modules.txt>.  The module will be called
-  isicom.o.
-
-Unix98 PTY support
-CONFIG_UNIX98_PTYS
-  A pseudo terminal (PTY) is a software device consisting of two
-  halves: a master and a slave. The slave device behaves identical to
-  a physical terminal; the master device is used by a process to
-  read data from and write data to the slave, thereby emulating a
-  terminal. Typical programs for the master side are telnet servers
-  and xterms.
-
-  Linux has traditionally used the BSD-like names /dev/ptyxx for
-  masters and /dev/ttyxx for slaves of pseudo terminals. This scheme
-  has a number of problems. The GNU C library glibc 2.1 and later,
-  however, supports the Unix98 naming standard: in order to acquire a
-  pseudo terminal, a process opens /dev/ptmx; the number of the pseudo
-  terminal is then made available to the process and the pseudo
-  terminal slave can be accessed as /dev/pts/<number>. What was
-  traditionally /dev/ttyp2 will then be /dev/pts/2, for example.
-
-  The entries in /dev/pts/ are created on the fly by a virtual
-  file system; therefore, if you say Y here you should say Y to
-  "/dev/pts file system for Unix98 PTYs" as well.
-
-  If you want to say Y here, you need to have the C library glibc 2.1
-  or later (equal to libc-6.1, check with "ls -l /lib/libc.so.*").
-  Read the instructions in <file:Documentation/Changes> pertaining to
-  pseudo terminals. It's safe to say N.
-
-Maximum number of Unix98 PTYs in use (0-2048)
-CONFIG_UNIX98_PTY_COUNT
-  The maximum number of Unix98 PTYs that can be used at any one time.
-  The default is 256, and should be enough for desktop systems. Server
-  machines which support incoming telnet/rlogin/ssh connections and/or
-  serve several X terminals may want to increase this: every incoming
-  connection and every xterm uses up one PTY.
-
-  When not in use, each additional set of 256 PTYs occupy
-  approximately 8 KB of kernel memory on 32-bit architectures.
-
-Parallel printer support
-CONFIG_PRINTER
-  If you intend to attach a printer to the parallel port of your Linux
-  box (as opposed to using a serial printer; if the connector at the
-  printer has 9 or 25 holes ["female"], then it's serial), say Y.
-  Also read the Printing-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  It is possible to share one parallel port among several devices
-  (e.g. printer and ZIP drive) and it is safe to compile the
-  corresponding drivers into the kernel.  If you want to compile this
-  driver as a module however ( = code which can be inserted in and
-  removed from the running kernel whenever you want), say M here and
-  read <file:Documentation/modules.txt> and
-  <file:Documentation/parport.txt>.  The module will be called lp.o.
-
-  If you have several parallel ports, you can specify which ports to
-  use with the "lp" kernel command line option.  (Try "man bootparam"
-  or see the documentation of your boot loader (lilo or loadlin) about
-  how to pass options to the kernel at boot time.)  The syntax of the
-  "lp" command line option can be found in <file:drivers/char/lp.c>.
-
-  If you have more than 8 printers, you need to increase the LP_NO
-  macro in lp.c and the PARPORT_MAX macro in parport.h.
-
-Support for console on line printer
-CONFIG_LP_CONSOLE
-  If you want kernel messages to be printed out as they occur, you
-  can have a console on the printer. This option adds support for
-  doing that; to actually get it to happen you need to pass the
-  option "console=lp0" to the kernel at boot time.
-
-  If the printer is out of paper (or off, or unplugged, or too
-  busy..) the kernel will stall until the printer is ready again.
-  By defining CONSOLE_LP_STRICT to 0 (at your own risk) you
-  can make the kernel continue when this happens,
-  but it'll lose the kernel messages.
-
-  If unsure, say N.
-
-Support for user-space parallel port device drivers
-CONFIG_PPDEV
-  Saying Y to this adds support for /dev/parport device nodes.  This
-  is needed for programs that want portable access to the parallel
-  port, for instance deviceid (which displays Plug-and-Play device
-  IDs).
-
-  This is the parallel port equivalent of SCSI generic support (sg).
-  It is safe to say N to this -- it is not needed for normal printing
-  or parallel port CD-ROM/disk support.
-
-  This support is also available as a module.  If you want to compile
-  it as a module, say M here and read
-  <file:Documentation/modules.txt>.  The module will be called
-  ppdev.o.
-
-  If unsure, say N.
-
-Cobalt Networks support
-CONFIG_COBALT
-  Support for Cobalt Networks x86-based servers.
-
-Gen III (3000 series) system support
-CONFIG_COBALT_GEN_III
-  This option enables support for the 3000 series of Cobalt Networks
-  systems. This includes the RaQ 3, RaQ 4, and Qube 3 product lines.
-
-  This platform uses an AMD K6-2 processor, an ALI M1541/1533 chipset,
-  an optional NCR 53c875 SCSI controller, and two Intel 82559ER or
-  National Semiconductor DP83815 NICs.
-
-  Getting this option wrong will likely result in a kernel that does
-  not boot. Selecting support for more than 1 system series will add
-  bloat to your kernel, but will not cause anything bad to happen.
-
-  If you have a Cobalt Networks System, but aren't sure what kind,
-  say Y here.
-
-Gen V (5000 series) system support
-CONFIG_COBALT_GEN_V
-  This option enables support for the 5000 series of Cobalt Networks
-  systems. This includes the RaQ XTR product line.
-
-  This platform uses Intel Pentium III Coppermine FCPGA CPUs, the
-  ServerWorks LE chipset (with registered ECC DIMMs only!), two
-  HighPoint HPT370 IDE controllers, and two National Semiconductor
-  DP83815 NICs.
-
-  Getting this option wrong will likely result in a kernel that does
-  not boot. Selecting support for more than 1 system series will add
-  bloat to your kernel, but will not cause anything bad to happen.
-
-  If you have a Cobalt Networks System, but aren't sure what kind,
-  say Y here.
-
-Create legacy /proc files
-CONFIG_COBALT_OLDPROC
-  This option forces some Cobalt Networks drivers to support legacy
-  files in /proc.  Older versions of these drivers exported files
-  directly in /proc, as opposed to the newer /proc/cobalt.  If you say
-  N to this option, the old filenames will no longer be exported.
-  Regardless of your selection here, files in /proc/cobalt will be
-  exported.  Of course, you have to include support for /proc fs, too.
-
-  It is safe to say Y here.
-
-Front panel LCD support
-CONFIG_COBALT_LCD
-  This enables support for the Cobalt Networks front panel.  This is
-  for the LCD panel and buttons.  The primary method for connection is
-  via the parallel port (IO base 0x370), but newer systems use an
-  I2C bus.
-
-  If you have a Cobalt Networks system, you should say Y here.
-
-Software controlled LED support
-CONFIG_COBALT_LED
-  This enables support for the software-controlled LEDs on Cobalt
-  Networks systems.  This includes the fault light and front panel
-  LEDs on the RaQ XTR, the lightbar on the Qube 3, and others.
-
-  If you have a Cobalt Networks system, you should say Y here.
-
-Silicon serial number support
-CONFIG_COBALT_SERNUM
-  This enables support for the on-board serial number on Cobalt
-  Networks systems.  This is a universally-unique 64-bit serial
-  number.  Some systems use a Dallas DS2401 chip, others have an I2C
-  based EEPROM.
-
-  If you select Y here, the files /proc/cobalt/hostid and
-  /proc/cobalt/serialnumber will be created.  The hostid file contains
-  a 32 bit integer generated from the serial number, in binary form.
-  The serialnumber file contains the hexadecimal representation of the
-  serial number, in ASCII.
-
-  If you have a Cobalt Networks system, you should say Y here.
-
-Chipset watchdog timer support
-CONFIG_COBALT_WDT
-  This enables support for the watchdog timer built into Cobalt
-  chipsets.  The timer wakes up periodically, to make find out if
-  system has hung, or disabled interrupts too long.  The result of
-  detecting a hang is a hard reboot.
-
-  If you have a Cobalt Networks system, you should say Y here.
-
-Thermal sensor support
-CONFIG_COBALT_THERMAL
-  This enables support for the thermal sensor(s) built into Cobalt
-  Networks systems.  This driver exports /proc/cobalt/thermal_sensors.
-
-  If you have a Cobalt Networks system, you should say Y here.
-
-Fan tachometer support
-CONFIG_COBALT_FANS
-  This enables support for the fan tachometers built into some Cobalt
-  Networks systems.  This driver exports /proc/cobalt/faninfo.  Some
-  Cobalt software depends on this feature, and enabling it does not
-  cause any risks.
-
-  If you have a Cobalt Networks system, you should say Y here, unless
-  you are absolutely sure.
-
-Disk drive ruler support
-CONFIG_COBALT_RULER
-  This enables support for the cobalt hard drive ruler, found on some
-  Cobalt systems, including the RaQ XTR.  This is the device that
-  enables swapping of drives.  It is not needed for basic disk
-  operation. Enabling this on a system with no ruler will have no
-  adverse effects.
-
-  If you have a Cobalt Networks system, you should say Y here,
-  unless you are absolutely sure.
-
-IT8172G Sound
-CONFIG_SOUND_IT8172
-  Say Y here to support the on-board sound generator on the Integrated
-  Technology Express, Inc. ITE8172 SBC.  Vendor page at
-  <http://www.ite.com.tw/ia/brief_it8172bsp.htm>; picture of the
-  board at <http://www.mvista.com/allies/semiconductor/ite.html>.
-
-I2C support
-CONFIG_I2C
-  I2C (pronounce: I-square-C) is a slow serial bus protocol used in
-  many micro controller applications and developed by Philips.  SMBus,
-  or System Management Bus is a subset of the I2C protocol.  More
-  information is contained in the directory <file:Documentation/i2c/>,
-  especially in the file called "summary" there.
-
-  Both I2C and SMBus are supported here. You will need this for
-  hardware sensors support, and also for Video For Linux support.
-  Specifically, if you want to use a BT848 based frame grabber/overlay
-  boards under Linux, say Y here and also to "I2C bit-banging
-  interfaces", below.
-
-  If you want I2C support, you should say Y here and also to the
-  specific driver for your bus adapter(s) below.  If you say Y to
-  "/proc file system" below, you will then get a /proc interface which
-  is documented in <file:Documentation/i2c/proc-interface>.
-
-  This I2C support is also available as a module.  If you want to
-  compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-  The module will be called i2c-core.o.
-
-UltraSPARC-III bootbus i2c controller driver
-CONFIG_BBC_I2C
-  The BBC devices on the UltraSPARC III have two I2C controllers.  The
-  first I2C controller connects mainly to configuration PROMs (NVRAM,
-  CPU configuration, DIMM types, etc.).  The second I2C controller
-  connects to environmental control devices such as fans and
-  temperature sensors.  The second controller also connects to the
-  smartcard reader, if present.  Say Y to enable support for these.
-
-I2C bit-banging interfaces
-CONFIG_I2C_ALGOBIT
-  This allows you to use a range of I2C adapters called bit-banging
-  adapters.  Say Y if you own an I2C adapter belonging to this class
-  and then say Y to the specific driver for you adapter below.
-
-  This support is also available as a module.  If you want to compile
-  it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-  The module will be called i2c-algo-bit.o.
-
-Philips style parallel port adapter
-CONFIG_I2C_PHILIPSPAR
-  This supports parallel-port I2C adapters made by Philips.  Say Y if
-  you own such an adapter.
-
-  This driver is also available as a module.  If you want to compile
-  it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-  The module will be called i2c-philips-par.o.
-
-  Note that if you want support for different parallel port devices,
-  life will be much easier if you compile them all as modules.
-
-ELV adapter
-CONFIG_I2C_ELV
-  This supports parallel-port I2C adapters called ELV.  Say Y if you
-  own such an adapter.
-
-  This driver is also available as a module.  If you want to compile
-  it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-  The module will be called i2c-elv.o.
-
-Velleman K9000 adapter
-CONFIG_I2C_VELLEMAN
-  This supports the Velleman K9000 parallel-port I2C adapter.  Say Y
-  if you own such an adapter.
-
-  This driver is also available as a module.  If you want to compile
-  it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-  The module will be called i2c-velleman.o.
-
-I2C PCF 8584 interfaces
-CONFIG_I2C_ALGOPCF
-  This allows you to use a range of I2C adapters called PCF adapters.
-  Say Y if you own an I2C adapter belonging to this class and then say
-  Y to the specific driver for you adapter below.
-
-  This support is also available as a module.  If you want to compile
-  it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-  The module will be called i2c-algo-pcf.o.
-
-Elektor ISA card
-CONFIG_I2C_ELEKTOR
-  This supports the PCF8584 ISA bus I2C adapter.  Say Y if you own
-  such an adapter.
-
-  This driver is also available as a module.  If you want to compile
-  it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-  The module will be called i2c-elektor.o.
-
-ITE I2C Algorithm
-CONFIG_ITE_I2C_ALGO
-  This supports the use the ITE8172 I2C interface found on some MIPS
-  systems. Say Y if you have one of these. You should also say Y for
-  the ITE I2C peripheral driver support below.
-
-  This support is also available as a module. If you want to compile
-  it as a modules, say M here and read
-  <file:Documentation/modules.txt>.
-  The module will be called i2c-algo-ite.o.
-
-ITE I2C Adapter
-CONFIG_ITE_I2C_ADAP
-  This supports the ITE8172 I2C peripheral found on some MIPS
-  systems. Say Y if you have one of these. You should also say Y for
-  the ITE I2C driver algorithm support above.
-
-  This support is also available as a module. If you want to compile
-  it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-  The module will be called i2c-adap-ite.o.
-
-I2C device interface
-CONFIG_I2C_CHARDEV
-  Say Y here to use i2c-* device files, usually found in the /dev
-  directory on your system.  They make it possible to have user-space
-  programs use the I2C bus.  Information on how to do this is
-  contained in the file <file:Documentation/i2c/dev-interface>.
-
-  This code is also available as a module.  If you want to compile
-  it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-  The module will be called i2c-dev.o.
-
-I2C /proc interface (required for hardware sensors)
-CONFIG_I2C_PROC
-  This provides support for i2c device entries in the /proc filesystem.
-  The entries will be found in /proc/sys/dev/sensors.
-
-  This code is also available as a module. If you want to compile
-  it as a module, say M here and read <file:Documentation/modules.txt>.
-  The module will be called i2c-proc.o.
-
-Bus Mouse Support
-CONFIG_BUSMOUSE
-  Say Y here if your machine has a bus mouse as opposed to a serial
-  mouse. Most people have a regular serial MouseSystem or
-  Microsoft mouse (made by Logitech) that plugs into a COM port
-  (rectangular with 9 or 25 pins). These people say N here. 
-
-  If you have a laptop, you either have to check the documentation or
-  experiment a bit to find out whether the trackball is a serial mouse
-  or not; it's best to say Y here for you.
-
-  This is the generic bus mouse driver code. If you have a bus mouse,
-  you will have to say Y here and also to the specific driver for your
-  mouse below.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called busmouse.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Mouse Support (not serial and bus mice)
-CONFIG_MOUSE
-  This is for machines with a mouse which is neither a serial nor a
-  bus mouse. Examples are PS/2 mice (such as the track balls on some
-  laptops) and some digitizer pads. Most people have a regular serial
-  MouseSystem or Microsoft mouse (made by Logitech) that plugs into a
-  COM port (rectangular with 9 or 25 pins). These people say N here.
-  If you have something else, read the Busmouse-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>. This HOWTO contains
-  information about all non-serial mice, not just bus mice.
-
-  If you have a laptop, you either have to check the documentation or
-  experiment a bit to find out whether the trackball is a serial mouse
-  or not; it's best to say Y here for you.
-
-  Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause the configurator to skip all
-  the questions about non-serial mice. If unsure, say Y.
-
-Logitech busmouse support
-CONFIG_LOGIBUSMOUSE
-  Logitech mouse connected to a proprietary interface card.  It's
-  generally a round connector with 9 pins. Note that the newer mice
-  made by Logitech don't use the Logitech protocol anymore; for those,
-  you don't need this option.  You want to read the Busmouse-HOWTO,
-  available from <http://www.tldp.org/docs.html#howto>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called busmouse.o.  If you are unsure, say N and read the
-  HOWTO nevertheless: it will tell you what you have.
-
-PS/2 mouse (aka "auxiliary device") support
-CONFIG_PSMOUSE
-  The PS/2 mouse connects to a special mouse port that looks much like
-  the keyboard port (small circular connector with 6 pins). This way,
-  the mouse does not use any serial ports. This port can also be used
-  for other input devices like light pens, tablets, keypads. Compaq,
-  AST and IBM all use this as their mouse port on currently shipping
-  machines. The trackballs of some laptops are PS/2 mice also. In
-  particular, the C&T 82C710 mouse on TI Travelmates is a PS/2 mouse.
-
-  Although PS/2 mice are not technically bus mice, they are explained
-  in detail in the Busmouse-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  When using a PS/2 mouse, you can get problems if you want to use the
-  mouse both on the Linux console and under X. Using the "-R" option
-  of the Linux mouse managing program gpm (available from
-  <ftp://gnu.systemy.it/pub/gpm/>) solves this problem, or you can get
-  the "mconv2" utility from <ftp://ibiblio.org/pub/Linux/system/mouse/>.
-
-C&T 82C710 mouse port support (as on TI Travelmate)
-CONFIG_82C710_MOUSE
-  This is a certain kind of PS/2 mouse used on the TI Travelmate. If
-  you are unsure, try first to say N here and come back if the mouse
-  doesn't work. Read the Busmouse-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-PC110 digitizer pad support
-CONFIG_PC110_PAD
-  This drives the digitizer pad on the IBM PC110 palmtop.  It can turn
-  the digitizer pad into a PS/2 mouse emulation with tap gestures or
-  into an absolute pad.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called pc110pad.o.
-
-Microsoft busmouse support
-CONFIG_MS_BUSMOUSE
-  These animals (also called Inport mice) are connected to an
-  expansion board using a round connector with 9 pins. If this is what
-  you have, say Y and read the Busmouse-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  If you are unsure, say N and read the HOWTO nevertheless: it will
-  tell you what you have. Also be aware that several vendors talk
-  about 'Microsoft busmouse' and actually mean PS/2 busmouse -- so
-  count the pins on the connector.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called msbusmouse.o.
-
-Apple Desktop Bus mouse support
-CONFIG_ADBMOUSE
-  Say Y here if you have this type of bus mouse (4 pin connector) as
-  is common on Macintoshes.  You may want to read the Busmouse-HOWTO,
-  available from <http://www.tldp.org/docs.html#howto>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called adbmouse.o.
-
-ATIXL busmouse support
-CONFIG_ATIXL_BUSMOUSE
-  This is a rare type of busmouse that is connected to the back of an
-  ATI video card.  Say Y if you have one of those. Note however that
-  most mice by ATI are actually Microsoft busmice; you should say Y to
-  "Microsoft busmouse support" above if you have one of those.  Read
-  the Busmouse-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called atixlmouse.o.
-
-  If you are unsure, say N and read the HOWTO nevertheless: it will
-  tell you what you have.
-
-QIC-02 tape support
-CONFIG_QIC02_TAPE
-  If you have a non-SCSI tape drive like that, say Y. Or, if you want
-  to compile this driver as a module ( = code which can be inserted in
-  and removed from the running kernel whenever you want), say M here
-  and read <file:Documentation/modules.txt>. The module will be called
-  tpqic02.o.
-
-iSeries Virtual Tape Support
-CONFIG_VIOTAPE
-  If you are running Linux on an iSeries system and you want Linux
-  to read and/or write a tape drive owned by OS/400, say Y here.
-
-Do you want runtime configuration for QIC-02
-CONFIG_QIC02_DYNCONF
-  You can either configure this driver once and for all by editing a
-  header file (<file:include/linux/tpqic02.h>), in which case you
-  should say N, or you can fetch a program via anonymous FTP which is
-  able to configure this driver during runtime.  The program to do
-  this is called 'qic02conf' and it is part of the
-  tpqic02-support-X.Y.tar.gz support package.
-
-  If you want to use the qic02conf program, say Y.
-
-Floppy tape drive (QIC-80/40/3010/3020/TR-1/TR-2/TR-3) support
-CONFIG_FTAPE
-  If you have a tape drive that is connected to your floppy
-  controller, say Y here.
-
-  Some tape drives (like the Seagate "Tape Store 3200" or the Iomega
-  "Ditto 3200" or the Exabyte "Eagle TR-3") come with a "high speed"
-  controller of their own. These drives (and their companion
-  controllers) are also supported if you say Y here.
-
-  If you have a special controller (such as the CMS FC-10, FC-20,
-  Mountain Mach-II, or any controller that is based on the Intel 82078
-  FDC like the high speed controllers by Seagate and Exabyte and
-  Iomega's "Ditto Dash") you must configure it by selecting the
-  appropriate entries from the "Floppy tape controllers" sub-menu
-  below and possibly modify the default values for the IRQ and DMA
-  channel and the IO base in ftape's configuration menu.
-
-  If you want to use your floppy tape drive on a PCI-bus based system,
-  please read the file <file:drivers/char/ftape/README.PCI>.
-
-  The ftape kernel driver is also available as a runtime loadable
-  module ( = code which can be inserted in and removed from the
-  running kernel whenever you want). If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>. The
-  module will be called ftape.o.
-
-  Note that the Ftape-HOWTO is out of date (sorry) and documents the
-  older version 2.08 of this software but still contains useful
-  information.  There is a web page with more recent documentation at
-  <http://www.instmath.rwth-aachen.de/~heine/ftape/>.  This page
-  always contains the latest release of the ftape driver and useful
-  information (backup software, ftape related patches and
-  documentation, FAQ).  Note that the file system interface has
-  changed quite a bit compared to previous versions of ftape.  Please
-  read <file:Documentation/ftape.txt>.
-
-VFS interface for ftape
-CONFIG_ZFTAPE
-  Normally, you want to say Y or M. DON'T say N here or you
-  WON'T BE ABLE TO USE YOUR FLOPPY TAPE DRIVE.
-
-  The ftape module itself no longer contains the routines necessary
-  to interface with the kernel VFS layer (i.e. to actually write data
-  to and read data from the tape drive).  Instead the file system
-  interface (i.e. the hardware independent part of the driver) has
-  been moved to a separate module.
-
-  If you say M zftape will be compiled as a runtime loadable
-  module ( = code which can be inserted in and removed from the
-  running kernel whenever you want).  In this case you should read
-  <file:Documentation/modules.txt>.  The module will be called
-  zftape.o.
-
-  Regardless of whether you say Y or M here, an additional runtime
-  loadable module called `zft-compressor.o' which contains code to
-  support user transparent on-the-fly compression based on Ross
-  William's lzrw3 algorithm will be produced.  If you have enabled the
-  kernel module loader (i.e. have said Y to "Kernel module loader
-  support", above) then `zft-compressor.o' will be loaded
-  automatically by zftape when needed.
-
-  Despite its name, zftape does NOT use compression by default.  The
-  file <file:Documentation/ftape.txt> contains a short description of
-  the most important changes in the file system interface compared to
-  previous versions of ftape.  The ftape home page
-  <http://www.instmath.rwth-aachen.de/~heine/ftape/> contains
-  further information.
-
-  IMPORTANT NOTE: zftape can read archives created by previous
-  versions of ftape and provide file mark support (i.e. fast skipping
-  between tape archives) but previous version of ftape will lack file
-  mark support when reading archives produced by zftape.
-
-Default block size for zftape
-CONFIG_ZFT_DFLT_BLK_SZ
-  If unsure leave this at its default value, i.e. 10240. Note that
-  you specify only the default block size here. The block size can be
-  changed at run time using the MTSETBLK tape operation with the
-  MTIOCTOP ioctl (i.e. with "mt -f /dev/qft0 setblk #BLKSZ" from the
-  shell command line).
-
-  The probably most striking difference between zftape and previous
-  versions of ftape is the fact that all data must be written or read
-  in multiples of a fixed block size. The block size defaults to
-  10240 which is what GNU tar uses. The values for the block size
-  should be either 1 or multiples of 1024 up to a maximum value of
-  63488 (i.e. 62 K). If you specify `1' then zftape's builtin
-  compression will be disabled.
-
-  Reasonable values are `10240' (GNU tar's default block size),
-  `5120' (afio's default block size), `32768' (default block size some
-  backup programs assume for SCSI tape drives) or `1' (no restriction
-  on block size, but disables builtin compression).
-
-Number of DMA buffers
-CONFIG_FT_NR_BUFFERS
-  Please leave this at `3' unless you REALLY know what you are doing.
-  It is not necessary to change this value. Values below 3 make the
-  proper use of ftape impossible, values greater than 3 are a waste of
-  memory. You can change the amount of DMA memory used by ftape at
-  runtime with "mt -f /dev/qft0 setdrvbuffer #NUMBUFFERS". Each buffer
-  wastes 32 KB of memory. Please note that this memory cannot be
-  swapped out.
-
-Enable procfs status report (+2kb)
-CONFIG_FT_PROC_FS
-  Optional. Saying Y will result in creation of a directory
-  `/proc/ftape' under the /proc file system. The files can be viewed
-  with your favorite pager (i.e. use "more /proc/ftape/history" or
-  "less /proc/ftape/history" or simply "cat /proc/ftape/history"). The
-  file will contain some status information about the inserted
-  cartridge, the kernel driver, your tape drive, the floppy disk
-  controller and the error history for the most recent use of the
-  kernel driver. Saying Y will enlarge the size of the ftape driver
-  by approximately 2 KB.
-
-  WARNING: When compiling ftape as a module (i.e. saying M to "Floppy
-  tape drive") it is dangerous to use ftape's /proc file system
-  interface. Accessing `/proc/ftape' while the module is unloaded will
-  result in a kernel Oops. This cannot be fixed from inside ftape.
-
-# Choice: ftdebug
-Controlling the amount of debugging output of ftape
-CONFIG_FT_NORMAL_DEBUG
-  This option controls the amount of debugging output the ftape driver
-  is ABLE to produce; it does not increase or diminish the debugging
-  level itself. If unsure, leave this at its default setting,
-  i.e. choose "Normal".
-
-  Ftape can print lots of debugging messages to the system console
-  resp. kernel log files. Reducing the amount of possible debugging
-  output reduces the size of the kernel module by some KB, so it might
-  be a good idea to use "None" for emergency boot floppies.
-
-  If you want to save memory then the following strategy is
-  recommended: leave this option at its default setting "Normal" until
-  you know that the driver works as expected, afterwards reconfigure
-  the kernel, this time specifying "Reduced" or "None" and recompile
-  and install the kernel as usual. Note that choosing "Excessive"
-  debugging output does not increase the amount of debugging output
-  printed to the console but only makes it possible to produce
-  "Excessive" debugging output.
-
-  Please read <file:Documentation/ftape.txt> for a short description
-  how to control the amount of debugging output.
-
-Excessive
-CONFIG_FT_FULL_DEBUG
-  Extremely verbose output for driver debugging purposes.
-
-Reduced
-CONFIG_FT_NO_TRACE
-  Reduced tape driver debugging output.
-
-None
-CONFIG_FT_NO_TRACE_AT_ALL
-  Suppress all debugging output from the tape drive.
-
-# Choice: ftcontroller
-The floppy drive controller for ftape
-CONFIG_FT_STD_FDC
-  Only change this setting if you have a special controller. If you
-  didn't plug any add-on card into your computer system but just
-  plugged the floppy tape cable into the already existing floppy drive
-  controller then you don't want to change the default setting,
-  i.e. choose "Standard".
-
-  Choose "MACH-2" if you have a Mountain Mach-2 controller.
-  Choose "FC-10/FC-20" if you have a Colorado FC-10 or FC-20
-  controller.
-  Choose "Alt/82078" if you have another controller that is located at
-  an IO base address different from the standard floppy drive
-  controller's base address of `0x3f0', or uses an IRQ (interrupt)
-  channel different from `6', or a DMA channel different from
-  `2'. This is necessary for any controller card that is based on
-  Intel's 82078 FDC such as Seagate's, Exabyte's and Iomega's "high
-  speed" controllers.
-
-  If you choose something other than "Standard" then please make
-  sure that the settings for the IO base address and the IRQ and DMA
-  channel in the configuration menus below are correct. Use the manual
-  of your tape drive to determine the correct settings!
-
-  If you are already successfully using your tape drive with another
-  operating system then you definitely should use the same settings
-  for the IO base, the IRQ and DMA channel that have proven to work
-  with that other OS.
-
-  Note that this menu lets you specify only the default setting for
-  the hardware setup. The hardware configuration can be changed at
-  boot time (when ftape is compiled into the kernel, i.e. if you
-  have said Y to "Floppy tape drive") or module load time (i.e. if you
-  have said M to "Floppy tape drive").
-
-  Please read also the file <file:Documentation/ftape.txt> which
-  contains a short description of the parameters that can be set at
-  boot or load time. If you want to use your floppy tape drive on a
-  PCI-bus based system, please read the file
-  <file:drivers/char/ftape/README.PCI>.
-
-IO base for the floppy disk controller used with Ftape
-CONFIG_FT_FDC_BASE
-  You don't need to specify a value if the following default
-  settings for the base IO address are correct:
-  <<< MACH-2     : 0x1E0 >>>
-  <<< FC-10/FC-20: 0x180 >>>
-  <<< Secondary  : 0x370 >>>
-  Secondary refers to a secondary FDC controller like the "high speed"
-  controllers delivered by Seagate or Exabyte or Iomega's Ditto Dash.
-  Please make sure that the setting for the IO base address
-  specified here is correct. USE THE MANUAL OF YOUR TAPE DRIVE OR
-  CONTROLLER CARD TO DETERMINE THE CORRECT SETTING. If you are already
-  successfully using the tape drive with another operating system then
-  you definitely should use the same settings for the IO base that has
-  proven to work with that other OS.
-
-  Note that this menu lets you specify only the default setting for
-  the IO base. The hardware configuration can be changed at boot time
-  (when ftape is compiled into the kernel, i.e. if you specified Y to
-  "Floppy tape drive") or module load time (i.e. if you have said M to
-  "Floppy tape drive").
-
-  Please read also the file <file:Documentation/ftape.txt> which
-  contains a short description of the parameters that can be set at
-  boot or load time.
-
-IRQ channel for the floppy disk controller used with Ftape
-CONFIG_FT_FDC_IRQ
-  You don't need to specify a value if the following default
-  settings for the interrupt channel are correct:
-  <<< MACH-2     : 6 >>>
-  <<< FC-10/FC-20: 9 >>>
-  <<< Secondary  : 6 >>>
-  Secondary refers to secondary a FDC controller like the "high speed"
-  controllers delivered by Seagate or Exabyte or Iomega's Ditto Dash.
-  Please make sure that the setting for the IO base address
-  specified here is correct. USE THE MANUAL OF YOUR TAPE DRIVE OR
-  CONTROLLER CARD TO DETERMINE THE CORRECT SETTING. If you are already
-  successfully using the tape drive with another operating system then
-  you definitely should use the same settings for the IO base that has
-  proven to work with that other OS.
-
-  Note that this menu lets you specify only the default setting for
-  the IRQ channel. The hardware configuration can be changed at boot
-  time (when ftape is compiled into the kernel, i.e. if you said Y to
-  "Floppy tape drive") or module load time (i.e. if you said M to
-  "Floppy tape drive").
-
-  Please read also the file <file:Documentation/ftape.txt> which
-  contains a short description of the parameters that can be set at
-  boot or load time.
-
-DMA channel for the floppy disk controller used with Ftape
-CONFIG_FT_FDC_DMA
-  You don't need to specify a value if the following default
-  settings for the DMA channel are correct:
-  <<< MACH-2     : 2 >>>
-  <<< FC-10/FC-20: 3 >>>
-  <<< Secondary  : 2 >>>
-  Secondary refers to a secondary FDC controller like the "high speed"
-  controllers delivered by Seagate or Exabyte or Iomega's Ditto Dash.
-  Please make sure that the setting for the IO base address
-  specified here is correct. USE THE MANUAL OF YOUR TAPE DRIVE OR
-  CONTROLLER CARD TO DETERMINE THE CORRECT SETTING. If you are already
-  successfully using the tape drive with another operating system then
-  you definitely should use the same settings for the IO base that has
-  proven to work with that other OS.
-
-  Note that this menu lets you specify only the default setting for
-  the DMA channel. The hardware configuration can be changed at boot
-  time (when ftape is compiled into the kernel, i.e. if you said Y to
-  "Floppy tape drive") or module load time (i.e. if you said M to
-  "Floppy tape drive").
-
-  Please read also the file <file:Documentation/ftape.txt> which
-  contains a short description of the parameters that can be set at
-  boot or load time.
-
-FDC FIFO Threshold before requesting DMA service
-CONFIG_FT_FDC_THR
-  Set the FIFO threshold of the FDC. If this is higher the DMA
-  controller may serve the FDC after a higher latency time. If this is
-  lower, fewer DMA transfers occur leading to less bus contention.
-  You may try to tune this if ftape annoys you with "reduced data
-  rate because of excessive overrun errors" messages. However, this
-  doesn't seem to have too much effect.
-
-  If unsure, don't touch the initial value, i.e. leave it at "8".
-
-FDC maximum data rate
-CONFIG_FT_FDC_MAX_RATE
-  With some motherboard/FDC combinations ftape will not be able to
-  run your FDC/tape drive combination at the highest available
-  speed. If this is the case you'll encounter "reduced data rate
-  because of excessive overrun errors" messages and lots of retries
-  before ftape finally decides to reduce the data rate.
-
-  In this case it might be desirable to tell ftape beforehand that
-  it need not try to run the tape drive at the highest available
-  speed. If unsure, leave this disabled, i.e. leave it at 2000
-  bits/sec.
-
-Direct Rendering Manager (XFree86 DRI support)
-CONFIG_DRM
-  Kernel-level support for the Direct Rendering Infrastructure (DRI)
-  introduced in XFree86 4.0. If you say Y here, you need to select
-  the module that's right for your graphics card from the list below.
-  These modules provide support for synchronization, security, and
-  DMA transfers. Please see <http://dri.sourceforge.net/> for more
-  details.  You should also select and configure AGP
-  (/dev/agpgart) support.
-
-Build drivers for new (XFree 4.1) DRM
-CONFIG_DRM_NEW
-  If you set this option, the new DRM version needed by XFree86 4.1
-  will be used.  Otherwise, the old DRM version will be used,
-  appropriate for XFree86 4.0.
-
-3dfx Banshee/Voodoo3+
-CONFIG_DRM_TDFX
-  Choose this option if you have a 3dfx Banshee or Voodoo3 (or later),
-  graphics card.  If M is selected, the module will be called tdfx.o.
-
-3dlabs GMX 2000
-CONFIG_DRM_GAMMA
-  Choose this option if you have a 3dlabs GMX 2000 graphics card.
-  If M is selected, the module will be called gamma.o.
-
-ATI Rage 128
-CONFIG_DRM_R128
-  Choose this option if you have an ATI Rage 128 graphics card.  If M
-  is selected, the module will be called r128.o.  AGP support for
-  this card is strongly suggested (unless you have a PCI version).
-
-ATI Radeon
-CONFIG_DRM_RADEON
-  Choose this option if you have an ATI Radeon graphics card.  There
-  are both PCI and AGP versions.  You don't need to choose this to
-  run the Radeon in plain VGA mode.  There is a product page at
-  <http://www.ati.com/na/pages/products/pc/radeon32/index.html>.
-  If M is selected, the module will be called radeon.o.
-
-Intel I810
-CONFIG_DRM_I810
-  Choose this option if you have an Intel I810 graphics card.  If M is
-  selected, the module will be called i810.o.  AGP support is required
-  for this driver to work.
-
-Matrox G200/G400/G450
-CONFIG_DRM_MGA
-  Choose this option if you have a Matrox G200, G400 or G450 graphics
-  card.  If M is selected, the module will be called mga.o.  AGP
-  support is required for this driver to work.
-
-3dfx Banshee/Voodoo3+
-CONFIG_DRM40_TDFX
-  Choose this option if you have a 3dfx Banshee or Voodoo3 (or later),
-  graphics card.  If M is selected, the module will be called tdfx.o.
-
-3dlabs GMX 2000
-CONFIG_DRM40_GAMMA
-  Choose this option if you have a 3dlabs GMX 2000 graphics card.
-  If M is selected, the module will be called gamma.o.
-
-ATI Rage 128
-CONFIG_DRM40_R128
-  Choose this option if you have an ATI Rage 128 graphics card.  If M
-  is selected, the module will be called r128.o.  AGP support for
-  this card is strongly suggested (unless you have a PCI version).
-
-ATI Radeon
-CONFIG_DRM40_RADEON
-  Choose this option if you have an ATI Radeon graphics card.  There
-  are both PCI and AGP versions.  You don't need to choose this to
-  run the Radeon in plain VGA mode.  There is a product page at
-  <http://www.ati.com/na/pages/products/pc/radeon32/index.html>.
-  If M is selected, the module will be called radeon.o.
-
-Intel I810
-CONFIG_DRM40_I810
-  Choose this option if you have an Intel I810 graphics card.  If M is
-  selected, the module will be called i810.o.  AGP support is required
-  for this driver to work.
-
-Matrox G200/G400/G450
-CONFIG_DRM40_MGA
-  Choose this option if you have a Matrox G200, G400 or G450 graphics
-  card.  If M is selected, the module will be called mga.o.  AGP
-  support is required for this driver to work.
-
-Creator/Creator3D/Elite3D
-CONFIG_DRM_FFB
-  Choose this option if you have one of Sun's Creator3D-based graphics
-  and frame buffer cards.  Product page at
-  <http://www.sun.com/desktop/products/Graphics/creator3d.html>.
-
-MTRR (Memory Type Range Register) support
-CONFIG_MTRR
-  On Intel P6 family processors (Pentium Pro, Pentium II and later)
-  the Memory Type Range Registers (MTRRs) may be used to control
-  processor access to memory ranges. This is most useful if you have
-  a video (VGA) card on a PCI or AGP bus. Enabling write-combining
-  allows bus write transfers to be combined into a larger transfer
-  before bursting over the PCI/AGP bus. This can increase performance
-  of image write operations 2.5 times or more. Saying Y here creates a
-  /proc/mtrr file which may be used to manipulate your processor's
-  MTRRs. Typically the X server should use this.
-
-  This code has a reasonably generic interface so that similar
-  control registers on other processors can be easily supported
-  as well:
-
-  The Cyrix 6x86, 6x86MX and M II processors have Address Range
-  Registers (ARRs) which provide a similar functionality to MTRRs. For
-  these, the ARRs are used to emulate the MTRRs.
-  The AMD K6-2 (stepping 8 and above) and K6-3 processors have two
-  MTRRs. The Centaur C6 (WinChip) has 8 MCRs, allowing
-  write-combining. All of these processors are supported by this code
-  and it makes sense to say Y here if you have one of them.
-
-  Saying Y here also fixes a problem with buggy SMP BIOSes which only
-  set the MTRRs for the boot CPU and not for the secondary CPUs. This
-  can lead to all sorts of problems, so it's good to say Y here.
-
-  You can safely say Y even if your machine doesn't have MTRRs, you'll
-  just add about 9 KB to your kernel.
-
-  See <file:Documentation/mtrr.txt> for more information.
-
-CPU clock frequency of your DEC Alpha
-CONFIG_FT_ALPHA_CLOCK
-  On some DEC Alpha machines the CPU clock frequency cannot be
-  determined automatically, so you need to specify it here ONLY if
-  running a DEC Alpha, otherwise this setting has no effect.
-
-Double Talk PC internal speech card support
-CONFIG_DTLK
-  This driver is for the DoubleTalk PC, a speech synthesizer
-  manufactured by RC Systems (<http://www.rcsys.com/>).  It is also
-  called the `internal DoubleTalk'.  If you want to compile this as a
-  module ( = code which can be inserted in and removed from the
-  running kernel whenever you want), say M here and read
-  <file:Documentation/modules.txt>. The module will be called dtlk.o.
-
-Siemens R3964 serial protocol support
-CONFIG_R3964
-  This driver allows synchronous communication with devices using the
-  Siemens R3964 packet protocol. Unless you are dealing with special
-  hardware like PLCs, you are unlikely to need this.
-
-  To compile this driver as a module ( = code which can be inserted in
-  and removed from the running kernel whenever you want), say M here
-  and read <file:Documentation/modules.txt>. The module will be called
-  n_r3964.o.
-
-  If unsure, say N.
-
-Applicom intelligent fieldbus card support
-CONFIG_APPLICOM
-  This driver provides the kernel-side support for the intelligent
-  fieldbus cards made by Applicom International. More information
-  about these cards can be found on the WWW at the address
-  <http://www.applicom-int.com/>, or by email from David Woodhouse
-  <dwmw2@infradead.org>.
-
-  To compile this driver as a module ( = code which can be inserted in
-  and removed from the running kernel whenever you want), say M here
-  and read <file:Documentation/modules.txt>. The module will be called
-  applicom.o.
-
-  If unsure, say N.
-
-Sony Vaio Programmable I/O Control Device support
-CONFIG_SONYPI
-  This driver enables access to the Sony Programmable I/O Control
-  Device which can be found in many (all ?) Sony Vaio laptops.
-
-  If you have one of those laptops, read
-  <file:Documentation/sonypi.txt>, and say Y or M here.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called sonypi.o.
-
-Intel Random Number Generator support
-CONFIG_INTEL_RNG
-  This driver provides kernel-side support for the Random Number
-  Generator hardware found on Intel i8xx-based motherboards.
-
-  Both a character driver, used to read() entropy data, and a timer
-  function which automatically adds entropy directly into the
-  kernel pool, are exported by this driver.
-
-  To compile this driver as a module ( = code which can be inserted in
-  and removed from the running kernel whenever you want), say M here
-  and read <file:Documentation/modules.txt>. The module will be called
-  i810_rng.o.
-
-  If unsure, say N.
-
-Power Management support
-CONFIG_PM
-  "Power Management" means that parts of your computer are shut
-  off or put into a power conserving "sleep" mode if they are not
-  being used.  There are two competing standards for doing this: APM
-  and ACPI.  If you want to use either one, say Y here and then also
-  to the requisite support below.
-
-  Power Management is most important for battery powered laptop
-  computers; if you have a laptop, check out the Linux Laptop home
-  page on the WWW at
-  <http://www.cs.utexas.edu/users/kharker/linux-laptop/> and the
-  Battery Powered Linux mini-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  Note that, even if you say N here, Linux on the x86 architecture
-  will issue the hlt instruction if nothing is to be done, thereby
-  sending the processor to sleep and saving power.
-
-ACPI support
-CONFIG_ACPI
-  ACPI/OSPM support for Linux is currently under development. As such,
-  this support is preliminary and EXPERIMENTAL.  Configuring ACPI
-  support enables kernel interfaces that allow higher level software
-  (OSPM) to manipulate ACPI defined hardware and software interfaces,
-  including the evaluation of ACPI control methods.  If unsure, choose
-  N here.  Note, this option will enlarge your kernel by about 120K.
-
-  This support requires an ACPI compliant platform (hardware/firmware).
-  If both ACPI and Advanced Power Management (APM) support are
-  configured, whichever is loaded first shall be used.
-
-  This code DOES NOT currently provide a complete OSPM implementation
-  -- it has not yet reached APM's level of functionality.  When fully
-  implemented, Linux ACPI/OSPM will provide a more robust functional
-  replacement for legacy configuration and power management
-  interfaces, including the Plug-and-Play BIOS specification (PnP
-  BIOS), the Multi-Processor Specification (MPS), and the Advanced
-  Power Management specification (APM).
-
-  Linux support for ACPI/OSPM is based on Intel Corporation's ACPI
-  Component Architecture (ACPI CA). The latest ACPI CA source code,
-  documentation, debug builds, and implementation status information
-  can be downloaded from:
-  <http://developer.intel.com/technology/iapc/acpi/downloads.htm>.
-
-  The ACPI Sourceforge project may also be of interest:
-  <http://sf.net/projects/acpi/>
-
-Enable ACPI 2.0 with errata 1.3
-CONFIG_ACPI20
-  Enable support for the 2.0 version of the ACPI interpreter.  See the
-  help for ACPI for caveats and discussion.
-
-ACPI kernel configuration manager
-CONFIG_ACPI_KERNEL_CONFIG
-  If you say `Y' here, Linux's ACPI support will use the
-  hardware-level system descriptions found on IA64 machines.
-
-ACPI Debug Statements
-CONFIG_ACPI_DEBUG
-  The ACPI driver can optionally report errors with a great deal
-  of verbosity. Saying Y enables these statements. This will increase
-  your kernel size by around 50K.
-
-ACPI Bus Manager
-CONFIG_ACPI_BUSMGR
-  The ACPI Bus Manager enumerates devices in the ACPI namespace, and
-  handles PnP messages.  All ACPI devices use its services, so using
-  them requires saying Y here.
-
-ACPI System Driver
-CONFIG_ACPI_SYS
-  This driver will enable your system to shut down using ACPI, and
-  dump your ACPI DSDT table using /proc/acpi/dsdt.
-
-ACPI Processor Driver
-CONFIG_ACPI_CPU
-  This driver installs ACPI as the idle handler for Linux, and uses
-  ACPI C2 and C3 processor states to save power, on systems that
-  support it.
-
-ACPI Button
-CONFIG_ACPI_BUTTON
-  This driver registers for events based on buttons, such as the
-  power, sleep, and lid switch.  In the future, a daemon will read
-  /proc/acpi/event and perform user-defined actions such as shutting
-  down the system.  Until then, you can cat it, and see output when
-  a button is pressed.
-
-ACPI AC Adapter
-CONFIG_ACPI_AC
-  This driver adds support for the AC Adapter object, which indicates
-  whether a system is on AC, or not.  Typically, only laptops have
-  this object, since desktops are always on AC.
-
-ACPI Embedded Controller
-CONFIG_ACPI_EC
-  This driver is required on some systems for the proper operation of
-  the battery and thermal drivers.  If you are compiling for a laptop,
-  say Y.
-
-ACPI Control Method Battery
-CONFIG_ACPI_CMBATT
-  This driver adds support for battery information through
-  /proc/acpi/battery. If you have a laptop with a battery, say Y.
-
-ACPI Thermal
-CONFIG_ACPI_THERMAL
-  This driver handles overheating conditions on laptops. It is HIGHLY
-  recommended, as your laptop CPU may be damaged without it.
-
-Advanced Power Management BIOS support
-CONFIG_APM
-  APM is a BIOS specification for saving power using several different
-  techniques. This is mostly useful for battery powered laptops with
-  APM compliant BIOSes. If you say Y here, the system time will be
-  reset after a RESUME operation, the /proc/apm device will provide
-  battery status information, and user-space programs will receive
-  notification of APM "events" (e.g. battery status change).
-
-  If you select "Y" here, you can disable actual use of the APM
-  BIOS by passing the "apm=off" option to the kernel at boot time.
-
-  Note that the APM support is almost completely disabled for
-  machines with more than one CPU.
-
-  In order to use APM, you will need supporting software. For location
-  and more information, read <file:Documentation/pm.txt> and the
-  Battery Powered Linux mini-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>.
-
-  This driver does not spin down disk drives (see the hdparm(8)
-  manpage ("man 8 hdparm") for that), and it doesn't turn off
-  VESA-compliant "green" monitors.
-
-  This driver does not support the TI 4000M TravelMate and the ACER
-  486/DX4/75 because they don't have compliant BIOSes. Many "green"
-  desktop machines also don't have compliant BIOSes, and this driver
-  may cause those machines to panic during the boot phase.
-
-  Generally, if you don't have a battery in your machine, there isn't
-  much point in using this driver and you should say N. If you get
-  random kernel OOPSes or reboots that don't seem to be related to
-  anything, try disabling/enabling this option (or disabling/enabling
-  APM in your BIOS).
-
-  Some other things you should try when experiencing seemingly random,
-  "weird" problems:
-
-   1) make sure that you have enough swap space and that it is
-      enabled.
-   2) pass the "no-hlt" option to the kernel
-   3) switch on floating point emulation in the kernel and pass
-      the "no387" option to the kernel
-   4) pass the "floppy=nodma" option to the kernel
-   5) pass the "mem=4M" option to the kernel (thereby disabling
-      all but the first 4 MB of RAM)
-   6) make sure that the CPU is not over clocked.
-   7) read the sig11 FAQ at <http://www.bitwizard.nl/sig11/>
-   8) disable the cache from your BIOS settings
-   9) install a fan for the video card or exchange video RAM
-   10) install a better fan for the CPU
-   11) exchange RAM chips
-   12) exchange the motherboard.
-
-  To compile this driver as a module ( = code which can be inserted in
-  and removed from the running kernel whenever you want), say M here
-  and read <file:Documentation/modules.txt>. The module will be called
-  apm.o.
-
-Ignore USER SUSPEND
-CONFIG_APM_IGNORE_USER_SUSPEND
-  This option will ignore USER SUSPEND requests. On machines with a
-  compliant APM BIOS, you want to say N. However, on the NEC Versa M
-  series notebooks, it is necessary to say Y because of a BIOS bug.
-
-Enable APM at boot time
-CONFIG_APM_DO_ENABLE
-  Enable APM features at boot time. From page 36 of the APM BIOS
-  specification: "When disabled, the APM BIOS does not automatically
-  power manage devices, enter the Standby State, enter the Suspend
-  State, or take power saving steps in response to CPU Idle calls."
-  This driver will make CPU Idle calls when Linux is idle (unless this
-  feature is turned off -- see "Do CPU IDLE calls", below). This
-  should always save battery power, but more complicated APM features
-  will be dependent on your BIOS implementation. You may need to turn
-  this option off if your computer hangs at boot time when using APM
-  support, or if it beeps continuously instead of suspending. Turn
-  this off if you have a NEC UltraLite Versa 33/C or a Toshiba
-  T400CDT. This is off by default since most machines do fine without
-  this feature.
-
-Make CPU Idle calls when idle
-CONFIG_APM_CPU_IDLE
-  Enable calls to APM CPU Idle/CPU Busy inside the kernel's idle loop.
-  On some machines, this can activate improved power savings, such as
-  a slowed CPU clock rate, when the machine is idle. These idle calls
-  are made after the idle loop has run for some length of time (e.g.,
-  333 mS). On some machines, this will cause a hang at boot time or
-  whenever the CPU becomes idle. (On machines with more than one CPU,
-  this option does nothing.)
-
-Enable console blanking using APM
-CONFIG_APM_DISPLAY_BLANK
-  Enable console blanking using the APM. Some laptops can use this to
-  turn off the LCD backlight when the screen blanker of the Linux
-  virtual console blanks the screen. Note that this is only used by
-  the virtual console screen blanker, and won't turn off the backlight
-  when using the X Window system. This also doesn't have anything to
-  do with your VESA-compliant power-saving monitor. Further, this
-  option doesn't work for all laptops -- it might not turn off your
-  backlight at all, or it might print a lot of errors to the console,
-  especially if you are using gpm.
-
-RTC stores time in GMT
-CONFIG_APM_RTC_IS_GMT
-  Say Y here if your RTC (Real Time Clock a.k.a. hardware clock)
-  stores the time in GMT (Greenwich Mean Time). Say N if your RTC
-  stores localtime.
-
-  It is in fact recommended to store GMT in your RTC, because then you
-  don't have to worry about daylight savings time changes. The only
-  reason not to use GMT in your RTC is if you also run a broken OS
-  that doesn't understand GMT.
-
-Allow interrupts during APM BIOS calls
-CONFIG_APM_ALLOW_INTS
-  Normally we disable external interrupts while we are making calls to
-  the APM BIOS as a measure to lessen the effects of a badly behaving
-  BIOS implementation.  The BIOS should reenable interrupts if it
-  needs to.  Unfortunately, some BIOSes do not -- especially those in
-  many of the newer IBM Thinkpads.  If you experience hangs when you
-  suspend, try setting this to Y.  Otherwise, say N.
-
-Use real mode APM BIOS call to power off
-CONFIG_APM_REAL_MODE_POWER_OFF
-  Use real mode APM BIOS calls to switch off the computer. This is
-  a work-around for a number of buggy BIOSes. Switch this option on if
-  your computer crashes instead of powering off properly.
-
-Watchdog Timer Support
-CONFIG_WATCHDOG
-  If you say Y here (and to one of the following options) and create a
-  character special file /dev/watchdog with major number 10 and minor
-  number 130 using mknod ("man mknod"), you will get a watchdog, i.e.:
-  subsequently opening the file and then failing to write to it for
-  longer than 1 minute will result in rebooting the machine. This
-  could be useful for a networked machine that needs to come back
-  online as fast as possible after a lock-up. There's both a watchdog
-  implementation entirely in software (which can sometimes fail to
-  reboot the machine) and a driver for hardware watchdog boards, which
-  are more robust and can also keep track of the temperature inside
-  your computer. For details, read <file:Documentation/watchdog.txt>
-  in the kernel source.
-
-  The watchdog is usually used together with the watchdog daemon
-  which is available from
-  <ftp://ibiblio.org/pub/Linux/system/daemons/watchdog/>. This daemon can
-  also monitor NFS connections and can reboot the machine when the process
-  table is full.
-
-  If unsure, say N.
-
-Disable watchdog shutdown on close
-CONFIG_WATCHDOG_NOWAYOUT
-  The default watchdog behaviour (which you get if you say N here) is
-  to stop the timer if the process managing it closes the file
-  /dev/watchdog. It's always remotely possible that this process might
-  get killed. If you say Y here, the watchdog cannot be stopped once
-  it has been started.
-
-WDT Watchdog timer
-CONFIG_WDT
-  If you have a WDT500P or WDT501P watchdog board, say Y here,
-  otherwise N. It is not possible to probe for this board, which means
-  that you have to inform the kernel about the IO port and IRQ using
-  the "wdt=" kernel option (try "man bootparam" or see the
-  documentation of your boot loader (lilo or loadlin) about how to
-  pass options to the kernel at boot time).
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called wdt.o.
-
-WDT PCI Watchdog timer
-CONFIG_WDTPCI
-  If you have a PCI WDT500/501 watchdog board, say Y here, otherwise
-  N.  It is not possible to probe for this board, which means that you
-  have to inform the kernel about the IO port and IRQ using the "wdt="
-  kernel option (try "man bootparam" or see the documentation of your
-  boot loader (lilo or loadlin) about how to pass options to the
-  kernel at boot time).
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called wdt_pci.o.
-
-WDT501 features
-CONFIG_WDT_501
-  Saying Y here and creating a character special file /dev/temperature
-  with major number 10 and minor number 131 ("man mknod") will give
-  you a thermometer inside your computer: reading from
-  /dev/temperature yields one byte, the temperature in degrees
-  Fahrenheit. This works only if you have a WDT501P watchdog board
-  installed.
-
-Fan Tachometer
-CONFIG_WDT_501_FAN
-  Enable the Fan Tachometer on the WDT501. Only do this if you have a
-  fan tachometer actually set up.
-
-Software Watchdog
-CONFIG_SOFT_WATCHDOG
-  A software monitoring watchdog. This will fail to reboot your system
-  from some situations that the hardware watchdog will recover
-  from. Equally it's a lot cheaper to install.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-   softdog.o.
-
-Berkshire Products PC Watchdog
-CONFIG_PCWATCHDOG
-  This is the driver for the Berkshire Products PC Watchdog card.
-  This card simply watches your kernel to make sure it doesn't freeze,
-  and if it does, it reboots your computer after a certain amount of
-  time. This driver is like the WDT501 driver but for different
-  hardware. Please read <file:Documentation/pcwd-watchdog.txt>. The PC
-  watchdog cards can be ordered from <http://www.berkprod.com/>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module is called pcwd.o. If you want to compile it as a module,
-  say M here and read <file:Documentation/modules.txt>.
-
-  Most people will say N.
-
-Acquire SBC Watchdog Timer
-CONFIG_ACQUIRE_WDT
-  This is the driver for the hardware watchdog on the PSC-6x86 Single
-  Board Computer produced by Acquire Inc (and others).  This watchdog
-  simply watches your kernel to make sure it doesn't freeze, and if
-  it does, it reboots your computer after a certain amount of time.
-
-  This driver is like the WDT501 driver but for different hardware.
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module is called pscwdt.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.  Most
-  people will say N.
-
-Advantech SBC Watchdog Timer
-CONFIG_ADVANTECH_WDT
-  If you are configuring a Linux kernel for the Advantech single-board
-  computer, say `Y' here to support its built-in watchdog timer
-  feature.  See the help for CONFIG_WATCHDOG for discussion.
-
-ALi M7101 Watchdog Timer
-CONFIG_ALIM7101_WDT
-  This is the driver for the hardware watchdog on the ALi M7101 PMU
-  as used in the x86 Cobalt servers.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module is called alim7101_wdt.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.  Most
-  people will say N.
-
-IB700 SBC Watchdog Timer
-CONFIG_IB700_WDT
-  This is the driver for the hardware watchdog on the IB700 Single
-  Board Computer produced by TMC Technology (www.tmc-uk.com). This watchdog
-  simply watches your kernel to make sure it doesn't freeze, and if
-  it does, it reboots your computer after a certain amount of time.
-
-  This driver is like the WDT501 driver but for slightly different hardware.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module is called ib700wdt.o. If you want to compile it as a
-  module, say M here and read Documentation/modules.txt. Most people
-  will say N.
-
-Mixcom Watchdog
-CONFIG_MIXCOMWD
-  This is a driver for the Mixcom hardware watchdog cards.  This
-  watchdog simply watches your kernel to make sure it doesn't freeze,
-  and if it does, it reboots your computer after a certain amount of
-  time.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module is called mixcomwd.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.  Most
-  people will say N.
-
-ZF MachZ Watchdog
-CONFIG_MACHZ_WDT
-  If you are using a ZF Micro MachZ processor, say Y here, otherwise
-  N.  This is the driver for the watchdog timer builtin on that
-  processor using ZF-Logic interface.  This watchdog simply watches
-  your kernel to make sure it doesn't freeze, and if it does, it
-  reboots your computer after a certain amount of time.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module is called machzwd.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-CONFIG_SC1200_WDT
-  This is a driver for National Semiconductor PC87307/PC97307 hardware
-  watchdog cards as found on the SC1200. This watchdog is mainly used
-  for power management purposes and can be used to power down the device
-  during inactivity periods (includes interrupt activity monitoring).
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module is called sc1200wdt.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.  Most
-  people will say N.
-
-SuperH Watchdog
-CONFIG_SH_WDT
-  This driver adds watchdog support for the integrated watchdog in the
-  SuperH 3, 4 and 5 processors. If you have one of these processors, say
-  Y, otherwise say N.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module is called shwdt.o. If you want to compile it as a module,
-  say M here and read Documentation/modules.txt.
-
-Wafer 5823 Watchdog
-CONFIG_WAFER_WDT
-  This is a driver for the hardware watchdog on the ICP Wafer 5823
-  Single Board Computer (and probably other similar models).
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  wafer5823wdt.o
-             
-Machine Check Exception
-CONFIG_X86_MCE
-  Machine Check Exception support allows the processor to notify the
-  kernel if it detects a problem (e.g. overheating, component failure).
-  The action the kernel takes depends on the severity of the problem, 
-  ranging from a warning message on the console, to halting the machine.
-  You can safely select this on machines that do not support this feature.
-
-  For pentium machines the mce support defaults to off as the mainboard
-  support is not always present. You must activate it as a boot option.
-
-Toshiba Laptop support
-CONFIG_TOSHIBA
-  This adds a driver to safely access the System Management Mode of
-  the CPU on Toshiba portables with a genuine Toshiba BIOS. It does
-  not work on models with a Phoenix BIOS. The System Management Mode
-  is used to set the BIOS and power saving options on Toshiba portables.
-
-  For information on utilities to make use of this driver see the
-  Toshiba Linux utilities web site at:
-  <http://www.buzzard.org.uk/toshiba/>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  toshiba.o
-
-  Say Y if you intend to run this kernel on a Toshiba portable.
-  Say N otherwise.
-
-Dell laptop support
-CONFIG_I8K
-  This adds a driver to safely access the System Management Mode
-  of the CPU on the Dell Inspiron and Latitude laptops. The System
-  Management Mode is used to read cpu temperature, cooling fan
-  status and Fn-keys status on Dell laptops. It can also be used
-  to switch the fans on and off.
-
-  The driver has been developed and tested on an Inspiron 8000
-  but it should work on any Dell Inspiron or Latitude laptop.
-  You can force loading on unsupported models by passing the
-  parameter `force=1' to the module. Use at your own risk.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  i8k.o
-
-  For more information on this driver and for utilities that make
-  use of the module see the I8K Linux Utilities web site at:
-  <http://www.debian.org/~dz/i8k/>.
-
-  Say Y if you intend to run this kernel on a Dell laptop.
-  Say N otherwise.
-
-/dev/cpu/microcode - Intel IA32 CPU microcode support
-CONFIG_MICROCODE
-  If you say Y here and also to "/dev file system support" in the
-  'File systems' section, you will be able to update the microcode on
-  Intel processors in the IA32 family, e.g. Pentium Pro, Pentium II,
-  Pentium III, Pentium 4, Xeon etc.  You will obviously need the
-  actual microcode binary data itself which is not shipped with the
-  Linux kernel.
-
-  For latest news and information on obtaining all the required
-  ingredients for this driver, check:
-  <http://www.urbanmyth.org/microcode/>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called microcode.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.  If
-  you use modprobe or kmod you may also want to add the line
-  'alias char-major-10-184 microcode' to your /etc/modules.conf file.
-
-/dev/cpu/*/msr - Model-specific register support
-CONFIG_X86_MSR
-  This device gives privileged processes access to the x86
-  Model-Specific Registers (MSRs).  It is a character device with
-  major 202 and minors 0 to 31 for /dev/cpu/0/msr to /dev/cpu/31/msr.
-  MSR accesses are directed to a specific CPU on multi-processor
-  systems.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  msr.o
-
-/dev/cpu/*/cpuid - CPU information support
-CONFIG_X86_CPUID
-  This device gives processes access to the x86 CPUID instruction to
-  be executed on a specific processor.  It is a character device
-  with major 203 and minors 0 to 31 for /dev/cpu/0/cpuid to
-  /dev/cpu/31/cpuid.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  cpuid.o
-
-SBC-60XX Watchdog Timer
-CONFIG_60XX_WDT
- This driver can be used with the watchdog timer found on some
- single board computers, namely the 6010 PII based computer.
- It may well work with other cards.  It reads port 0x443 to enable
- and re-set the watchdog timer, and reads port 0x45 to disable
- the watchdog.  If you have a card that behave in similar ways,
- you can probably make this driver work with your card as well.
-
- You can compile this driver directly into the kernel, or use
- it as a module.  The module will be called sbc60xxwdt.o.
-
-Eurotech CPU-1220/1410 Watchdog Timer
-CONFIG_EUROTECH_WDT
-  Enable support for the watchdog timer on the Eurotech CPU-1220 and 
-  CPU-1410 cards.  These are PC/104 SBCs. Spec sheets and product 
-  information are at <http://www.eurotech.it/>.
-
-W83877F Watchdog Timer
-CONFIG_W83877F_WDT
- This is the driver for the hardware watchdog on the W83877F chipset
- as used in EMACS PC-104 motherboards (and may work on others). This
- watchdog simply watches your kernel to make sure it doesn't freeze,
- and if it does, it reboots your computer after a certain amount of
- time.
-
- You can compile this driver directly into the kernel, or use
- it as a module.  The module will be called w83877f_wdt.o.
-
-SC520 (AMD Elan) Watchdog Timer
-CONFIG_SC520_WDT
- This is the driver for the hardware watchdog built in to the
- AMD "Elan" SC520 microcomputer commonly used in embedded systems.
- This watchdog simply watches your kernel to make sure it doesn't
- freeze, and if it does, it reboots your computer after a certain
- amount of time.
-
- You can compile this driver directly into the kernel, or use
- it as a module.  The module will be called sc520_wdt.o.
-
-Enhanced Real Time Clock Support
-CONFIG_RTC
-  If you say Y here and create a character special file /dev/rtc with
-  major number 10 and minor number 135 using mknod ("man mknod"), you
-  will get access to the real time clock (or hardware clock) built
-  into your computer.
-
-  Every PC has such a clock built in. It can be used to generate
-  signals from as low as 1Hz up to 8192Hz, and can also be used
-  as a 24 hour alarm. It reports status information via the file
-  /proc/driver/rtc and its behaviour is set by various ioctls on
-  /dev/rtc.
-
-  If you run Linux on a multiprocessor machine and said Y to
-  "Symmetric Multi Processing" above, you should say Y here to read
-  and set the RTC in an SMP compatible fashion.
-
-  If you think you have a use for such a device (such as periodic data
-  sampling), then say Y here, and read <file:Documentation/rtc.txt>
-  for details.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module is called rtc.o. If you want to compile it as a module,
-  say M here and read <file:Documentation/modules.txt>.
-
-Generic Real Time Clock Support
-CONFIG_GEN_RTC
-  If you say Y here and create a character special file /dev/rtc with
-  major number 10 and minor number 135 using mknod ("man mknod"), you
-  will get access to the real time clock (or hardware clock) built
-  into your computer.
-
-  In 2.4 and later kernels this is the only way to set and get rtc
-  time on m68k systems so it is highly recommended.
-
-  It reports status information via the file /proc/driver/rtc and its 
-  behaviour is set by various ioctls on /dev/rtc. If you enable the
-  "extended RTC operation" below it will also provide an emulation
-  for RTC_UIE which is required by some programs and may improve
-  precision in some cases.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module is called genrtc.o. If you want to compile it as a module,
-  say M here and read <file:Documentation/modules.txt>. To load the
-  module automatically add 'alias char-major-10-135 genrtc' to your
-  /etc/modules.conf
-
-Extended RTC operation
-CONFIG_GEN_RTC_X
-  Provides an emulation for RTC_UIE which is required by some programs 
-  and may improve precision of the generic RTC support in some cases.
-
-Tadpole ANA H8 Support
-CONFIG_H8
-  The Hitachi H8/337 is a microcontroller used to deal with the power
-  and thermal environment. If you say Y here, you will be able to
-  communicate with it via a character special device.
-
-  If unsure, say N.
-
-/dev/nvram support
-CONFIG_NVRAM
-  If you say Y here and create a character special file /dev/nvram
-  with major number 10 and minor number 144 using mknod ("man mknod"),
-  you get read and write access to the extra bytes of non-volatile
-  memory in the real time clock (RTC), which is contained in every PC
-  and most Ataris.  The actual number of bytes varies, depending on the
-  nvram in the system, but is usually 114 (128-14 for the RTC).
-
-  This memory is conventionally called "CMOS RAM" on PCs and "NVRAM"
-  on Ataris. /dev/nvram may be used to view settings there, or to
-  change them (with some utility). It could also be used to frequently
-  save a few bits of very important data that may not be lost over
-  power-off and for which writing to disk is too insecure. Note
-  however that most NVRAM space in a PC belongs to the BIOS and you
-  should NEVER idly tamper with it. See Ralf Brown's interrupt list
-  for a guide to the use of CMOS bytes by your BIOS.
-
-  On Atari machines, /dev/nvram is always configured and does not need
-  to be selected.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called nvram.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Joystick support
-CONFIG_JOYSTICK
-  If you have a joystick, 6dof controller, gamepad, steering wheel,
-  weapon control system or something like that you can say Y here to
-  enable generic support for these controllers. You will also need to
-  say Y or M to at least one of the hardware specific drivers. This
-  will make the controllers available as /dev/input/jsX devices.
-  Please read the file <file:Documentation/input/joystick.txt> which
-  contains more information and the location of the joystick package
-  that you'll need.
-
-Game port support
-CONFIG_INPUT_GAMEPORT
-  Gameport support is for the standard 15-pin PC gameport.  If you
-  have a joystick, gamepad, gameport card, a soundcard with a gameport
-  or anything else that uses the gameport, say Y or M here and also to
-  at least one of the hardware specific drivers.
-  Please read the file <file:Documentation/input/joystick.txt> which
-  contains more information and the location of the joystick package
-  that you'll need if you use the gameport with a joystick.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called gameport.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-Classic ISA/PnP gameports
-CONFIG_INPUT_NS558
-  Say Y here if you have an ISA or PnP gameport.
-  For more information on how to use the driver please read
-  <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ns558.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-PDPI Lightning 4 gamecard
-CONFIG_INPUT_LIGHTNING
-  Say Y here if you have a PDPI Lightning 4 gamecard. For more
-  information on how to use the driver please read
-  <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called lightning.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-Crystal SoundFusion gameports
-CONFIG_INPUT_CS461X
-  Say Y here if you have a Cirrus CS461x aka "Crystal SoundFusion"
-  PCI audio accelerator.  A product page for the CS4614 is at
-  <http://www.cirrus.com/design/products/overview/index.cfm?ProductID=40>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called cs461x.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Aureal Vortex, Trident 4DWave, and ALi 5451 gameports
-CONFIG_INPUT_PCIGAME
-  Say Y here if you have a Trident 4DWave DX/NX or Aureal Vortex 1/2
-  card or an ALi 5451 chip on your motherboard. For more information
-  on how to use the driver please read
-  <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called pcigame.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-SoundBlaster Live! gameports
-CONFIG_INPUT_EMU10K1
-  Say Y here if you have a SoundBlaster Live! card and want to use
-  its gameport.  For more information on how to use the driver
-  please read <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called emu10k1-gp.o. If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-Classic PC analog joysticks and gamepads
-CONFIG_INPUT_ANALOG
-  Say Y here if you have a controller that connects to the PC
-  gameport.  This supports many different types, including joysticks
-  with throttle control, with rudders, or with extensions like
-  additional hats and buttons compatible with CH Flightstick Pro,
-  ThrustMaster FCS, 6 and 8 button gamepads, or Saitek Cyborg
-  joysticks.  For more information on how to use the driver please
-  read <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called analog.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Assassin 3D and MadCatz Panther devices
-CONFIG_INPUT_A3D
-  Say Y here if you have an FPGaming or MadCatz controller using the
-  A3D protocol over the PC gameport.  For more information on how to
-  use the driver please read <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called a3d.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Logitech ADI digital joysticks and gamepads
-CONFIG_INPUT_ADI
-  Say Y here if you have a Logitech controller using the ADI
-  protocol over the PC gameport. For more information on how to use
-  the driver please read <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called adi.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Creative Labs Blaster Cobra gamepad
-CONFIG_INPUT_COBRA
-  Say Y here if you have a Creative Labs Blaster Cobra gamepad.
-  For more information on how to use the driver please read
-  <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called cobra.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Genius Flight2000 Digital joysticks and gamepads
-CONFIG_INPUT_GF2K
-  Say Y here if you have a Genius Flight2000 or MaxFighter digitally
-  communicating joystick or gamepad.  For more information on how to
-  use the driver please read <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called gf2k.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Gravis GrIP joysticks and gamepads
-CONFIG_INPUT_GRIP
-  Say Y here if you have a Gravis controller using the GrIP protocol
-  over the PC gameport.  For more information on how to use the driver
-  please read <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called grip.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-InterAct digital joysticks and gamepads
-CONFIG_INPUT_INTERACT
-  Say Y hereif you have an InterAct gameport or joystick
-  communicating digitally over the gameport.  For more information on
-  how to use the driver please read <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called interact.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-ThrustMaster DirectConnect joysticks and gamepads
-CONFIG_INPUT_TMDC
-  Say Y here if you have a ThrustMaster controller using the
-  DirectConnect (BSP) protocol over the PC gameport.  For more
-  information on how to use the driver please read
-  <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called tmdc.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Microsoft SideWinder digital joysticks and gamepads
-CONFIG_INPUT_SIDEWINDER
-  Say Y here if you have a Microsoft controller using the Digital
-  Overdrive protocol over PC gameport.  For more information on how to
-  use the driver please read <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called sidewinder.o.  If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-Serial port device support
-CONFIG_INPUT_SERIO
-  Say Y here and to the Serial port input line discipline option if
-  you plan to use a joystick that communicates over the serial (COM)
-  port.  For more information on how to use the driver please read
-  <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called sidewinder.o.  If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-Serial port input line discipline
-CONFIG_INPUT_SERPORT
-  Say Y here if you plan to use a joystick that communicates over the
-  serial (COM) port.  For more information on how to use the driver
-  please read <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called serport.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Logitech WingMan Warrior joystick
-CONFIG_INPUT_WARRIOR
-  Say Y here if you have a Logitech WingMan Warrior joystick connected
-  to your computer's serial port.  For more information on how to use
-  the driver please read <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called warrior.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-LogiCad3d Magellan/SpaceMouse 6dof controller
-CONFIG_INPUT_MAGELLAN
-  Say Y here if you have a Magellan or Space Mouse 6DOF controller
-  connected to your computer's serial port.  For more information on
-  how to use the driver please read <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called magellan.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-SpaceTec SpaceOrb/Avenger 6dof controller
-CONFIG_INPUT_SPACEORB
-  Say Y here if you have a SpaceOrb 360 or SpaceBall Avenger 6DOF
-  controller connected to your computer's serial port.  For more
-  information on how to use the driver please read
-  <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called spaceorb.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-SpaceTec SpaceBall 4000 FLX 6dof controller
-CONFIG_INPUT_SPACEBALL
-  Say Y here if you have a SpaceTec SpaceBall 4000 FLX controller
-  connected to your computer's serial port.  For more information on
-  how to use the driver please read <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called spaceball.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-Gravis Stinger gamepad
-CONFIG_INPUT_STINGER
-  Say Y here if you have a Gravis Stinger connected to one of your
-  serial ports.  For more information on how to use the driver please
-  read <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called stinger.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-I-Force joysticks/wheels
-CONFIG_INPUT_IFORCE_232
-  Say Y here if you have an I-Force joystick or steering wheel
-  connected to your serial (COM) port.  For more information on how
-  to use the driver please read <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called iforce.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-I-Force joysticks/wheels
-CONFIG_INPUT_IFORCE_USB
-  Say Y here if you have an I-Force joystick or steering wheel
-  connected to your USB port.  For more information on how to use the
-  driver please read <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called iforce.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Multisystem, Sega Genesis, Saturn joysticks and gamepads
-CONFIG_INPUT_DB9
-  Say Y here if you have a Sega Master System gamepad, Sega Genesis
-  gamepad, Sega Saturn gamepad, or a Multisystem -- Atari, Amiga,
-  Commodore, Amstrad CPC joystick connected to your parallel port.
-  For more information on how to use the driver please read
-  <file:Documentation/input/joystick.txt> and
-  <file:Documentation/input/joystick-parport.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called db9.o.  If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Multisystem, NES, SNES, N64, PSX joysticks and gamepads
-CONFIG_INPUT_GAMECON
-  Say Y here if you have a Nintendo Entertainment System gamepad,
-  Super Nintendo Entertainment System gamepad, Nintendo 64 gamepad,
-  Sony PlayStation gamepad or a Multisystem -- Atari, Amiga,
-  Commodore, Amstrad CPC joystick connected to your parallel port.
-  For more information on how to use the driver please read
-  <file:Documentation/input/joystick.txt> and
-  <file:Documentation/input/joystick-parport.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called gamecon.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Multisystem joysticks via TurboGraFX device
-CONFIG_INPUT_TURBOGRAFX
-  Say Y here if you have the TurboGraFX interface by Steffen Schwenke,
-  and want to use it with Multisystem -- Atari, Amiga, Commodore,
-  Amstrad CPC joystick.  For more information on how to use the driver
-  please read <file:Documentation/input/joystick.txt> and
-  <file:Documentation/input/joystick-parport.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called turbografx.o.  If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-Amiga joysticks
-CONFIG_INPUT_AMIJOY
-  Say Y here if you have an Amiga with a digital joystick connected
-  to it.  For more information on how to use the driver please read
-  <file:Documentation/input/joystick.txt>.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called joy-amiga.o.  If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-Atomwide serial port support
-CONFIG_ATOMWIDE_SERIAL
-  If you have an Atomwide Serial card for an Acorn system, say Y to
-  this option.  The driver can handle 1, 2, or 3 port cards.
-  If unsure, say N.
-
-Dual serial port support
-CONFIG_DUALSP_SERIAL
-  If you have the Serial Port's dual serial card for an Acorn system,
-  say Y to this option.  If unsure, say N.
-
-NetWinder Button
-CONFIG_NWBUTTON
-  If you say Y here and create a character device node /dev/nwbutton
-  with major and minor numbers 10 and 158 ("man mknod"), then every
-  time the orange button is pressed a number of times, the number of
-  times the button was pressed will be written to that device.
-
-  This is most useful for applications, as yet unwritten, which
-  perform actions based on how many times the button is pressed in a
-  row.
-
-  Do not hold the button down for too long, as the driver does not
-  alter the behaviour of the hardware reset circuitry attached to the
-  button; it will still execute a hard reset if the button is held
-  down for longer than approximately five seconds.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  The module will be called
-  nwbutton.o.
-
-  Most people will answer Y to this question and "Reboot Using Button"
-  below to be able to initiate a system shutdown from the button.
-
-Reboot Using Button
-CONFIG_NWBUTTON_REBOOT
-  If you say Y here, then you will be able to initiate a system
-  shutdown and reboot by pressing the orange button a number of times.
-  The number of presses to initiate the shutdown is two by default,
-  but this can be altered by modifying the value of NUM_PRESSES_REBOOT
-  in nwbutton.h and recompiling the driver or, if you compile the
-  driver as a module, you can specify the number of presses at load
-  time with "insmod button reboot_count=<something>".
-
-Sound card support
-CONFIG_SOUND
-  If you have a sound card in your computer, i.e. if it can say more
-  than an occasional beep, say Y.  Be sure to have all the information
-  about your sound card and its configuration down (I/O port,
-  interrupt and DMA channel), because you will be asked for it.
-
-  You want to read the Sound-HOWTO, available from
-  <http://www.tldp.org/docs.html#howto>. General information about
-  the modular sound system is contained in the files
-  <file:Documentation/sound/Introduction>.  The file
-  <file:Documentation/sound/README.OSS> contains some slightly
-  outdated but still useful information as well.
-
-  If you have a PnP sound card and you want to configure it at boot
-  time using the ISA PnP tools (read
-  <http://www.roestock.demon.co.uk/isapnptools/>), then you need to
-  compile the sound card support as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want)
-  and load that module after the PnP configuration is finished.  To do
-  this, say M here and read <file:Documentation/modules.txt> as well
-  as <file:Documentation/sound/README.modules>; the module will be
-  called soundcore.o.
-
-  I'm told that even without a sound card, you can make your computer
-  say more than an occasional beep, by programming the PC speaker.
-  Kernel patches and supporting utilities to do that are in the pcsp
-  package, available at <ftp://ftp.infradead.org/pub/pcsp/>.
-
-OSS sound modules
-CONFIG_SOUND_OSS
-  OSS is the Open Sound System suite of sound card drivers.  They make
-  sound programming easier since they provide a common API.  Say Y or
-  M here (the module will be called sound.o) if you haven't found a
-  driver for your sound card above, then pick your driver from the
-  list below.
-
-Persistent DMA buffers
-CONFIG_SOUND_DMAP
-  Linux can often have problems allocating DMA buffers for ISA sound
-  cards on machines with more than 16MB of RAM. This is because ISA
-  DMA buffers must exist below the 16MB boundary and it is quite
-  possible that a large enough free block in this region cannot be
-  found after the machine has been running for a while. If you say Y
-  here the DMA buffers (64Kb) will be allocated at boot time and kept
-  until the shutdown. This option is only useful if you said Y to
-  "OSS sound modules", above. If you said M to "OSS sound modules"
-  then you can get the persistent DMA buffer functionality by passing
-  the command-line argument "dmabuf=1" to the sound.o module.
-
-  Say Y unless you have 16MB or less RAM or a PCI sound card.
-
-Support for Aztech Sound Galaxy (non-PnP) cards
-CONFIG_SOUND_SGALAXY
-  This module initializes the older non Plug and Play sound galaxy
-  cards from Aztech. It supports the Waverider Pro 32 - 3D and the
-  Galaxy Washington 16.
-
-  If you compile the driver into the kernel, you have to add
-  "sgalaxy=<io>,<irq>,<dma>,<dma2>,<sgbase>" to the kernel command
-  line.
-
-Support for AD1816(A) based cards
-CONFIG_SOUND_AD1816
-  Say M here if you have a sound card based on the Analog Devices
-  AD1816(A) chip.
-
-  If you compile the driver into the kernel, you have to add
-  "ad1816=<io>,<irq>,<dma>,<dma2>" to the kernel command line.
-
-Yamaha OPL3-SA1 audio controller
-CONFIG_SOUND_OPL3SA1
-  Say Y or M if you have a Yamaha OPL3-SA1 sound chip, which is
-  usually built into motherboards. Read
-  <file:Documentation/sound/OPL3-SA> for details.
-
-  If you compile the driver into the kernel, you have to add
-  "opl3sa=<io>,<irq>,<dma>,<dma2>,<mpuio>,<mpuirq>" to the kernel
-  command line.
-
-ProAudioSpectrum 16 support
-CONFIG_SOUND_PAS
-  Answer Y only if you have a Pro Audio Spectrum 16, ProAudio Studio
-  16 or Logitech SoundMan 16 sound card. Answer N if you have some
-  other card made by Media Vision or Logitech since those are not
-  PAS16 compatible. Please read <file:Documentation/sound/PAS16>.
-  It is not necessary to add Sound Blaster support separately; it
-  is included in PAS support.
-
-  If you compile the driver into the kernel, you have to add
-  "pas2=<io>,<irq>,<dma>,<dma2>,<sbio>,<sbirq>,<sbdma>,<sbdma2>
-  to the kernel command line.
-
-Enable PAS16 joystick port
-CONFIG_PAS_JOYSTICK
-  Say Y here to enable the Pro Audio Spectrum 16's auxiliary joystick
-  port.
-
-100% Sound Blaster compatibles (SB16/32/64, ESS, Jazz16) support
-CONFIG_SOUND_SB
-  Answer Y if you have an original Sound Blaster card made by Creative
-  Labs or a 100% hardware compatible clone (like the Thunderboard or
-  SM Games). For an unknown card you may answer Y if the card claims
-  to be Sound Blaster-compatible.
-
-  Please read the file <file:Documentation/sound/Soundblaster>.
-
-  You should also say Y here for cards based on the Avance Logic
-  ALS-007 and ALS-1X0 chips (read <file:Documentation/sound/ALS>) and
-  for cards based on ESS chips (read
-  <file:Documentation/sound/ESS1868> and
-  <file:Documentation/sound/ESS>). If you have an SB AWE 32 or SB AWE
-  64, say Y here and also to "AWE32 synth" below and read
-  <file:Documentation/sound/INSTALL.awe>. If you have an IBM Mwave
-  card, say Y here and read <file:Documentation/sound/mwave>.
-
-  If you compile the driver into the kernel and don't want to use
-  isapnp, you have to add "sb=<io>,<irq>,<dma>,<dma2>" to the kernel
-  command line.
-
-  You can say M here to compile this driver as a module; the module is
-  called sb.o.
-
-Gravis Ultrasound support
-CONFIG_SOUND_GUS
-  Say Y here for any type of Gravis Ultrasound card, including the GUS
-  or GUS MAX.  See also <file:Documentation/sound/ultrasound> for more
-  information on configuring this card with modules.
-
-  If you compile the driver into the kernel, you have to add
-  "gus=<io>,<irq>,<dma>,<dma2>" to the kernel command line.
-
-MPU-401 support (NOT for SB16)
-CONFIG_SOUND_MPU401
-  Be careful with this question.  The MPU401 interface is supported by
-  all sound cards.  However, some natively supported cards have their
-  own driver for MPU401.  Enabling this MPU401 option with these cards
-  will cause a conflict.  Also, enabling MPU401 on a system that
-  doesn't really have a MPU401 could cause some trouble.  If your card
-  was in the list of supported cards, look at the card specific
-  instructions in the <file:Documentation/sound/README.OSS> file.  It
-  is safe to answer Y if you have a true MPU401 MIDI interface card.
-
-  If you compile the driver into the kernel, you have to add
-  "mpu401=<io>,<irq>" to the kernel command line.
-
-6850 UART support
-CONFIG_SOUND_UART6850
-  This option enables support for MIDI interfaces based on the 6850
-  UART chip. This interface is rarely found on sound cards. It's safe
-  to answer N to this question.
-
-  If you compile the driver into the kernel, you have to add
-  "uart6850=<io>,<irq>" to the kernel command line.
-
-PSS (AD1848, ADSP-2115, ESC614) support
-CONFIG_SOUND_PSS
-  Answer Y or M if you have an Orchid SW32, Cardinal DSP16, Beethoven
-  ADSP-16 or some other card based on the PSS chipset (AD1848 codec +
-  ADSP-2115 DSP chip + Echo ESC614 ASIC CHIP). For more information on
-  how to compile it into the kernel or as a module see the file
-  <file:Documentation/sound/PSS>.
-
-  If you compile the driver into the kernel, you have to add
-  "pss=<io>,<mssio>,<mssirq>,<mssdma>,<mpuio>,<mpuirq>" to the kernel
-  command line.
-
-Enable PSS mixer (Beethoven ADSP-16 and other compatible)
-CONFIG_PSS_MIXER
-  Answer Y for Beethoven ADSP-16. You may try to say Y also for other
-  cards if they have master volume, bass, treble, and you can't
-  control it under Linux. If you answer N for Beethoven ADSP-16, you
-  can't control master volume, bass, treble and synth volume.
-
-  If you said M to "PSS support" above, you may enable or disable this
-  PSS mixer with the module parameter pss_mixer. For more information
-  see the file <file:Documentation/sound/PSS>.
-
-Have DSPxxx.LD firmware file
-CONFIG_PSS_HAVE_BOOT
-  If you have the DSPxxx.LD file or SYNTH.LD file for you card, say Y
-  to include this file. Without this file the synth device (OPL) may
-  not work.
-
-Full pathname of DSPxxx.LD firmware file
-CONFIG_PSS_BOOT_FILE
-  Enter the full pathname of your DSPxxx.LD file or SYNTH.LD file,
-  starting from /.
-
-Microsoft Sound System support
-CONFIG_SOUND_MSS
-  Again think carefully before answering Y to this question.  It's
-  safe to answer Y if you have the original Windows Sound System card
-  made by Microsoft or Aztech SG 16 Pro (or NX16 Pro).  Also you may
-  say Y in case your card is NOT among these:
-
-     ATI Stereo F/X, AdLib, Audio Excell DSP16, Cardinal DSP16,
-     Ensoniq SoundScape (and compatibles made by Reveal and Spea),
-     Gravis Ultrasound, Gravis Ultrasound ACE, Gravis Ultrasound Max,
-     Gravis Ultrasound with 16 bit option, Logitech Sound Man 16,
-     Logitech SoundMan Games, Logitech SoundMan Wave, MAD16 Pro (OPTi
-     82C929), Media Vision Jazz16, MediaTriX AudioTriX Pro, Microsoft
-     Windows Sound System (MSS/WSS), Mozart (OAK OTI-601), Orchid
-     SW32, Personal Sound System (PSS), Pro Audio Spectrum 16, Pro
-     Audio Studio 16, Pro Sonic 16, Roland MPU-401 MIDI interface,
-     Sound Blaster 1.0, Sound Blaster 16, Sound Blaster 16ASP, Sound
-     Blaster 2.0, Sound Blaster AWE32, Sound Blaster Pro, TI TM4000M
-     notebook, ThunderBoard, Turtle Beach Tropez, Yamaha FM
-     synthesizers (OPL2, OPL3 and OPL4), 6850 UART MIDI Interface.
-
-  For cards having native support in VoxWare, consult the card
-  specific instructions in <file:Documentation/sound/README.OSS>.
-  Some drivers have their own MSS support and saying Y to this option
-  will cause a conflict.
-
-  If you compile the driver into the kernel, you have to add
-  "ad1848=<io>,<irq>,<dma>,<dma2>[,<type>]" to the kernel command
-  line.
-
-SGI Visual Workstation on-board audio
-CONFIG_SOUND_VWSND
-  Say Y or M if you have an SGI Visual Workstation and you want to be
-  able to use its on-board audio.  Read
-  <file:Documentation/sound/vwsnd> for more info on this driver's
-  capabilities.
-
-NEC Vrc5477 AC97 sound
-CONFIG_SOUND_VRC5477
-  Say Y here to enable sound support for the NEC Vrc5477 chip, an
-  integrated, multi-function controller chip for MIPS CPUs.  Works
-  with the AC97 codec.
-
-Ensoniq SoundScape support
-CONFIG_SOUND_SSCAPE
-  Answer Y if you have a sound card based on the Ensoniq SoundScape
-  chipset. Such cards are being manufactured at least by Ensoniq, Spea
-  and Reveal (Reveal makes also other cards).
-
-  If you compile the driver into the kernel, you have to add
-  "sscape=<io>,<irq>,<dma>,<mpuio>,<mpuirq>" to the kernel command
-  line.
-
-MediaTriX AudioTriX Pro support
-CONFIG_SOUND_TRIX
-  Answer Y if you have the AudioTriX Pro sound card manufactured
-  by MediaTrix.
-
-Have TRXPRO.HEX firmware file
-CONFIG_TRIX_HAVE_BOOT
-  The MediaTrix AudioTrix Pro has an on-board microcontroller which
-  needs to be initialized by downloading the code from the file
-  TRXPRO.HEX in the DOS driver directory. If you don't have the
-  TRXPRO.HEX file handy you may skip this step. However, the SB and
-  MPU-401 modes of AudioTrix Pro will not work without this file!
-
-Full pathname of TRXPRO.HEX firmware file
-CONFIG_TRIX_BOOT_FILE
-  Enter the full pathname of your TRXPRO.HEX file, starting from /.
-
-Support for OPTi MAD16 and/or Mozart based cards
-CONFIG_SOUND_MAD16
-  Answer Y if your card has a Mozart (OAK OTI-601) or MAD16 (OPTi
-  82C928 or 82C929 or 82C931) audio interface chip. These chips are
-  quite common so it's possible that many no-name cards have one of
-  them. In addition the MAD16 chip is used in some cards made by known
-  manufacturers such as Turtle Beach (Tropez), Reveal (some models)
-  and Diamond (latest ones). Note however that the Tropez sound cards
-  have their own driver; if you have one of those, say N here and Y or
-  M to "Full support for Turtle Beach WaveFront", below.
-
-  If you compile the driver into the kernel, you have to add
-  "mad16=<io>,<irq>,<dma>,<dma2>,<mpuio>,<mpuirq>" to the
-  kernel command line.
-
-  See also <file:Documentation/sound/Opti> and
-  <file:Documentation/sound/MAD16> for more information on setting
-  these cards up as modules.
-
-Full support for Turtle Beach WaveFront (Tropez Plus, Tropez, Maui) synth/sound cards
-CONFIG_SOUND_WAVEFRONT
-  Answer Y or M if you have a Tropez Plus, Tropez or Maui sound card
-  and read the files <file:Documentation/sound/Wavefront> and
-  <file:Documentation/sound/Tropez+>.
-
-Support MIDI in older MAD16 based cards (requires SB)
-CONFIG_MAD16_OLDCARD
-  Answer Y (or M) if you have an older card based on the C928 or
-  Mozart chipset and you want to have MIDI support. If you enable this
-  option you also need to enable support for Sound Blaster.
-
-Support for Crystal CS4232 based (PnP) cards
-CONFIG_SOUND_CS4232
-  Say Y here if you have a card based on the Crystal CS4232 chip set,
-  which uses its own Plug and Play protocol.
-
-  If you compile the driver into the kernel, you have to add
-  "cs4232=<io>,<irq>,<dma>,<dma2>,<mpuio>,<mpuirq>" to the kernel
-  command line.
-
-  See <file:Documentation/sound/CS4232> for more information on
-  configuring this card.
-
-Support for Yamaha OPL3-SA2 and SA3 based PnP cards
-CONFIG_SOUND_OPL3SA2
-  Say Y or M if you have a card based on one of these Yamaha sound
-  chipsets or the "SAx", which is actually a SA3. Read
-  <file:Documentation/sound/OPL3-SA2> for more information on
-  configuring these cards.
-
-  If you compile the driver into the kernel and do not also
-  configure in the optional ISA PnP support, you will have to add
-  "opl3sa2=<io>,<irq>,<dma>,<dma2>,<mssio>,<mpuio>" to the kernel
-  command line.
-
-Support for Turtle Beach Wave Front (Maui, Tropez) synthesizers
-CONFIG_SOUND_MAUI
-  Say Y here if you have a Turtle Beach Wave Front, Maui, or Tropez
-  sound card.
-
-  If you compile the driver into the kernel, you have to add
-  "maui=<io>,<irq>" to the kernel command line.
-
-Have OSWF.MOT firmware file
-CONFIG_MAUI_HAVE_BOOT
-  Turtle Beach Maui and Tropez sound cards have a microcontroller
-  which needs to be initialized prior to use. OSWF.MOT is a file
-  distributed with the card's DOS/Windows drivers. Answer Y if you
-  have this file.
-
-Full pathname of OSWF.MOT firmware file
-CONFIG_MAUI_BOOT_FILE
-  Enter the full pathname of your OSWF.MOT file, starting from /.
-
-Support for Turtle Beach MultiSound Classic, Tahiti, Monterey
-CONFIG_SOUND_MSNDCLAS
-  Say M here if you have a Turtle Beach MultiSound Classic, Tahiti or
-  Monterey (not for the Pinnacle or Fiji).
-
-  See <file:Documentation/sound/MultiSound> for important information
-  about this driver.  Note that it has been discontinued, but the
-  Voyetra Turtle Beach knowledge base entry for it is still available
-  at <http://www.voyetra-turtle-beach.com/site/kb_ftp/790.asp>.
-
-MSND Classic I/O
-CONFIG_MSNDCLAS_IO
-  I/O port address for the MultiSound Classic and related cards.
-
-MSND Classic IRQ
-CONFIG_MSNDCLAS_IRQ
-  Interrupt Request line for the MultiSound Classic and related cards.
-
-MSND Classic memory address
-CONFIG_MSNDCLAS_MEM
-  Memory-mapped I/O base address for the MultiSound Classic and
-  related cards.
-
-Full pathname of MSNDINIT.BIN firmware file
-CONFIG_MSNDCLAS_INIT_FILE
-  The MultiSound cards have two firmware files which are required for
-  operation, and are not currently included. These files can be
-  obtained from Turtle Beach. See
-  <file:Documentation/sound/MultiSound> for information on how to
-  obtain this.
-
-Full pathname of MSNDPERM.BIN firmware file
-CONFIG_MSNDCLAS_PERM_FILE
-  The MultiSound cards have two firmware files which are required for
-  operation, and are not currently included. These files can be
-  obtained from Turtle Beach. See
-  <file:Documentation/sound/MultiSound> for information on how to
-  obtain this.
-
-Support for Turtle Beach MultiSound Pinnacle, Fiji
-CONFIG_SOUND_MSNDPIN
-  Say M here if you have a Turtle Beach MultiSound Pinnacle or Fiji.
-  See <file:Documentation/sound/MultiSound> for important information
-  about this driver. Note that it has been discontinued, but the
-  Voyetra Turtle Beach knowledge base entry for it is still available
-  at <http://www.voyetra-turtle-beach.com/site/kb_ftp/600.asp>.
-
-MSND Pinnacle IDE I/O 0
-CONFIG_MSNDPIN_IDE_IO0
-  CD-ROM drive 0 memory-mapped I/O base address for the MultiSound
-  Pinnacle and Fiji sound cards.
-
-MSND Pinnacle IDE I/O 1
-CONFIG_MSNDPIN_IDE_IO1
-  CD-ROM drive 1 memory-mapped I/O base address for the MultiSound
-  Pinnacle and Fiji sound cards.
-
-MSND Pinnacle IDE IRQ
-CONFIG_MSNDPIN_IDE_IRQ
-  Interrupt request number for the IDE CD-ROM interface on the
-  MultiSound Pinnacle and Fiji sound cards.
-
-MSND Pinnacle I/O
-CONFIG_MSNDPIN_IO
-  Memory-mapped I/O base address for the primary synthesizer on
-  MultiSound Pinnacle and Fiji sound cards.
-
-MSND Pinnacle MPU I/O
-CONFIG_MSNDPIN_MPU_IO
-  Memory-mapped I/O base address for the Kurzweil daughterboard
-  synthesizer on MultiSound Pinnacle and Fiji sound cards.
-
-MSND Pinnacle MPU IRQ
-CONFIG_MSNDPIN_MPU_IRQ
-  Iinterrupt request number for the Kurzweil daughterboard
-  synthesizer on MultiSound Pinnacle and Fiji sound cards.
-
-MSND Pinnacle IRQ
-CONFIG_MSNDPIN_IRQ
-  Interrupt request line for the primary synthesizer on MultiSound
-  Pinnacle and Fiji sound cards.
-
-MSND Pinnacle joystick I/O
-CONFIG_MSNDPIN_JOYSTICK_IO
-  Memory-mapped I/O base address for the joystick port on MultiSound
-  Pinnacle and Fiji sound cards.
-
-MSND Pinnacle memory
-CONFIG_MSNDPIN_MEM
-  Memory-mapped I/O base address for the primary synthesizer on
-  MultiSound Pinnacle and Fiji sound cards.
-
-Full pathname of PNDSPINI.BIN firmware file
-CONFIG_MSNDPIN_INIT_FILE
-  The MultiSound cards have two firmware files which are required
-  for operation, and are not currently included. These files can be
-  obtained from Turtle Beach. See
-  <file:Documentation/sound/MultiSound> for information on how to
-  obtain this.
-
-Full pathname of PNDSPERM.BIN firmware file
-CONFIG_MSNDPIN_PERM_FILE
-  The MultiSound cards have two firmware files which are required for
-  operation, and are not currently included. These files can be
-  obtained from Turtle Beach. See
-  <file:Documentation/sound/MultiSound> for information on how to
-  obtain this.
-
-MSND Pinnacle has S/PDIF I/O
-CONFIG_MSNDPIN_DIGITAL
-  If you have the S/PDIF daughter board for the Pinnacle or Fiji,
-  answer Y here; otherwise, say N. If you have this, you will be able
-  to play and record from the S/PDIF port (digital signal). See
-  <file:Documentation/sound/MultiSound> for information on how to make
-  use of this capability.
-
-MSND Pinnacle non-PnP Mode
-CONFIG_MSNDPIN_NONPNP
-  The Pinnacle and Fiji card resources can be configured either with
-  PnP, or through a configuration port. Say Y here if your card is NOT
-  in PnP mode. For the Pinnacle, configuration in non-PnP mode allows
-  use of the IDE and joystick peripherals on the card as well; these
-  do not show up when the card is in PnP mode. Specifying zero for any
-  resource of a device will disable the device. If you are running the
-  card in PnP mode, you must say N here and use isapnptools to
-  configure the card's resources.
-
-MSND Pinnacle config port
-CONFIG_MSNDPIN_CFG
-  This is the port which the Pinnacle and Fiji uses to configure the
-  card's resources when not in PnP mode. If your card is in PnP mode,
-  then be sure to say N to the previous option, "MSND Pinnacle Non-PnP
-  Mode".
-
-MSND buffer size (kB)
-CONFIG_MSND_FIFOSIZE
-  Configures the size of each audio buffer, in kilobytes, for
-  recording and playing in the MultiSound drivers (both the Classic
-  and Pinnacle). Larger values reduce the chance of data overruns at
-  the expense of overall latency. If unsure, use the default.
-
-Yamaha FM synthesizer (YM3812/OPL-3) support
-CONFIG_SOUND_YM3812
-  Answer Y if your card has a FM chip made by Yamaha (OPL2/OPL3/OPL4).
-  Answering Y is usually a safe and recommended choice, however some
-  cards may have software (TSR) FM emulation. Enabling FM support with
-  these cards may cause trouble (I don't currently know of any such
-  cards, however). Please read the file
-  <file:Documentation/sound/OPL3> if your card has an OPL3 chip.
-
-  If you compile the driver into the kernel, you have to add
-  "opl3=<io>" to the kernel command line.
-
-  If unsure, say Y.
-
-ACI mixer (miroSOUND PCM1-pro/PCM12/PCM20 radio)
-CONFIG_SOUND_ACI_MIXER
-  ACI (Audio Command Interface) is a protocol used to communicate with
-  the microcontroller on some sound cards produced by miro and
-  Cardinal Technologies.  The main function of the ACI is to control
-  the mixer and to get a product identification.
-
-  This VoxWare ACI driver currently supports the ACI functions on the
-  miroSOUND PCM1-pro, PCM12 and PCM20 radio. On the PCM20 radio, ACI
-  also controls the radio tuner. This is supported in the video4linux
-  miropcm20 driver (say M or Y here and go back to "Multimedia
-  devices" -> "Radio Adapters").
-
-  This driver is also available as a module and will be called aci.o.
-
-SB32/AWE support
-CONFIG_SOUND_AWE32_SYNTH
-  Say Y here if you have a Sound Blaster SB32, AWE32-PnP, SB AWE64 or
-  similar sound card. See <file:Documentation/sound/README.awe>,
-  <file:Documentation/sound/AWE32> and the Soundblaster-AWE
-  mini-HOWTO, available from <http://www.tldp.org/docs.html#howto>
-  for more info.
-
-Gallant Audio Cards (SC-6000 and SC-6600 based)
-CONFIG_SOUND_AEDSP16
-  Answer Y if you have a Gallant's Audio Excel DSP 16 card. This
-  driver supports Audio Excel DSP 16 but not the III nor PnP versions
-  of this card.
-
-  The Gallant's Audio Excel DSP 16 card can emulate either an SBPro or
-  a Microsoft Sound System card, so you should have said Y to either
-  "100% Sound Blaster compatibles (SB16/32/64, ESS, Jazz16) support"
-  or "Microsoft Sound System support", above, and you need to answer
-  the "MSS emulation" and "SBPro emulation" questions below
-  accordingly. You should say Y to one and only one of these two
-  questions.
-
-  Read the <file:Documentation/sound/README.OSS> file and the head of
-  <file:drivers/sound/aedsp16.c> as well as
-  <file:Documentation/sound/AudioExcelDSP16> to get more information
-  about this driver and its configuration.
-
-Audio Excel DSP 16 (SBPro emulation)
-CONFIG_AEDSP16_SBPRO
-  Answer Y if you want your audio card to emulate Sound Blaster Pro.
-  You should then say Y to "100% Sound Blaster compatibles
-  (SB16/32/64, ESS, Jazz16) support" and N to "Audio Excel DSP 16 (MSS
-  emulation)".
-
-  If you compile the driver into the kernel, you have to add
-  "aedsp16=<io>,<irq>,<dma>,<mssio>,<mpuio>,<mouirq>" to the kernel
-  command line.
-
-Audio Excel DSP 16 (MSS emulation)
-CONFIG_AEDSP16_MSS
-  Answer Y if you want your audio card to emulate Microsoft Sound
-  System. You should then say Y to "Microsoft Sound System support"
-  and say N to "Audio Excel DSP 16 (SBPro emulation)".
-
-SC-6600 based audio cards (new Audio Excel DSP 16)
-CONFIG_SC6600
-  The SC6600 is the new version of DSP mounted on the Audio Excel DSP
-  16 cards. Find in the manual the FCC ID of your audio card and
-  answer Y if you have an SC6600 DSP.
-
-SC-6600 Joystick Interface
-CONFIG_SC6600_JOY
-  Say Y here in order to use the joystick interface of the Audio Excel
-  DSP 16 card.
-
-SC-6600 CD-ROM Interface
-CONFIG_SC6600_CDROM  (4=None, 3=IDE, 1=Panasonic, 0=Sony)
-  This is used to activate the CD-ROM interface of the Audio Excel
-  DSP 16 card. Enter: 0 for Sony, 1 for Panasonic, 2 for IDE, 4 for no
-  CD-ROM present.
-
-SC-6600 CD-ROM Interface I/O Address
-CONFIG_SC6600_CDROMBASE
-  Base I/O port address for the CD-ROM interface of the Audio Excel
-  DSP 16 card.
-
-Audio Excel DSP 16 (MPU401 emulation)
-CONFIG_AEDSP16_MPU401
-  Answer Y if you want your audio card to emulate the MPU-401 midi
-  interface. You should then also say Y to "MPU-401 support".
-
-  Note that the I/O base for MPU-401 support of aedsp16 is the same
-  you have selected for "MPU-401 support". If you are using this
-  driver as a module you have to specify the MPU I/O base address with
-  the parameter 'mpu_base=0xNNN'.
-
-SC-6600 CDROM Interface (4=None, 3=IDE, 1=Panasonic, 0=?Sony?)
-CONFIG_SC6600_CDROM
-  This is used to activate the CD-ROM interface of the Audio Excel
-  DSP 16 card. Enter: 0 for Sony, 1 for Panasonic, 2 for IDE, 4 for no
-  CD-ROM present.
-
-C-Media PCI (CMI8338/8378)
-CONFIG_SOUND_CMPCI
-  Say Y or M if you have a PCI sound card using the CMI8338
-  or the CMI8378 chipset.  Data on these chips are available at
-  <http://www.cmedia.com.tw/>.
-
-  A userspace utility to control some internal registers of these
-  chips is available at
-  <http://member.nifty.ne.jp/Breeze/softwares/unix/cmictl-e.html>.
-
-Support CMI8738 based audio cards
-CONFIG_SOUND_CMPCI_CM8738
-  Say Y or M if you have a PCI sound card using the CMI8338
-  or the CMI8378 chipset.  Data on this chip is available at
-  <http://www.cmedia.com.tw/doc8738.htm>.
-
-  A userspace utility to control some internal registers of these
-  chips is available at
-  <http://member.nifty.ne.jp/Breeze/softwares/unix/cmictl-e.html>.
-
-Enable joystick
-CONFIG_SOUND_CMPCI_JOYSTICK
-  Say here in order to enable the joystick port on a sound crd using
-  the CMI8338 or the CMI8738 chipset.  Data on these chips are
-  available at <http://www.cmedia.com.tw/>.
-
-Number of speakers (2, 4, 5, 6)
-CONFIG_SOUND_CMPCI_SPEAKERS
-  Specify the number of speaker channels you want the card to drive,
-  as an integer.
-
-Enable S/PDIF loop for CMI8738
-CONFIG_SOUND_CMPCI_SPDIFLOOP
-  Enable loopback from SPDIF in to SPDIF out.  For discussion, see
-  "The 8738 Audio SPDIF In/Out Technical Data" on the technical
-  support page at <http://www.cmedia.com.tw/>.
-
-  A userspace utility to control even more internal registers of these
-  chips is available at
-  <http://member.nifty.ne.jp/Breeze/softwares/unix/cmictl-e.html>.
-  This package will among other things help you enable SPDIF 
-  out/in/loop/monitor.
-
-Enable legacy FM
-CONFIG_SOUND_CMPCI_FM
-  Say Y here to enable the legacy FM (frequency-modulation) synthesis
-  support on a card using the CMI8338 or CMI8378 chipset.
-
-FM I/O 388, 3C8, 3E0, 3E8
-CONFIG_SOUND_CMPCI_FMIO
-  Set the base I/O address for FM synthesis control on a card using
-  the CMI8338 or CMI8378 chipset.
-
-Enable legacy MPU-401
-CONFIG_SOUND_CMPCI_MIDI
-  Say Y here to enable the legacy MP401 MIDI synthesis support on a
-  card using the CMI8338 or CMI8378 chipset.
-
-MPU-401 I/O 330, 320, 310, 300
-CONFIG_SOUND_CMPCI_MPUIO
-  Set the base I/O address for MP401 MIDI synthesis control on a card
-  using the CMI8338 or CMI8378 chipset.
-
-Inverse S/PDIF in for CMI8738
-CONFIG_SOUND_CMPCI_SPDIFINVERSE
-  Say Y here to have the driver invert the signal presented on SPDIF IN
-  of a card using the CMI8338 or CMI8378 chipset.
-
-Use Line-in as Read-out
-CONFIG_SOUND_CMPCI_LINE_REAR
-  Say Y here to enable using line-in jack as an output jack for a rear
-  speaker.
-
-Use Line-in as Bass
-CONFIG_SOUND_CMPCI_LINE_BASS
-  Say Y here to enable using line-in jack as an output jack for a bass
-  speaker.
-
-Creative SBLive! (EMU10K1) based PCI sound cards
-CONFIG_SOUND_EMU10K1
-  Say Y or M if you have a PCI sound card using the EMU10K1 chipset,
-  such as the Creative SBLive!, SB PCI512 or Emu-APS.
-
-  For more information on this driver and the degree of support for
-  the different card models please check:
-
-       <http://sourceforge.net/projects/emu10k1/>
-
-  It is now possible to load dsp microcode patches into the EMU10K1
-  chip.  These patches are used to implement real time sound
-  processing effects which include for example: signal routing,
-  bass/treble control, AC3 passthrough, ...
-  Userspace tools to create new patches and load/unload them can be
-  found in the emu-tools package at the above URL.
-
-Creative SBLive! (EMU10K1) MIDI
-CONFIG_MIDI_EMU10K1
-  Say Y if you want to be able to use the OSS /dev/sequencer
-  interface.  This code is still experimental.
-
-Crystal SoundFusion (CS4280/461x)
-CONFIG_SOUND_FUSION
-  This module drives the Crystal SoundFusion devices (CS4280/46xx
-  series) when wired as native sound drivers with AC97 codecs.  If
-  this driver does not work try the CS4232 driver.
-
-Ensoniq AudioPCI (ES1370) based PCI sound cards
-CONFIG_SOUND_ES1370
-  Say Y or M if you have a PCI sound card utilizing the Ensoniq
-  ES1370 chipset, such as Ensoniq's AudioPCI (non-97). To find
-  out if your sound card uses an ES1370 without removing your
-  computer's cover, use lspci -n and look for the PCI ID
-  1274:5000. Since Ensoniq was bought by Creative Labs,
-  Sound Blaster 64/PCI models are either ES1370 or ES1371 based.
-  This driver differs slightly from OSS/Free, so PLEASE READ
-  <file:Documentation/sound/es1370>.
-
-Ensoniq AudioPCI 97 (ES1371) based sound cards
-CONFIG_SOUND_ES1371
-  Say Y or M if you have a PCI sound card utilizing the Ensoniq
-  ES1371 chipset, such as Ensoniq's AudioPCI97. To find out if
-  your sound card uses an ES1371 without removing your computer's
-  cover, use lspci -n and look for the PCI ID 1274:1371. Since
-  Ensoniq was bought by Creative Labs, Sound Blaster 64/PCI
-  models are either ES1370 or ES1371 based. This driver differs
-  slightly from OSS/Free, so PLEASE READ
-  <file:Documentation/sound/es1371>.
-
-ESS Solo1 based PCI sound cards (eg. SC1938)
-CONFIG_SOUND_ESSSOLO1
-  Say Y or M if you have a PCI sound card utilizing the ESS Technology
-  Solo1 chip. To find out if your sound card uses a
-  Solo1 chip without removing your computer's cover, use
-  lspci -n and look for the PCI ID 125D:1969. This driver
-  differs slightly from OSS/Free, so PLEASE READ
-  <file:Documentation/sound/solo1>.
-
-S3 SonicVibes based PCI sound cards
-CONFIG_SOUND_SONICVIBES
-  Say Y or M if you have a PCI sound card utilizing the S3
-  SonicVibes chipset. To find out if your sound card uses a
-  SonicVibes chip without removing your computer's cover, use
-  lspci -n and look for the PCI ID 5333:CA00. This driver
-  differs slightly from OSS/Free, so PLEASE READ
-  <file:Documentation/sound/sonicvibes>.
-
-Trident 4DWave DX/NX, SiS 7018 or ALi 5451 PCI Audio Core
-CONFIG_SOUND_TRIDENT
-  Say Y or M if you have a PCI sound card utilizing the Trident
-  4DWave-DX/NX chipset or your mother board chipset has SiS 7018
-  or ALi 5451 built-in. The SiS 7018 PCI Audio Core is embedded
-  in SiS960 Super South Bridge and SiS540/630 Single Chipset.
-  The ALi 5451 PCI Audio Core is embedded in ALi M1535, M1535D,
-  M1535+ or M1535D+ South Bridge.
-
-  Use lspci -n to find out if your sound card or chipset uses
-  Trident 4DWave or SiS 7018. PCI ID 1023:2000 or 1023:2001 stands
-  for Trident 4Dwave. PCI ID 1039:7018 stands for SiS7018. PCI ID
-  10B9:5451 stands for ALi5451.
-
-  This driver supports S/PDIF in/out (record/playback) for ALi 5451
-  embedded in ALi M1535+ and M1535D+. Note that they aren't all
-  enabled by default; you can enable them by saying Y to "/proc file
-  system support" and "Sysctl support", and after the /proc file
-  system has been mounted, executing the command
-
-       command                 what is enabled
-
-  echo 0>/proc/ALi5451 pcm out is also set to S/PDIF out. (Default).
-
-  echo 1>/proc/ALi5451 use S/PDIF out to output pcm data.
-
-  echo 2>/proc/ALi5451 use S/PDIF out to output non-pcm data.
-                        (AC3...).
-
-  echo 3>/proc/ALi5451 record from Ac97 in(MIC, Line in...).
-                        (Default).
-
-  echo 4>/proc/ALi5451 no matter Ac97 settings, record from S/PDIF
-                        in.
-
-
-  This driver differs slightly from OSS/Free, so PLEASE READ the
-  comments at the top of <file:drivers/sound/trident.c>.
-
-Rockwell WaveArtist
-CONFIG_SOUND_WAVEARTIST
-  Say Y here to include support for the Rockwell WaveArtist sound
-  system.  This driver is mainly for the NetWinder.
-
-VIA 82Cxxx Audio Codec
-CONFIG_SOUND_VIA82CXXX
-  Say Y here to include support for the audio codec found on VIA
-  82Cxxx-based chips. Typically these are built into a motherboard.
-
-  DO NOT select Sound Blaster or Adlib with this driver, unless
-  you have a Sound Blaster or Adlib card in addition to your VIA
-  audio chip.
-
-VIA 82C686 MIDI
-CONFIG_MIDI_VIA82CXXX
-  Answer Y to use the MIDI interface of the Via686. You may need to
-  enable this in the BIOS before it will work. This is for connection
-  to external MIDI hardware, and is not required for software playback
-  of MIDI files.
-
-NeoMagic 256AV/256ZX sound chipsets
-CONFIG_SOUND_NM256
-  Say M here to include audio support for the NeoMagic 256AV/256ZX
-  chipsets. These are the audio chipsets found in the Sony
-  Z505S/SX/DX, some Sony F-series, and the Dell Latitude CPi and CPt
-  laptops. It includes support for an AC97-compatible mixer and an
-  apparently proprietary sound engine.
-
-  See <file:Documentation/sound/NM256> for further information.
-
-ESS Maestro, Maestro2, Maestro2E driver
-CONFIG_SOUND_MAESTRO
-  Say Y or M if you have a sound system driven by ESS's Maestro line
-  of PCI sound chips.  These include the Maestro 1, Maestro 2, and
-  Maestro 2E.  See <file:Documentation/sound/Maestro> for more
-  details.
-
-ESS Maestro3/Allegro driver
-CONFIG_SOUND_MAESTRO3
-  Say Y or M if you have a sound system driven by ESS's Maestro 3
-  PCI sound chip.
-
-ForteMedia FM801 driver
-CONFIG_SOUND_FORTE
-  Say Y or M if you want driver support for the ForteMedia FM801 PCI
-  audio controller (Abit AU10, Genius Sound Maker, HP Workstation
-  zx2000, and others).
-
-Adlib Cards
-CONFIG_SOUND_ADLIB
-  Includes ASB 64 4D. Information on programming AdLib cards is
-  available at <http://www.itsnet.com/home/ldragon/Specs/adlib.html>.
-
-Crystal Sound CS4281
-CONFIG_SOUND_CS4281
-  Picture and feature list at
-  <http://www.pcbroker.com/crystal4281.html>.
-
-16 bit sampling option of GUS (_NOT_ GUS MAX)
-CONFIG_SOUND_GUS16
-  Support for Gravis Ulstrasound (GUS) cards (other than the GUS),
-  sampling at 16-bit width.
-
-GUS MAX support
-CONFIG_SOUND_GUSMAX
-  Support for Gravis Ulstrasound MAX.
-
-Intel ICH audio support
-CONFIG_SOUND_ICH
-  Supports the following chipsets:
-  
-  Intel ICH 82801AA
-  Intel ICH 82901AB
-  Intel 440 MX
-  Intel ICH2
-  Intel ICH3
-  SiS 7012
-  NVidia nForce
-  AMD 768
-  
-  These are audio drivers for integral audio in chipsets of motherboards.
-  
-  Intel's I/O Controller Hub (ICH) is used on 810/815/820/840/845/845D/850 motherboards.
-  SiS 7012 is used on 645/735/745 motherboards.
-
-Verbose initialization
-CONFIG_SOUND_TRACEINIT
-  Verbose soundcard initialization -- affects the format of autoprobe
-  and initialization messages at boot time.
-
-TV card (bt848) mixer support
-CONFIG_SOUND_TVMIXER
-  Support for audio mixer facilities on the BT848 TV frame-grabber
-  card.
-
-VIDC 16-bit sound
-CONFIG_SOUND_VIDC
-  16-bit support for the VIDC onboard sound hardware found on Acorn
-  machines.
-
-Loopback MIDI device support
-CONFIG_SOUND_VMIDI
-  Support for MIDI loopback on port 1 or 2.
-
-Yamaha YMF7xx PCI audio (native mode)
-CONFIG_SOUND_YMFPCI
-  Support for Yamaha cards with the following chipsets: YMF724,
-  YMF724F, YMF740, YMF740C, YMF744, and YMF754.
-
-  Two common cards that use this type of chip are Waveforce 192XG,
-  and Waveforce 192 Digital.
-
-Yamaha PCI legacy ports support
-CONFIG_SOUND_YMFPCI_LEGACY
-  Support for YMF7xx PCI cards emulating an MP401.
-
-RME Hammerfall (RME96XX) support
-CONFIG_SOUND_RME96XX
-  Say Y or M if you have a Hammerfall or Hammerfall light multichannel card 
-  from RME. If you want to acess advanced features of the card, read
-  Documentation/sound/rme96xx.
-
-Are you using a crosscompiler
-CONFIG_CROSSCOMPILE
-  Say Y here if you are compiling the kernel on a different
-  architecture than the one it is intended to run on.
-
-Kernel support for Linux/MIPS 32-bit binary compatibility
-CONFIG_MIPS32_COMPAT
-  Select this option if you want Linux/MIPS 32-bit binary
-  compatibility. Since all software available for Linux/MIPS is
-  currently 32-bit you should say Y here.
-
-Build fp exception handler module
-CONFIG_MIPS_FPE_MODULE
-  Build the floating point exception handler module. This option is
-  only useful for people working on the floating point exception
-  handler. If you don't, say N.
-
-Galileo EV64120 Evaluation board
-CONFIG_MIPS_EV64120
-  This is an evaluation board based on the Galileo GT-64120
-  single-chip system controller that contains a MIPS R5000 compatible
-  core running at 75/100MHz.  Their website is located at
-  <http://www.galileot.com/>.  Say Y here if you wish to build a
-  kernel for this platform.
-
-Galileo EV96100 Evaluation board
-CONFIG_MIPS_EV96100
-  This is an evaluation board based on the Galielo GT-96100 LAN/WAN
-  communications controllers containing a MIPS R5000 compatible core
-  running at 83MHz. Their website is <http://www.galileot.com/>. Say Y
-  here if you wish to build a kernel for this platform.
-
-Support for ITE 8172G board
-CONFIG_MIPS_ITE8172
-  Ths is an evaluation board made by ITE <http://www.ite.com.tw/>
-  with ATX form factor that utilizes a MIPS R5000 to work with its
-  ITE8172G companion internet appliance chip. The MIPS core can be
-  either a NEC Vr5432 or QED RM5231. Say Y here if you wish to build
-  a kernel for this platform.
-
-Support for Globespan IVR board
-CONFIG_MIPS_IVR
-  This is an evaluation board built by Globespan to showcase their
-  iVR (Internet Video Recorder) design. It utilizes a QED RM5231
-  R5000 MIPS core. More information can be found out their website
-  located at <http://www.globespan.net/products/product4.html>P. Say Y
-  here if you wish to build a kernel for this platform.
-
-Support for Alchemy Semi PB1000 board
-CONFIG_MIPS_PB1000
-  This is an evaluation board built by Alchemy Semiconductor to
-  showcase their Au1000 Internet Edge Processor. It is SOC design
-  containing a MIPS32 core running at 266/400/500MHz with many
-  integrated peripherals. Further information can be found at their
-  website, <http://www.alchemysemi.com/>. Say Y here if you wish to
-  build a kernel for this platform.
-
-Support for Philips Nino
-CONFIG_NINO
-  Say Y here to select a kernel for the Philips Nino Palm PC. The
-  website at <http://www.realitydiluted.com/projects/nino/index.html>
-  will have more information.
-
-# Choice: nino_model
-CONFIG_NINO_4MB
-  Say Y here to build a kernel specifically for Nino Palm PCs with
-  4MB of memory. These include models 300/301/302/319.
-
-Model-200/210/312/320/325/350/390
-CONFIG_NINO_8MB
-  Say Y here to build a kernel specifically for Nino Palm PCs with
-  8MB of memory. These include models 200/210/312/320/325/350/390.
-
-Model-500/510
-CONFIG_NINO_16MB
-  Say Y here to build a kernel specifically for Nino 500/501 color
-  Palm PCs from Philips (INCOMPLETE).
-Model-300/301/302/319
-
-Low-level debugging
-CONFIG_LL_DEBUG
-  Enable low-level debugging assertion macros in the kernel code.
-  Currently used only by the time services code in the MIPS port.
-  Don't turn this on unless you know what you are doing.
-
-Remote GDB kernel debugging
-CONFIG_REMOTE_DEBUG
-  If you say Y here, it will be possible to remotely debug the MIPS
-  kernel using gdb. This enlarges your kernel image disk size by
-  several megabytes and requires a machine with more than 16 MB,
-  better 32 MB RAM to avoid excessive linking time. This is only
-  useful for kernel hackers. If unsure, say N.
-
-Run uncached
-CONFIG_MIPS_UNCACHED
-  If you say Y here there kernel will disable all CPU caches.  This will
-  reduce the system's performance dramatically but can help finding
-  otherwise hard to track bugs.  It can also useful if you're doing
-  hardware debugging with a logic analyzer and need to see all traffic
-  on the bus.
-
-AU1000 ethernet controller on SGI MIPS system
-CONFIG_MIPS_AU1000_ENET
-  If you have an Alchemy Semi AU1000 ethernet controller
-  on an SGI MIPS system, say Y.  Otherwise, say N.
-
-WD93 SCSI Controller on SGI MIPS system
-CONFIG_SGIWD93_SCSI
-  If you have a Western Digital WD93 SCSI controller on
-  an SGI MIPS system, say Y.  Otherwise, say N.
-
-Magic System Request Key support
-CONFIG_MAGIC_SYSRQ
-  If you say Y here, you will have some control over the system even
-  if the system crashes for example during kernel debugging (e.g., you
-  will be able to flush the buffer cache to disk, reboot the system
-  immediately or dump some status information). This is accomplished
-  by pressing various keys while holding SysRq (Alt+PrintScreen). It
-  also works on a serial console (on PC hardware at least), if you
-  send a BREAK and then within 5 seconds a command keypress. The
-  keys are documented in <file:Documentation/sysrq.txt>. Don't say Y
-  unless you really know what this hack does.
-
-ISDN support
-CONFIG_ISDN
-  ISDN ("Integrated Services Digital Networks", called RNIS in France)
-  is a special type of fully digital telephone service; it's mostly
-  used to connect to your Internet service provider (with SLIP or
-  PPP).  The main advantage is that the speed is higher than ordinary
-  modem/telephone connections, and that you can have voice
-  conversations while downloading stuff.  It only works if your
-  computer is equipped with an ISDN card and both you and your service
-  provider purchased an ISDN line from the phone company.  For
-  details, read <http://alumni.caltech.edu/~dank/isdn/> on the WWW.
-
-  This driver allows you to use an ISDN-card for networking
-  connections and as dialin/out device.  The isdn-tty's have a built
-  in AT-compatible modem emulator.  Network devices support autodial,
-  channel-bundling, callback and caller-authentication without having
-  a daemon running.  A reduced T.70 protocol is supported with tty's
-  suitable for German BTX.  On D-Channel, the protocols EDSS1
-  (Euro-ISDN) and 1TR6 (German style) are supported.  See
-  <file:Documentation/isdn/README> for more information.
-
-  If you want to compile the ISDN code as a module ( = code which can
-  be inserted in and removed from the running kernel whenever you
-  want), say M here and read <file:Documentation/modules.txt>.  The
-  module will be called isdn.o. If unsure, say N.
-
-Support synchronous PPP
-CONFIG_ISDN_PPP
-  Over digital connections such as ISDN, there is no need to
-  synchronize sender and recipient's clocks with start and stop bits
-  as is done over analog telephone lines. Instead, one can use
-  "synchronous PPP". Saying Y here will include this protocol. This
-  protocol is used by Cisco and Sun for example. So you want to say Y
-  here if the other end of your ISDN connection supports it. You will
-  need a special version of pppd (called ipppd) for using this
-  feature. See <file:Documentation/isdn/README.syncppp> and
-  <file:Documentation/isdn/syncPPP.FAQ> for more information.
-
-Support generic MP (RFC 1717)
-CONFIG_ISDN_MPP
-  With synchronous PPP enabled, it is possible to increase throughput
-  by bundling several ISDN-connections, using this protocol. See
-  <file:Documentation/isdn/README.syncppp> for more information.
-
-Use VJ-compression with synchronous PPP
-CONFIG_ISDN_PPP_VJ
-  This enables Van Jacobson header compression for synchronous PPP.
-  Say Y if the other end of the connection supports it.
-
-Support BSD compression
-CONFIG_ISDN_PPP_BSDCOMP
-  Support for the BSD-Compress compression method for PPP, which uses
-  the LZW compression method to compress each PPP packet before it is
-  sent over the wire. The machine at the other end of the PPP link
-  (usually your ISP) has to support the BSD-Compress compression
-  method as well for this to be useful. Even if they don't support it,
-  it is safe to say Y here.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called isdn_bsdcomp.o.
-
-Support audio via ISDN
-CONFIG_ISDN_AUDIO
-  If you say Y here, the modem-emulator will support a subset of the
-  EIA Class 8 Voice commands. Using a getty with voice-support
-  (mgetty+sendfax by gert@greenie.muc.de with an extension, available
-  with the ISDN utility package for example), you will be able to use
-  your Linux box as an ISDN-answering machine. Of course, this must be
-  supported by the lowlevel driver also. Currently, the HiSax driver
-  is the only voice-supporting driver. See
-  <file:Documentation/isdn/README.audio> for more information.
-
-X.25 PLP on top of ISDN
-CONFIG_ISDN_X25
-  This feature provides the X.25 protocol over ISDN connections.
-  See <file:Documentation/isdn/README.x25> for more information
-  if you are thinking about using this.
-
-ISDN diversion services support
-CONFIG_ISDN_DIVERSION
-  This option allows you to use some supplementary diversion
-  services in conjunction with the HiSax driver on an EURO/DSS1
-  line.
-
-  Supported options are CD (call deflection), CFU (Call forward
-  unconditional), CFB (Call forward when busy) and CFNR (call forward
-  not reachable). Additionally the actual CFU, CFB and CFNR state may
-  be interrogated.
-
-  The use of CFU, CFB, CFNR and interrogation may be limited to some
-  countries. The keypad protocol is still not implemented. CD should
-  work in all countries if the service has been subscribed to.
-
-  Please read the file <file:Documentation/isdn/README.diversion>.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called dss1_divert.o.
-
-ICN 2B and 4B support
-CONFIG_ISDN_DRV_ICN
-  This enables support for two kinds of ISDN-cards made by a German
-  company called ICN.  2B is the standard version for a single ISDN
-  line with two B-channels, 4B supports two ISDN lines.  For running
-  this card, additional firmware is necessary, which has to be
-  downloaded into the card using a utility which is distributed
-  separately.  See <file:Documentation/isdn/README> and
-  <file:Documentation/isdn/README.icn> for more
-  information.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called icn.o.
-
-isdnloop support
-CONFIG_ISDN_DRV_LOOP
-  This driver provides a virtual ISDN card. Its primary purpose is
-  testing of linklevel features or configuration without getting
-  charged by your service-provider for lots of phone calls.
-  You need will need the loopctrl utility from the latest isdn4k-utils
-  package to set up this driver.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called isdnloop.o.
-
-HiSax SiemensChipSet driver support
-CONFIG_ISDN_DRV_HISAX
-  This is a driver supporting the Siemens chipset on various
-  ISDN-cards (like AVM A1, Elsa ISDN cards, Teles S0-16.0, Teles
-  S0-16.3, Teles S0-8, Teles/Creatix PnP, ITK micro ix1 and many
-  compatibles).
-
-  HiSax is just the name of this driver, not the name of any hardware.
-
-  If you have a card with such a chipset, you should say Y here and
-  also to the configuration option of the driver for your particular
-  card, below.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called hisax.o.  See <file:Documentation/isdn/README.HiSax>
-  for more information on using this driver.
-
-HiSax Support for EURO/DSS1
-CONFIG_HISAX_EURO
-  Say Y or N according to the D-channel protocol which your local
-  telephone service company provides.
-
-  The call control protocol E-DSS1 is used in most European countries.
-  If unsure, say Y.
-
-Support for German chargeinfo
-CONFIG_DE_AOC
-  If you want that the HiSax hardware driver sends messages to the
-  upper level of the isdn code on each AOCD (Advice Of Charge, During
-  the call -- transmission of the fee information during a call) and
-  on each AOCE (Advice Of Charge, at the End of the call --
-  transmission of fee information at the end of the call), say Y here.
-  This works only in Germany.
-
-Disable sending complete
-CONFIG_HISAX_NO_SENDCOMPLETE
-  If you have trouble with some ugly exchanges or you live in
-  Australia select this option.
-
-Disable sending low layer compatibility
-CONFIG_HISAX_NO_LLC
-  If you have trouble with some ugly exchanges try to select this
-  option.
-
-Disable keypad protocol option
-CONFIG_HISAX_NO_KEYPAD
-  If you like to send special dial strings including * or # without
-  using the keypad protocol, select this option.
-
-HiSax Support for German 1TR6
-CONFIG_HISAX_1TR6
-  Say Y or N according to the D-channel protocol which your local
-  telephone service company provides.
-
-  1TR6 is an old call control protocol which was used in Germany
-  before E-DSS1 was established. Nowadays, all new lines in Germany
-  use E-DSS1.
-
-HiSax Support for US NI1
-CONFIG_HISAX_NI1
-  Enable this if you like to use ISDN in US on a NI1 basic rate
-  interface.
-
-Maximum number of cards supported by HiSax
-CONFIG_HISAX_MAX_CARDS
-  This is used to allocate a driver-internal structure array with one
-  entry for each HiSax card on your system.
-
-Teles 16.0/8.0
-CONFIG_HISAX_16_0
-  This enables HiSax support for the Teles ISDN-cards S0-16.0, S0-8
-  and many compatibles.
-
-  See <file:Documentation/isdn/README.HiSax> on how to configure it
-  using the different cards, a different D-channel protocol, or
-  non-standard IRQ/port/shmem settings.
-
-Teles 16.3 or PNP or PCMCIA
-CONFIG_HISAX_16_3
-  This enables HiSax support for the Teles ISDN-cards S0-16.3 the
-  Teles/Creatix PnP and the Teles PCMCIA.
-
-  See <file:Documentation/isdn/README.HiSax> on how to configure it
-  using the different cards, a different D-channel protocol, or
-  non-standard IRQ/port settings.
-
-Teles PCI
-CONFIG_HISAX_TELESPCI
-  This enables HiSax support for the Teles PCI.
-  See <file:Documentation/isdn/README.HiSax> on how to configure it.
-
-Teles S0Box
-CONFIG_HISAX_S0BOX
-  This enables HiSax support for the Teles/Creatix parallel port
-  S0BOX.  See <file:Documentation/isdn/README.HiSax> on how to
-  configure it.
-
-AVM A1 (Fritz)
-CONFIG_HISAX_AVM_A1
-  This enables HiSax support for the AVM A1 (aka "Fritz").
-
-  See <file:Documentation/isdn/README.HiSax> on how to configure it
-  using the different cards, a different D-channel protocol, or
-  non-standard IRQ/port settings.
-
-AVM PnP/PCI (Fritz!PnP/PCI)
-CONFIG_HISAX_FRITZPCI
-  This enables HiSax support for the AVM "Fritz!PnP" and "Fritz!PCI".
-  See <file:Documentation/isdn/README.HiSax> on how to configure it.
-
-AVM A1 PCMCIA (Fritz)
-CONFIG_HISAX_AVM_A1_PCMCIA
-  This enables HiSax support for the AVM A1 "Fritz!PCMCIA").
-  See <file:Documentation/isdn/README.HiSax> on how to configure it.
-
-Elsa cards
-CONFIG_HISAX_ELSA
-  This enables HiSax support for the Elsa Mircolink ISA cards, for the
-  Elsa Quickstep series cards and Elsa PCMCIA.
-
-  See <file:Documentation/isdn/README.HiSax> on how to configure it
-  using the different cards, a different D-channel protocol, or
-  non-standard IRQ/port settings.
-
-ITK ix1-micro Revision 2
-CONFIG_HISAX_IX1MICROR2
-  This enables HiSax support for the ITK ix1-micro Revision 2 card.
-
-  See <file:Documentation/isdn/README.HiSax> on how to configure it
-  using the different cards, a different D-channel protocol, or
-  non-standard IRQ/port settings.
-
-Eicon.Diehl Diva cards
-CONFIG_HISAX_DIEHLDIVA
-  This enables HiSax support for the Eicon.Diehl Diva none PRO
-  versions passive ISDN cards.
-
-  See <file:Documentation/isdn/README.HiSax> on how to configure it
-  using the different cards, a different D-channel protocol, or
-  non-standard IRQ/port settings.
-
-ASUSCOM ISA cards
-CONFIG_HISAX_ASUSCOM
-  This enables HiSax support for the AsusCom and their OEM versions
-  passive ISDN ISA cards.
-
-  See <file:Documentation/isdn/README.HiSax> on how to configure it
-  using the different cards, a different D-channel protocol, or
-  non-standard IRQ/port settings.
-
-TELEINT cards
-CONFIG_HISAX_TELEINT
-  This enables HiSax support for the TELEINT SA1 semiactiv ISDN card.
-
-  See <file:Documentation/isdn/README.HiSax> on how to configure it
-  using the different cards, a different D-channel protocol, or
-  non-standard IRQ/port settings.
-
-HFC-S based cards
-CONFIG_HISAX_HFCS
-  This enables HiSax support for the HFC-S 2BDS0 based cards, like
-  teles 16.3c.
-
-  See <file:Documentation/isdn/README.HiSax> on how to configure it
-  using the different cards, a different D-channel protocol, or
-  non-standard IRQ/port settings.
-
-Sedlbauer cards
-CONFIG_HISAX_SEDLBAUER
-  This enables HiSax support for the Sedlbauer passive ISDN cards.
-
-  See <file:Documentation/isdn/README.HiSax> on how to configure it
-  using the different cards, a different D-channel protocol, or
-  non-standard IRQ/port settings.
-
-USR Sportster internal TA
-CONFIG_HISAX_SPORTSTER
-  This enables HiSax support for the USR Sportster internal TA card.
-
-  See <file:Documentation/isdn/README.HiSax> on how to configure it
-  using a different D-channel protocol, or non-standard IRQ/port
-  settings.
-
-MIC card
-CONFIG_HISAX_MIC
-  This enables HiSax support for the ITH MIC card.
-
-  See <file:Documentation/isdn/README.HiSax> on how to configure it
-  using a different D-channel protocol, or non-standard IRQ/port
-  settings.
-
-NETjet card
-CONFIG_HISAX_NETJET
-  This enables HiSax support for the NetJet from Traverse
-  Technologies.
-
-  See <file:Documentation/isdn/README.HiSax> on how to configure it
-  using a different D-channel protocol, or non-standard IRQ/port
-  settings.
-
-NETspider U card
-CONFIG_HISAX_NETJET_U
-  This enables HiSax support for the Netspider U interface ISDN card
-  from Traverse Technologies.
-  See <file:Documentation/isdn/README.HiSax> on how to configure it
-  using a different D-channel protocol, or non-standard IRQ/port
-  settings.
-
-Niccy PnP/PCI card
-CONFIG_HISAX_NICCY
-  This enables HiSax support for the Dr. Neuhaus Niccy PnP or PCI.
-
-  See <file:Documentation/isdn/README.HiSax> on how to configure it
-  using a different D-channel protocol, or non-standard IRQ/port
-  settings.
-
-Siemens I-Surf card
-CONFIG_HISAX_ISURF
-  This enables HiSax support for the Siemens I-Talk/I-Surf card with
-  ISAR chip.
-  See <file:Documentation/isdn/README.HiSax> on how to configure it
-  using a different D-channel protocol, or non-standard IRQ/port
-  settings.
-
-HST Saphir card
-CONFIG_HISAX_HSTSAPHIR
-  This enables HiSax support for the HST Saphir card.
-
-  See <file:Documentation/isdn/README.HiSax> on how to configure it
-  using a different D-channel protocol, or non-standard IRQ/port
-  settings.
-
-Telekom A4T card
-CONFIG_HISAX_BKM_A4T
-  This enables HiSax support for the Telekom A4T card.
-
-  See <file:Documentation/isdn/README.HiSax> on how to configure it
-  using a different D-channel protocol, or non-standard IRQ/port
-  settings.
-
-Scitel Quadro card
-CONFIG_HISAX_SCT_QUADRO
-  This enables HiSax support for the Scitel Quadro card.
-
-  See <file:Documentation/isdn/README.HiSax> on how to configure it
-  using a different D-channel protocol, or non-standard IRQ/port
-  settings.
-
-Gazel cards
-CONFIG_HISAX_GAZEL
-  This enables HiSax support for the Gazel cards.
-
-  See <file:Documentation/isdn/README.HiSax> on how to configure it
-  using a different D-channel protocol, or non-standard IRQ/port
-  settings.
-
-HFC PCI-Bus cards
-CONFIG_HISAX_HFC_PCI
-  This enables HiSax support for the HFC-S PCI 2BDS0 based cards.
-
-  For more informations see under
-  <file:Documentation/isdn/README.hfc-pci>.
-
-Winbond W6692 based cards
-CONFIG_HISAX_W6692
-  This enables HiSax support for Winbond W6692 based PCI ISDN cards.
-
-  See <file:Documentation/isdn/README.HiSax> on how to configure it
-  using a different D-channel protocol, or non-standard IRQ/port
-  settings.
-
-HFC-S+, HFC-SP, HFC-PCMCIA cards
-CONFIG_HISAX_HFC_SX
-  This enables HiSax support for the HFC-S+, HFC-SP and HFC-PCMCIA
-  cards. This code is not finished yet.
-
-Am7930
-CONFIG_HISAX_AMD7930
-  This enables HiSax support for the AMD7930 chips on some SPARCs.
-  This code is not finished yet.
-
-HiSax debugging
-CONFIG_HISAX_DEBUG
-  This enables debugging code in the new-style HiSax drivers, i.e.
-  the ST5481 USB driver currently. 
-  If in doubt, say yes.
-
-ELSA PCMCIA MicroLink cards
-CONFIG_HISAX_ELSA_CS
-  This enables the PCMCIA client driver for the Elsa PCMCIA MicroLink
-  card.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called elsa_cs.o.
-
-Sedlbauer PCMCIA cards
-CONFIG_HISAX_SEDLBAUER_CS
-  This enables the PCMCIA client driver for the Sedlbauer Speed Star
-  and Speed Star II cards.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called sedlbauer_cs.o.
-
-CONFIG_HISAX_AVM_A1_CS
-  This enables the PCMCIA client driver for the AVM A1 / Fritz!Card
-  PCMCIA cards.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called avma1_cs.o.
-
-ST5481 USB ISDN modem
-CONFIG_HISAX_ST5481
-  This enables the driver for ST5481 based USB ISDN adapters,
-  e.g. the BeWan Gazel 128 USB
-
-PCBIT-D support
-CONFIG_ISDN_DRV_PCBIT
-  This enables support for the PCBIT ISDN-card.  This card is
-  manufactured in Portugal by Octal.  For running this card,
-  additional firmware is necessary, which has to be downloaded into
-  the card using a utility which is distributed separately.  See
-  <file:Documentation/isdn/README> and
-  <file:Documentation/isdn/README.pcbit> for more information.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called pcbit.o.
-
-Spellcaster support
-CONFIG_ISDN_DRV_SC
-  This enables support for the Spellcaster BRI ISDN boards.  This
-  driver currently builds only in a modularized version ( = code which
-  can be inserted in and removed from the running kernel whenever you
-  want, details in <file:Documentation/modules.txt>); the module will
-  be called sc.o.  See <file:Documentation/isdn/README.sc> and
-  <http://www.spellcast.com/> for more information.
-
-Eicon active card support
-CONFIG_ISDN_DRV_EICON
-  Say Y here if you have an Eicon active ISDN card. In order to use
-  this card, additional firmware is necessary, which has to be loaded
-  into the card using the eiconctrl utility which is part of the
-  latest isdn4k-utils package. Please read the file
-  <file:Documentation/isdn/README.eicon> for more information.
-
-Legacy Eicon driver
-CONFIG_ISDN_DRV_EICON_OLD
-  Say Y here to use your Eicon active ISDN card with ISDN4Linux
-  isdn module.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called eicon.o.
-
-Eicon PCI DIVA Server BRI/PRI/4BRI support
-CONFIG_ISDN_DRV_EICON_PCI
-  Say Y here if you have an Eicon Diva Server (BRI/PRI/4BRI) ISDN
-  card.  Please read <file:Documentation/isdn/README.eicon> for more
-  information.
-
-Eicon old-type (S,SX,SCOM,Quadro,S2M) card support
-CONFIG_ISDN_DRV_EICON_ISA
-  Say Y here if you have an old-type Eicon active ISDN card. In order
-  to use this card, additional firmware is necessary, which has to be
-  loaded into the card using the eiconctrl utility which is part of
-  the latest isdn4k-utils package. Please read the file
-  <file:Documentation/isdn/README.eicon> for more information.
-
-Eicon driver type standalone
-CONFIG_ISDN_DRV_EICON_DIVAS
-  Enable this option if you want the eicon driver as standalone
-  version with no interface to the ISDN4Linux isdn module. If you
-  say Y here, the eicon module only supports the Diva Server PCI
-  cards and will provide its own IDI interface. You should say N
-  here.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called divas.o.
-
-Support AT-Fax Class 1 and 2 commands
-CONFIG_ISDN_TTY_FAX
-  If you say Y here, the modem-emulator will support a subset of the
-  Fax Class 1 and 2 commands. Using a getty with fax-support
-  (mgetty+sendfax, hylafax), you will be able to use your Linux box as
-  an ISDN-fax-machine. This must be supported by the lowlevel driver
-  also. See <file:Documentation/isdn/README.fax> for more information.
-
-CAPI2.0 support
-CONFIG_ISDN_CAPI
-  This provides the CAPI (Common ISDN Application Programming
-  Interface, a standard making it easy for programs to access ISDN
-  hardware, see <http://www.capi.org/>.  This is needed for AVM's set
-  of active ISDN controllers like B1, T1, M1.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The modules will be called capi.o and kernelcapi.o. If you want to
-  compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-CAPI2.0 /dev/capi20 support
-CONFIG_ISDN_CAPI_CAPI20
-  This option will provide the CAPI 2.0 interface to userspace
-  applications via /dev/capi20. Applications should use the
-  standardized libcapi20 to access this functionality.  You should say
-  Y/M here.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called capi.o.
-
-CAPI2.0 Middleware support
-CONFIG_ISDN_CAPI_MIDDLEWARE
-  This option will enhance the capabilities of the /dev/capi20
-  interface.  It will provide a means of moving a data connection,
-  established via the usual /dev/capi20 interface to a special tty
-  device.  If you want to use pppd with pppdcapiplugin to dial up to
-  your ISP, say Y here.
-
-CAPI2.0 filesystem support
-CONFIG_ISDN_CAPI_CAPIFS
-  This option provides a special file system, similar to /dev/pts with
-  device nodes for the special ttys established by using the
-  middleware extension above. If you want to use pppd with
-  pppdcapiplugin to dial up to your ISP, say Y here.
-
-CAPI2.0 capidrv interface support
-CONFIG_ISDN_CAPI_CAPIDRV
-  This option provides the glue code to hook up CAPI driven cards to
-  the legacy isdn4linux link layer.  If you have a card which is
-  supported by a CAPI driver, but still want to use old features like
-  ippp interfaces or ttyI emulation, say Y/M here.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called capidrv.o.
-
-AVM B1 ISA support
-CONFIG_ISDN_DRV_AVMB1_B1ISA
-  Enable support for the ISA version of the AVM B1 card.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called b1isa.o.
-
-AVM B1 PCI support
-CONFIG_ISDN_DRV_AVMB1_B1CICI
-  Enable support for the PCI version of the AVM B1 card.
-
-AVM B1 PCI V4 support
-CONFIG_ISDN_DRV_AVMB1_B1PCIV4
-  Enable support for the V4 version of AVM B1 PCI card.
-
-AVM T1/T1-B ISA support
-CONFIG_ISDN_DRV_AVMB1_T1ISA
-  Enable support for the AVM T1 T1B card.
-  Note: This is a PRI card and handle 30 B-channels.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called t1isa.o.
-
-AVM B1/M1/M2 PCMCIA support
-CONFIG_ISDN_DRV_AVMB1_B1PCMCIA
-  Enable support for the PCMCIA version of the AVM B1 card.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called b1pcmcia.o.
-
-AVM B1/M1/M2 PCMCIA cs module
-CONFIG_ISDN_DRV_AVMB1_AVM_CS
-  Enable the PCMCIA client driver for the AVM B1/M1/M2
-  PCMCIA cards.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called avm_cs.o.
-
-AVM T1/T1-B PCI support
-CONFIG_ISDN_DRV_AVMB1_T1PCI
-  Enable support for the AVM T1 T1B card.
-  Note: This is a PRI card and handle 30 B-channels.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called t1pci.o.
-
-AVM C4/C2 support
-CONFIG_ISDN_DRV_AVMB1_C4
-  Enable support for the AVM C4/C2 PCI cards.
-  These cards handle 4/2 BRI ISDN lines (8/4 channels).
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called c4.o.
-
-Verbose reason code reporting (kernel size +=7K)
-CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON
-  If you say Y here, the AVM B1 driver will give verbose reasons for
-  disconnecting. This will increase the size of the kernel by 7 KB. If
-  unsure, say Y.
-
-IBM Active 2000 support
-CONFIG_ISDN_DRV_ACT2000
-  Say Y here if you have an IBM Active 2000 ISDN card. In order to use
-  this card, additional firmware is necessary, which has to be loaded
-  into the card using a utility which is part of the latest
-  isdn4k-utils package. Please read the file
-  <file:Documentation/isdn/README.act2000> for more information.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called act2000.o.
-
-Auvertech TurboPAM support
-CONFIG_ISDN_DRV_TPAM
-  This enables support for the Auvertech TurboPAM ISDN-card.
-  For running this card, additional firmware is necessary, which has
-  to be downloaded into the card using a utility which is distributed
-  separately from the Auvertech's web site: <http://www.auvertech.fr/>.
-
-  Please redirect all support questions to support@auvertech.fr.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called tpam.o.
-
-Hypercope HYSDN cards (Champ, Ergo, Metro) support (module)
-CONFIG_HYSDN
-  Say Y here if you have one of Hypercope's active PCI ISDN cards
-  Champ, Ergo and Metro. You will then get a module called hysdn.o.
-  Please read the file <file:Documentation/isdn/README.hysdn> for more
-  information.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called hysdn.o.
-
-HYSDN CAPI 2.0 support
-CONFIG_HYSDN_CAPI
-  Say Y here if you like to use Hypercope's CAPI 2.0 interface.
-
-Support for SUN4 machines (disables SUN4[CDM] support)
-CONFIG_SUN4
-  Say Y here if, and only if, your machine is a Sun4. Note that
-  a kernel compiled with this option will run only on Sun4.
-  (And the current version will probably work only on sun4/330.)
-
-SPARC ESP SCSI support
-CONFIG_SCSI_SUNESP
-  This is the driver for the Sun ESP SCSI host adapter. The ESP
-  chipset is present in most SPARC SBUS-based computers.
-
-  This support is also available as a module called esp.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-PTI Qlogic, ISP Driver
-CONFIG_SCSI_QLOGICPTI
-  This driver supports SBUS SCSI controllers from PTI or QLogic. These
-  controllers are known under Solaris as qpti and in the openprom as
-  PTI,ptisp or QLGC,isp. Note that PCI QLogic SCSI controllers are
-  driven by a different driver.
-
-  This support is also available as a module called qlogicpti.o ( =
-  code which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Sun PROM console
-CONFIG_PROM_CONSOLE
-  Say Y to build a console driver for Sun machines that uses the
-  terminal emulation built into their console PROMS.
-
-/dev/openprom device support
-CONFIG_SUN_OPENPROMIO
-  This driver provides user programs with an interface to the SPARC
-  PROM device tree. The driver implements a SunOS-compatible
-  interface and a NetBSD-compatible interface.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M and read <file:Documentation/modules.txt>. If unsure, say Y.
-
-Openprom tree appears in /proc/openprom
-CONFIG_SUN_OPENPROMFS
-  If you say Y, the OpenPROM device tree will be available as a
-  virtual file system, which you can mount to /proc/openprom by "mount
-  -t openpromfs none /proc/openprom".
-
-  If you want to compile the /proc/openprom support as a module ( =
-  code which can be inserted in and removed from the running kernel
-  whenever you want), say M here and read
-  <file:Documentation/modules.txt>.
-  The module will be called openpromfs.o.  If unsure, say M.
-
-Kernel support for Linux/Sparc 32bit binary compatibility
-CONFIG_SPARC32_COMPAT
-  This allows you to run 32-bit binaries on your Ultra.
-  Everybody wants this; say Y.
-
-Kernel support for 32-bit ELF binaries
-CONFIG_BINFMT_ELF32
-  This allows you to run 32-bit Linux/ELF binaries on your machine.
-  Everybody wants this; say Y.
-
-Kernel support for 32-bit (ie. SunOS) a.out binaries
-CONFIG_BINFMT_AOUT32
-  This allows you to run 32-bit a.out format binaries on your Ultra.
-  If you want to run SunOS binaries (see SunOS binary emulation below)
-  or other a.out binaries, say Y. If unsure, say N.
-
-SunOS binary emulation
-CONFIG_SUNOS_EMUL
-  This allows you to run most SunOS binaries.  If you want to do this,
-  say Y here and place appropriate files in /usr/gnemul/sunos. See
-  <http://www.ultralinux.org/faq.html> for more information.  If you
-  want to run SunOS binaries on an Ultra you must also say Y to
-  "Kernel support for 32-bit a.out binaries" above.
-
-Mostek real time clock support
-CONFIG_SUN_MOSTEK_RTC
-  The Mostek RTC chip is used on all known Sun computers except
-  some JavaStations. For a JavaStation you need to say Y both here
-  and to "Enhanced Real Time Clock Support".
-
-  Say Y here unless you are building a special purpose kernel.
-
-OBP Flash Device support
-CONFIG_OBP_FLASH
-  The OpenBoot PROM on Ultra systems is flashable. If you want to be
-  able to upgrade the OBP firmware, say Y here.
-
-JavaStation OS Flash SIMM
-CONFIG_SUN_JSFLASH
-  If you say Y here, you will be able to boot from your JavaStation's
-  Flash memory.
-
-Siemens SAB82532 serial support
-CONFIG_SAB82532
-  This driver supports the serial ports on newer (PCI) Ultra systems.
-  Say Y if you want to be able to use your serial ports.
-
-Videopix Frame Grabber
-CONFIG_SUN_VIDEOPIX
-  Say Y here to support the Videopix Frame Grabber from Sun
-  Microsystems, commonly found on SPARCstations.  This card, which is
-  based on the Phillips SAA9051, can handle NTSC and PAL/SECAM and
-  SVIDEO signals.
-
-Sun bidirectional parallel port support
-CONFIG_SUN_BPP
-  Say Y here to support Sun's obsolete variant of IEEE1284
-  bidirectional parallel port protocol as /dev/bppX.  Can be built on
-  x86 machines.
-
-Aurora Multiboard 1600se
-CONFIG_SUN_AURORA
-  The Aurora Multiboard is a multi-port high-speed serial controller.
-  If you have one of these, say Y.
-
-Tadpole TS102 Microcontroller support
-CONFIG_TADPOLE_TS102_UCTRL
-  Say Y here to directly support the TS102 Microcontroller interface
-  on the Tadpole Sparcbook 3.  This device handles power-management
-  events, and can also notice the attachment/detachment of external
-  monitors and mice.
-
-Audio support
-CONFIG_SPARCAUDIO
-  This driver provides support for the build-in sound devices on most
-  Sun machines. If you want to be able to use this, select this option
-  and one or more of the lowlevel drivers below. See
-  <http://www.dementia.org/~shadow/sparcaudio.html> for more
-  information.
-
-AMD7930 Lowlevel Driver
-CONFIG_SPARCAUDIO_AMD7930
-  This driver supports the AMD 7930 chip found on sun4c, 4/6xx, and
-  SparcClassic systems.
-
-CS4231 Lowlevel Driver
-CONFIG_SPARCAUDIO_CS4231
-  This driver supports the Crystal Semiconductor CS4231 chip found on
-  the SS4, SS5, and Ultras.
-
-DBRI Lowlevel Driver
-CONFIG_SPARCAUDIO_DBRI
-  This driver supports the DBRI audio interface found on the SS10,
-  SS20, LX, Sparcbook 3, and Voyager systems.
-
-Dummy Lowlevel Driver
-CONFIG_SPARCAUDIO_DUMMY
-  This is a pseudo-driver used for debugging and testing the
-  sparcaudio subsystem. Say N unless you want to work on this
-  subsystem.
-
-Sparc hardware
-CONFIG_PARPORT_SUNBPP
-  This driver provides support for the bidirectional parallel port
-  found on many Sun machines. Note that many of the newer Ultras
-  actually have pc style hardware instead.
-
-SPARC power management support
-CONFIG_SUN_PM
-  Enable power management and CPU standby features on supported 
-  SPARC platforms. 
-
-/proc/hardware support
-CONFIG_PROC_HARDWARE
-  Say Y here to support the /proc/hardware file, which gives you
-  access to information about the machine you're running on,
-  including the model, CPU, MMU, clock speed, BogoMIPS rating,
-  and memory size.
-
-Bluetooth subsystem support
-CONFIG_BLUEZ
-  Bluetooth is low-cost, low-power, short-range wireless technology.
-  It was designed as a replacement for cables and other short-range
-  technologies like IrDA.  Bluetooth operates in personal area range
-  that typically extends up to 10 meters.  More information about
-  Bluetooth can be found at <http://www.bluetooth.com/>.
-
-  Linux Bluetooth subsystem consist of several layers:
-               BlueZ Core (HCI device and connection manager, scheduler)
-               HCI Device drivers (interface to the hardware)
-               L2CAP Module (L2CAP protocol)
-               SCO Module (SCO links)
-               RFCOMM Module (RFCOMM protocol)
-               BNEP Module (BNEP protocol)
-
-  Say Y here to enable Linux Bluetooth support and to build BlueZ Core
-  layer.
-
-  To use Linux Bluetooth subsystem, you will need several user-space
-  utilities like hciconfig and hcid.  These utilities and updates to
-  Bluetooth kernel modules are provided in the BlueZ package.
-  For more information, see <http://bluez.sourceforge.net/>.
-
-  If you want to compile BlueZ Core as module (bluez.o) say M here.
-
-L2CAP protocol support
-CONFIG_BLUEZ_L2CAP
-  L2CAP (Logical Link Control and Adaptation Protocol) provides
-  connection oriented and connection-less data transport.  L2CAP
-  support is required for most Bluetooth applications.
-
-  Say Y here to compile L2CAP support into the kernel or say M to
-  compile it as module (l2cap.o).
-
-SCO links support
-CONFIG_BLUEZ_SCO
-  SCO link provides voice transport over Bluetooth. SCO support is
-  required for voice applications like Headset and Audio.
-
-  Say Y here to compile SCO support into the kernel or say M to
-  compile it as module (sco.o).
-
-RFCOMM protocol support
-CONFIG_BLUEZ_RFCOMM
-  RFCOMM provides connection oriented stream transport. RFCOMM
-  support is required for Dialup Networking, OBEX and other Bluetooth
-  applications.
-
-  Say Y here to compile RFCOMM support into the kernel or say M to
-  compile it as module (rfcomm.o).
-
-RFCOMM TTY emulation support
-CONFIG_BLUEZ_RFCOMM_TTY
-  This option enables TTY emulation support for RFCOMM channels.
-
-BNEP protocol support
-CONFIG_BLUEZ_BNEP
-  BNEP (Bluetooth Network Encapsulation Protocol) is Ethernet
-  emulation layer on top of Bluetooth. BNEP is required for Bluetooth
-  PAN (Personal Area Network).
-
-  To use BNEP, you will need user-space utilities provided in the 
-  BlueZ-PAN package.
-  For more information, see <http://bluez.sourceforge.net>.
-
-  Say Y here to compile BNEP support into the kernel or say M to
-  compile it as module (bnep.o).
-
-BNEP multicast filter support
-CONFIG_BLUEZ_BNEP_MC_FILTER
-  This option enables the multicast filter support for BNEP.
-
-BNEP protocol filter support
-CONFIG_BLUEZ_BNEP_PROTO_FILTER
-  This option enables the protocol filter support for BNEP.
-
-HCI UART driver
-CONFIG_BLUEZ_HCIUART
-  Bluetooth HCI UART driver.
-  This driver is required if you want to use Bluetooth devices with
-  serial port interface. You will also need this driver if you have 
-  UART based Bluetooth PCMCIA and CF devices like Xircom Credit Card 
-  adapter and BrainBoxes Bluetooth PC Card.
-
-  Say Y here to compile support for Bluetooth UART devices into the
-  kernel or say M to compile it as module (hci_uart.o).
-
-HCI UART (H4) protocol support 
-CONFIG_BLUEZ_HCIUART_H4
-  UART (H4) is serial protocol for communication between Bluetooth 
-  device and host. This protocol is required for most Bluetooth devices 
-  with UART interface, including PCMCIA and CF cards. 
-
-  Say Y here to compile support for HCI UART (H4) protocol.
-
-HCI BCSP protocol support 
-CONFIG_BLUEZ_HCIUART_BCSP
-  BCSP (BlueCore Serial Protocol) is serial protocol for communication 
-  between Bluetooth device and host. This protocol is required for non
-  USB Bluetooth devices based on CSR BlueCore chip, including PCMCIA and 
-  CF cards.
-
-  Say Y here to compile support for HCI BCSP protocol.
-
-HCI BCSP transmit CRC with every BCSP packet
-CONFIG_BLUEZ_HCIUART_BCSP_TXCRC
-  If you say Y here, a 16-bit CRC checksum will be transmitted along with
-  every BCSP (BlueCore Serial Protocol) packet sent to the Bluetooth chip.
-  This increases reliability, but slightly reduces efficiency.
-
-HCI USB driver
-CONFIG_BLUEZ_HCIUSB
-  Bluetooth HCI USB driver.
-  This driver is required if you want to use Bluetooth devices with
-  USB interface.
-
-  Say Y here to compile support for Bluetooth USB devices into the
-  kernel or say M to compile it as module (hci_usb.o).
-
-HCI USB SCO (voice) support
-CONFIG_BLUEZ_USB_SCO
-  This option enables the SCO support in the HCI USB driver. You need this
-  to transmit voice data with your Bluetooth USB device. And your device
-  must also support sending SCO data over the HCI layer, because some of
-  them sends the SCO data to an internal PCM adapter.
-  Say Y here to compile support for HCI SCO data.
-HCI USB zero packet support
-CONFIG_BLUEZ_USB_ZERO_PACKET
-  This option is provided only as a work around for buggy Bluetooth USB 
-  devices. Do NOT enable it unless you know for sure that your device 
-  requires zero packets.
-  Most people should say N here.
-
-HCI VHCI Virtual HCI device driver
-CONFIG_BLUEZ_HCIVHCI
-  Bluetooth Virtual HCI device driver.
-  This driver is required if you want to use HCI Emulation software.
-
-  Say Y here to compile support for virtual HCI devices into the
-  kernel or say M to compile it as module (hci_vhci.o).
-
-HCI DTL1 (PC Card) device driver
-CONFIG_BLUEZ_HCIDTL1
-  Bluetooth HCI DTL1 (PC Card) driver.
-  This driver provides support for Bluetooth PCMCIA devices with
-  Nokia DTL1 interface:
-     Nokia Bluetooth Card
-     Socket Bluetooth CF Card
-
-  Say Y here to compile support for HCI DTL1 devices into the
-  kernel or say M to compile it as module (dtl1_cs.o).
-
-HCI BT3C (PC Card) device driver
-CONFIG_BLUEZ_HCIBT3C
-  Bluetooth HCI BT3C (PC Card) driver.
-  This driver provides support for Bluetooth PCMCIA devices with
-  3Com BT3C interface:
-     3Com Bluetooth Card (3CRWB6096)
-     HP Bluetooth Card
-
-  The HCI BT3C driver uses external firmware loader program provided in
-  the BlueFW package. For more information, see <http://bluez.sf.net>.
-
-  Say Y here to compile support for HCI BT3C devices into the
-  kernel or say M to compile it as module (bt3c_cs.o).
-
-HCI BlueCard (PC Card) device driver
-CONFIG_BLUEZ_HCIBLUECARD
-  Bluetooth HCI BlueCard (PC Card) driver.
-  This driver provides support for Bluetooth PCMCIA devices with
-  Anycom BlueCard interface:
-     Anycom Bluetooth PC Card
-     Anycom Bluetooth CF Card
-
-  Say Y here to compile support for HCI BlueCard devices into the
-  kernel or say M to compile it as module (bluecard_cs.o).
-
-HCI UART (PC Card) device driver
-CONFIG_BLUEZ_HCIBTUART
-  Bluetooth HCI UART (PC Card) driver.
-  This driver provides support for Bluetooth PCMCIA devices with
-  an UART interface:
-     Xircom CreditCard Bluetooth Adapter
-     Xircom RealPort2 Bluetooth Adapter
-     Sphinx PICO Card
-     H-Soft blue+Card
-     Cyber-blue Compact Flash Card
-
-  Say Y here to compile support for HCI UART devices into the
-  kernel or say M to compile it as module (btuart_cs.o).
-
-# The following options are for Linux when running on the Hitachi
-# SuperH family of RISC microprocessors.
-
-SuperH RTC support
-CONFIG_SH_RTC
-  Selecting this option will allow the Linux kernel to emulate
-  PC's RTC.
-
-  If unsure, say N.
-
-SuperH DMAC support
-CONFIG_SH_DMA
-  Selecting this option will provide same API as PC's Direct Memory
-  Access Controller(8237A) for SuperH DMAC.
-
-  If unsure, say N.
-
-# Choice: cf_area
-CompactFlash Connection Area
-CONFIG_CF_AREA5
-  If your board has "Directly Connected" CompactFlash, You should
-  select the area where your CF is connected to.
-  
-  - "Area5" if CompactFlash is connected to Area 5 (0x14000000)
-  - "Area6" if it is connected to Area 6 (0x18000000)
-
-  "Area6" will work for most boards. For ADX, select "Area5".
-
-Disable data cache
-CONFIG_DCACHE_DISABLE
-  This option allows you to run the kernel with data cache disabled.
-  Say Y if you experience CPM lock-ups.
-
-#
-# m68k-specific kernel options
-# Documented by Chris Lawrence <mailto:quango@themall.net> et al.
-#
-Amiga support
-CONFIG_AMIGA
-  This option enables support for the Amiga series of computers. If
-  you plan to use this kernel on an Amiga, say Y here and browse the
-  material available in <file:Documentation/m68k>; otherwise say N.
-
-Commodore A2232 serial support
-CONFIG_A2232
-  This option supports the 2232 7-port serial card shipped with the
-  Amiga 2000 and other Zorro-bus machines, dating from 1989.  At
-  a max of 19,200 bps, the ports are served by a 6551 ACIA UART chip
-  each, plus a 8520 CIA, and a master 6502 CPU and buffer as well. The
-  ports were connected with 8 pin DIN connectors on the card bracket,
-  for which 8 pin to DB25 adapters were supplied. The card also had
-  jumpers internally to toggle various pinning configurations.
-
-  This driver can be built as a module; but then "generic_serial.o"
-  will also be built as a module. This has to be loaded before
-  "ser_a2232.o". If you want to do this, answer M here and read
-  "<file:Documentation/modules.txt>".
-
-A4000T SCSI support
-CONFIG_A4000T_SCSI
-  Support for the NCR53C710 SCSI controller on the Amiga 4000T.
-
-A4091 SCSI support
-CONFIG_A4091_SCSI
-  Support for the NCR53C710 chip on the Amiga 4091 Z3 SCSI2 controller
-  (1993).  Very obscure -- the 4091 was part of an Amiga 4000 upgrade
-  plan at the time the Amiga business was sold to DKB.
-
-Atari support
-CONFIG_ATARI
-  This option enables support for the 68000-based Atari series of
-  computers (including the TT, Falcon and Medusa). If you plan to use
-  this kernel on an Atari, say Y here and browse the material
-  available in <file:Documentation/m68k>; otherwise say N.
-
-Hades support
-CONFIG_HADES
-  This option enables support for the Hades Atari clone. If you plan
-  to use this kernel on a Hades, say Y here; otherwise say N.
-
-Macintosh support
-CONFIG_MAC
-  This option enables support for the Apple Macintosh series of
-  computers (yes, there is experimental support now, at least for part
-  of the series).
-
-  Say N unless you're willing to code the remaining necessary support.
-  ;)
-
-HP9000/300 support
-CONFIG_HP300
-  This option enables support for the HP9000/300 series of
-  workstations. Support for these machines is still very experimental.
-  If you plan to try to use the kernel on such a machine say Y here.
-  Everybody else says N.
-
-Q40/Q60 support
-CONFIG_Q40
-  The Q40 is a Motorola 68040-based successor to the Sinclair QL
-  manufactured in Germany.  There is an official Q40 home page at
-  <http://www.q40.de/>.  This option enables support for the Q40 and
-  Q60. Select your CPU below.  For 68LC060 don't forget to enable FPU
-  emulation.
-
-Q40/Q60 IDE interface support
-CONFIG_BLK_DEV_Q40IDE
-  Enable the on-board IDE controller in the Q40/Q60.  This should
-  normally be on; disable it only if you are running a custom hard
-  drive subsystem through an expansion card.
-
-Sun 3 support
-CONFIG_SUN3
-  This option enables support for the Sun 3 series of workstations.
-  Note that if this option is enabled, support for all other m68k 
-  platforms above must be disabled in order to produce a working 
-  kernel.
-
-  Also, you will want to enable 68020 support below, and disable 
-  all other CPU types.  General Linux information on the Sun 3x series
-  (now discontinued) is at
-  <http://www.angelfire.com/ca2/tech68k/sun3.html>.
-
-  If you don't want to compile a kernel for a Sun 3, say N.
-
-Sun 3X support
-CONFIG_SUN3X
-  This option enables support for the Sun 3x series of workstations.
-  Currently, only the Sun 3/80 is supported within the Sun 3x family.
-  You will also want to enable 68030 support below  
-  General Linux information on the Sun 3x series (now discontinued)
-  is at <http://www.angelfire.com/ca2/tech68k/sun3.html>.
-
-  If you don't want to compile a kernel for a Sun 3x, say N.
-
-Sun3x builtin serial support
-CONFIG_SUN3X_ZS
-  ZS refers to a type of asynchronous serial port built in to the Sun3
-  and Sun3x workstations; if you have a Sun 3, you probably have
-  these.  Say 'Y' to support ZS ports directly.  This option must be
-  enabled in order to support the keyboard and mouse ports.
-
-Sun keyboard support
-CONFIG_SUN_KEYBOARD
-  Say Y here to support the keyboard found on Sun 3 and 3x
-  workstations.  It can also be used support Sun Type-5 keyboards
-  through an adaptor.  See
-  <http://www.suse.cz/development/input/adapters.html> and
-  <http://sourceforge.net/projects/linuxconsole/> for details on the
-  latter.
-
-68020 support
-CONFIG_M68020
-  If you anticipate running this kernel on a computer with a MC68020
-  processor, say Y. Otherwise, say N. Note that the 68020 requires a
-  68851 MMU (Memory Management Unit) to run Linux/m68k, except on the
-  Sun 3, which provides its own version.
-
-68030 support
-CONFIG_M68030
-  If you anticipate running this kernel on a computer with a MC68030
-  processor, say Y. Otherwise, say N. Note that a MC68EC030 will not
-  work, as it does not include an MMU (Memory Management Unit).
-
-68040 support
-CONFIG_M68040
-  If you anticipate running this kernel on a computer with a MC68LC040
-  or MC68040 processor, say Y. Otherwise, say N. Note that an
-  MC68EC040 will not work, as it does not include an MMU (Memory
-  Management Unit).
-
-68060 support
-CONFIG_M68060
-  If you anticipate running this kernel on a computer with a MC68060
-  processor, say Y. Otherwise, say N.
-
-Math emulation support
-CONFIG_M68KFPU_EMU
-  At some point in the future, this will cause floating-point math
-  instructions to be emulated by the kernel on machines that lack a
-  floating-point math coprocessor.  Thrill-seekers and chronically
-  sleep-deprived psychotic hacker types can say Y now, everyone else
-  should probably wait a while.
-
-Math emulation only kernel
-CONFIG_M68KFPU_EMU_ONLY
-  This option prevents any floating-point instructions from being
-  compiled into the kernel, thereby the kernel doesn't save any
-  floating point context anymore during task switches, so this
-  kernel will only be usable on machines without a floating-point
-  math coprocessor. This makes the kernel a bit faster as no tests
-  needs to be executed whether a floating-point instruction in the
-  kernel should be executed or not.
-
-Math emulation extra precision
-CONFIG_M68KFPU_EMU_EXTRAPREC
-  The fpu uses normally a few bit more during calculations for
-  correct rounding, the emulator can (often) do the same but this
-  extra calculation can cost quite some time, so you can disable
-  it here. The emulator will then "only" calculate with a 64 bit
-  mantissa and round slightly incorrect, what is more then enough
-  for normal usage.
-
-Advanced configuration options
-CONFIG_ADVANCED
-  This gives you access to some advanced options for the CPU. The
-  defaults should be fine for most users, but these options may make
-  it possible for you to improve performance somewhat if you know what
-  you are doing.
-
-  Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause the configurator to skip all
-  the questions about these options.
-
-  Most users should say N to this question.
-
-Use one physical chunk of memory only
-CONFIG_SINGLE_MEMORY_CHUNK
-  Ignore all but the first contiguous chunk of physical memory for VM
-  purposes.  This will save a few bytes kernel size and may speed up
-  some operations.  Say N if not sure.
-
-Use read-modify-write instructions
-CONFIG_RMW_INSNS
-  This allows to use certain instructions that work with indivisible
-  read-modify-write bus cycles. While this is faster than the
-  workaround of disabling interrupts, it can conflict with DMA
-  ( = direct memory access) on many Amiga systems, and it is also said
-  to destabilize other machines. It is very likely that this will
-  cause serious problems on any Amiga or Atari Medusa if set. The only
-  configuration where it should work are 68030-based Ataris, where it
-  apparently improves performance. But you've been warned! Unless you
-  really know what you are doing, say N. Try Y only if you're quite
-  adventurous.
-
-Amiga Zorro (AutoConfig) bus support
-CONFIG_ZORRO
-  This enables support for the Zorro bus in the Amiga. If you have
-  expansion cards in your Amiga that conform to the Amiga
-  AutoConfig(tm) specification, say Y, otherwise N. Note that even
-  expansion cards that do not fit in the Zorro slots but fit in e.g.
-  the CPU slot may fall in this category, so you have to say Y to let
-  Linux use these.
-
-Zorro device name database
-CONFIG_ZORRO_NAMES
-  By default, the kernel contains a database of all known Zorro device
-  names to make the information in /proc/iomem comprehensible to the
-  user. This database increases the size of the kernel image by about
-  15KB, but it gets freed after the system boots up, so it doesn't
-  take up kernel memory. Anyway, if you are building an installation
-  floppy or kernel for an embedded system where kernel image size
-  really matters, you can disable this feature and you'll get device
-  ID numbers instead of names.
-
-  When in doubt, say Y.
-
-Amiga 1200/600 PCMCIA support
-CONFIG_AMIGA_PCMCIA
-  Include support in the kernel for pcmcia on Amiga 1200 and Amiga
-  600. If you intend to use pcmcia cards say Y; otherwise say N.
-
-Hisoft Whippet PCMCIA serial support
-CONFIG_WHIPPET_SERIAL
-  HiSoft has a web page at <http://www.hisoft.co.uk/>, but there
-  is no listing for the Whippet in their Amiga section.
-
-Amiga Zorro II ramdisk support
-CONFIG_AMIGA_Z2RAM
-  This enables support for using Chip RAM and Zorro II RAM as a
-  ramdisk or as a swap partition. Say Y if you want to include this
-  driver in the kernel. This driver is also available as a module
-  ( = code which can be inserted in and removed from the running
-  kernel whenever you want). The module is called z2ram.o. If you want
-  to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-Support for ST-RAM as swap space
-CONFIG_STRAM_SWAP
-  Some Atari 68k machines (including the 520STF and 1020STE) divide
-  their addressable memory into ST and TT sections.  The TT section
-  (up to 512MB) is the main memory; the ST section (up to 4MB) is
-  accessible to the built-in graphics board, runs slower, and is
-  present mainly for backward compatibility with older machines.
-
-  This enables support for using (parts of) ST-RAM as swap space,
-  instead of as normal system memory. This can first enhance system
-  performance if you have lots of alternate RAM (compared to the size
-  of ST-RAM), because executable code always will reside in faster
-  memory. ST-RAM will remain as ultra-fast swap space. On the other
-  hand, it allows much improved dynamic allocations of ST-RAM buffers
-  for device driver modules (e.g. floppy, ACSI, SLM printer, DMA
-  sound). The probability that such allocations at module load time
-  fail is drastically reduced.
-
-ST-RAM statistics in /proc
-CONFIG_STRAM_PROC
-  Say Y here to report ST-RAM usage statistics in /proc/stram.  See
-  the help for CONFIG_STRAM_SWAP for discussion of ST-RAM and its
-  uses.
-
-Atari ACSI support
-CONFIG_ATARI_ACSI
-  This enables support for the Atari ACSI interface. The driver
-  supports hard disks and CD-ROMs, which have 512-byte sectors, or can
-  be switched to that mode. Due to the ACSI command format, only disks
-  up to 1 GB are supported. Special support for certain ACSI to SCSI
-  adapters, which could relax that, isn't included yet. The ACSI
-  driver is also the basis for certain other drivers for devices
-  attached to the ACSI bus: Atari SLM laser printer, BioNet-100
-  Ethernet, and PAMsNet Ethernet. If you want to use one of these
-  devices, you need ACSI support, too.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called acsi.o.
-
-Probe all LUNs on each ACSI device
-CONFIG_ACSI_MULTI_LUN
-  If you have a ACSI device that supports more than one LUN (Logical
-  Unit Number), e.g. a CD jukebox, you should say Y here so that all
-  will be found by the ACSI driver. An ACSI device with multiple LUNs
-  acts logically like multiple ACSI devices. The vast majority of ACSI
-  devices have only one LUN, and so most people can say N here and
-  should in fact do so, because it is safer.
-
-Atari SLM laser printer support
-CONFIG_ATARI_SLM
-  If you have an Atari SLM laser printer, say Y to include support for
-  it in the kernel. Otherwise, say N. This driver is also available as
-  a module ( = code which can be inserted in and removed from the
-  running kernel whenever you want). The module will be called
-  acsi_slm.o. Be warned: the driver needs much ST-RAM and can cause
-  problems due to that fact!
-
-A3000 WD33C93A support
-CONFIG_A3000_SCSI
-  If you have an Amiga 3000 and have SCSI devices connected to the
-  built-in SCSI controller, say Y. Otherwise, say N. This driver is
-  also available as a module ( = code which can be inserted in and
-  removed from the running kernel whenever you want). The module is
-  called wd33c93.o. If you want to compile it as a module, say M here
-  and read <file:Documentation/modules.txt>.
-
-A2091 WD33C93A support
-CONFIG_A2091_SCSI
-  If you have a Commodore A2091 SCSI controller, say Y. Otherwise,
-  say N. This driver is also available as a module ( = code which can
-  be inserted in and removed from the running kernel whenever you
-  want). The module is called wd33c93.o. If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-GVP Series II WD33C93A support
-CONFIG_GVP11_SCSI
-  If you have a Great Valley Products Series II SCSI controller,
-  answer Y. Also say Y if you have a later model of GVP SCSI
-  controller (such as the GVP A4008 or a Combo board). Otherwise,
-  answer N. This driver does NOT work for the T-Rex series of
-  accelerators from TekMagic and GVP-M.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you
-  want). The module will be called gvp11.o. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-CyberStorm SCSI support
-CONFIG_CYBERSTORM_SCSI
-  If you have an Amiga with an original (MkI) Phase5 Cyberstorm
-  accelerator board and the optional Cyberstorm SCSI controller,
-  answer Y. Otherwise, say N.
-
-CyberStorm II SCSI support
-CONFIG_CYBERSTORMII_SCSI
-  If you have an Amiga with a Phase5 Cyberstorm MkII accelerator board
-  and the optional Cyberstorm SCSI controller, say Y. Otherwise,
-  answer N.
-
-Blizzard 2060 SCSI support
-CONFIG_BLZ2060_SCSI
-  If you have an Amiga with a Phase5 Blizzard 2060 accelerator board
-  and want to use the onboard SCSI controller, say Y. Otherwise,
-  answer N.
-
-Blizzard 1230IV/1260 SCSI support
-CONFIG_BLZ1230_SCSI
-  If you have an Amiga 1200 with a Phase5 Blizzard 1230IV or Blizzard
-  1260 accelerator, and the optional SCSI module, say Y. Otherwise,
-  say N.
-
-Blizzard PowerUP 603e+ SCSI support
-CONFIG_BLZ603EPLUS_SCSI
-  If you have an Amiga 1200 with a Phase5 Blizzard PowerUP 603e+
-  accelerator, say Y. Otherwise, say N.
-
-Fastlane SCSI support
-CONFIG_FASTLANE_SCSI
-  If you have the Phase5 Fastlane Z3 SCSI controller, or plan to use
-  one in the near future, say Y to this question. Otherwise, say N.
-
-BSC Oktagon SCSI support
-CONFIG_OKTAGON_SCSI
-  If you have the BSC Oktagon SCSI disk controller for the Amiga, say
-  Y to this question.  If you're in doubt about whether you have one,
-  see the picture at
-  <http://amiga.multigraph.com/photos/oktagon.html>.
-
-Atari native SCSI support
-CONFIG_ATARI_SCSI
-  If you have an Atari with built-in NCR5380 SCSI controller (TT,
-  Falcon, ...) say Y to get it supported. Of course also, if you have
-  a compatible SCSI controller (e.g. for Medusa).  This driver is also
-  available as a module ( = code which can be inserted in and removed
-  from the running kernel whenever you want).  The module is called
-  atari_scsi.o.  If you want to compile it as a module, say M here and
-  read <file:Documentation/modules.txt>.  This driver supports both
-  styles of NCR integration into the system: the TT style (separate
-  DMA), and the Falcon style (via ST-DMA, replacing ACSI).  It does
-  NOT support other schemes, like in the Hades (without DMA).
-
-Long delays for Toshiba CD-ROMs
-CONFIG_ATARI_SCSI_TOSHIBA_DELAY
-  This option increases the delay after a SCSI arbitration to
-  accommodate some flaky Toshiba CD-ROM drives. Say Y if you intend to
-  use a Toshiba CD-ROM drive; otherwise, the option is not needed and
-  would impact performance a bit, so say N.
-
-Reset SCSI-devices at boottime
-CONFIG_ATARI_SCSI_RESET_BOOT
-  Reset the devices on your Atari whenever it boots.  This makes the
-  boot process fractionally longer but may assist recovery from errors
-  that leave the devices with SCSI operations partway completed.
-
-Hades SCSI DMA emulator
-CONFIG_TT_DMA_EMUL
-  This option enables code which emulates the TT SCSI DMA chip on the
-  Hades. This increases the SCSI transfer rates at least ten times
-  compared to PIO transfers.
-
-Sun3x ESP SCSI
-CONFIG_SUN3X_ESP
-  This option will enable support for the ESP SCSI controller found
-  onboard the Sun 3/80.
-
-Ariadne support
-CONFIG_ARIADNE
-  If you have a Village Tronic Ariadne Ethernet adapter, say Y.
-  Otherwise, say N.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you
-  want). The module is called ariadne.o. If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-Ariadne II and X-Surf support
-CONFIG_ARIADNE2
-  This driver is for the Village Tronic Ariadne II and the Individual
-  Computers X-Surf Ethernet cards. If you have such a card, say Y.
-  Otherwise, say N.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called ariadne2.o. If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-A2065 support
-CONFIG_A2065
-  If you have a Commodore A2065 Ethernet adapter, say Y. Otherwise,
-  say N.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you
-  want). The module is called a2065.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Hydra support
-CONFIG_HYDRA
-  If you have a Hydra Ethernet adapter, say Y. Otherwise, say N.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you
-  want). The module is called hydra.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Sun3 NCR5380 SCSI
-CONFIG_SUN3_SCSI
-  This option will enable support for the OBIO (onboard io) NCR5380
-  SCSI controller found in the Sun 3/50 and 3/60, as well as for
-  "Sun3" type VME scsi controllers also based on the NCR5380.
-  General Linux information on the Sun 3 series (now discontinued)
-  is at <http://www.angelfire.com/ca2/tech68k/sun3.html>.
-
-PCMCIA NE2000 and compatibles support
-CONFIG_APNE
-  If you have a PCMCIA NE2000 compatible adapter, say Y.  Otherwise,
-  say N.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you
-  want). The module is called apne.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Atari Lance support
-CONFIG_ATARILANCE
-  Say Y to include support for several Atari Ethernet adapters based
-  on the AMD Lance chipset: RieblCard (with or without battery), or
-  PAMCard VME (also the version by Rhotron, with different addresses).
-
-BioNet-100 support
-CONFIG_ATARI_BIONET
-  Say Y to include support for BioData's BioNet-100 Ethernet adapter
-  for the ACSI port. The driver works (has to work...) with a polled
-  I/O scheme, so it's rather slow :-(
-
-PAMsNet support
-CONFIG_ATARI_PAMSNET
-  Say Y to include support for the PAMsNet Ethernet adapter for the
-  ACSI port ("ACSI node"). The driver works (has to work...) with a
-  polled I/O scheme, so it's rather slow :-(
-
-Amiga mouse support
-CONFIG_AMIGAMOUSE
-  If you want to be able to use an Amiga mouse in Linux, say Y.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module is called amigamouse.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Atari mouse support
-CONFIG_ATARIMOUSE
-  If you want to be able to use an Atari mouse in Linux, say Y.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module is called atarimouse.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-Atari MFP serial support
-CONFIG_ATARI_MFPSER
-  If you like to use the MFP serial ports ("Modem1", "Serial1") under
-  Linux, say Y. The driver equally supports all kinds of MFP serial
-  ports and automatically detects whether Serial1 is available.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-  Note for Falcon users: You also have an MFP port, it's just not
-  wired to the outside... But you could use the port under Linux.
-
-Atari SCC serial support
-CONFIG_ATARI_SCC
-  If you have serial ports based on a Zilog SCC chip (Modem2, Serial2,
-  LAN) and like to use them under Linux, say Y. All built-in SCC's are
-  supported (TT, MegaSTE, Falcon), and also the ST-ESCC. If you have
-  two connectors for channel A (Serial2 and LAN), they are visible as
-  two separate devices.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-Atari SCC serial DMA support
-CONFIG_ATARI_SCC_DMA
-  This enables DMA support for receiving data on channel A of the SCC.
-  If you have a TT you may say Y here and read
-  drivers/char/atari_SCC.README. All other users should say N here,
-  because only the TT has SCC-DMA, even if your machine keeps claiming
-  so at boot time.
-
-Atari MIDI serial support
-CONFIG_ATARI_MIDI
-  If you want to use your Atari's MIDI port in Linux, say Y.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you
-  want). If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-Atari DSP56k Digital Signal Processor support
-CONFIG_ATARI_DSP56K
-  If you want to be able to use the DSP56001 in Falcons, say Y. This
-  driver is still experimental, and if you don't know what it is, or
-  if you don't have this processor, just say N.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-Support for early boot text console
-CONFIG_BOOTX_TEXT
-  Say Y here to see progress messages from the boot firmware in text
-  mode. Requires either BootX or Open Firmware.
-
-Amiga builtin serial support
-CONFIG_AMIGA_BUILTIN_SERIAL
-  If you want to use your Amiga's built-in serial port in Linux,
-  answer Y.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you
-  want). If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-GVP IO-Extender support
-CONFIG_GVPIOEXT
-  If you want to use a GVP IO-Extender serial card in Linux, say Y.
-  Otherwise, say N.
-
-GVP IO-Extender parallel printer support
-CONFIG_GVPIOEXT_LP
-  Say Y to enable driving a printer from the parallel port on your
-  GVP IO-Extender card, N otherwise.
-
-GVP IO-Extender PLIP support
-CONFIG_GVPIOEXT_PLIP
-  Say Y to enable doing IP over the parallel port on your GVP
-  IO-Extender card, N otherwise.
-
-Multiface Card III serial support
-CONFIG_MULTIFACE_III_TTY
-  If you want to use a Multiface III card's serial port in Linux,
-  answer Y.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-Amiga/Atari/PowerMac DMA sound support
-CONFIG_DMASOUND
-  Support built-in audio chips accessible by DMA on various machines
-  that have them.  Note that this symbol does not affect the kernel
-  directly; rather, it controls whether configuration questions
-  enabling DMA sound drivers for various specific machine
-  architectures will be used.
-
-Atari DMA sound support
-CONFIG_DMASOUND_ATARI
-  If you want to use the internal audio of your Atari in Linux, answer
-  Y to this question. This will provide a Sun-like /dev/audio,
-  compatible with the Linux/i386 sound system. Otherwise, say N.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you
-  want). If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-PowerMac DMA sound support
-CONFIG_DMASOUND_PMAC
-  If you want to use the internal audio of your PowerMac in Linux,
-  answer Y to this question. This will provide a Sun-like /dev/audio,
-  compatible with the Linux/i386 sound system. Otherwise, say N.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you
-  want). If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-Amiga DMA sound support
-CONFIG_DMASOUND_PAULA
-  If you want to use the internal audio of your Amiga in Linux, answer
-  Y to this question. This will provide a Sun-like /dev/audio,
-  compatible with the Linux/i386 sound system. Otherwise, say N.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you
-  want). If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-Q40 sound support
-CONFIG_DMASOUND_Q40
-  If you want to use the internal audio of your Q40 in Linux, answer
-  Y to this question. This will provide a Sun-like /dev/audio,
-  compatible with the Linux/i386 sound system. Otherwise, say N.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you
-  want). If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-HP DCA serial support
-CONFIG_HPDCA
-  If you want to use the internal "DCA" serial ports on an HP300
-  machine, say Y here.
-
-HP on-board LANCE support
-CONFIG_HPLANCE
-  If you want to use the builtin "LANCE" Ethernet controller on an
-  HP300 machine, say Y here.
-
-DIO bus support
-CONFIG_DIO
-  Say Y here to enable support for the "DIO" expansion bus used in
-  HP300 machines. If you are using such a system you almost certainly
-  want this.
-
-# Choice: ppctype
-Processor Type
-CONFIG_6xx
-  There are four types of PowerPC chips supported.  The more common
-  types (601, 603, 604, 740, 750, 7400), the Motorola embedded
-  versions (821, 823, 850, 855, 860, 8260), the IBM embedded versions
-  (403 and 405) and the high end 64 bit Power processors (Power 3,
-  Power 4).  Unless you are building a kernel for one of the embedded
-  processor systems, or a 64 bit IBM RS/6000, choose 6xx.  Note that
-  the kernel runs in 32-bit mode even on 64-bit chips.  Also note that
-  because the 82xx family has a 603e core, specific support for that
-  chipset is asked later on.
-
-Motorola MPC8260 CPM support
-CONFIG_8260
-  The MPC8260 CPM (Communications Processor Module) is a typical
-  embedded CPU made by Motorola.  Selecting this option means that
-  you wish to build a kernel for a machine with specifically an 8260
-  for a CPU.
-
-  If in doubt, say N.
-
-# Choice: ppc4xxtype
-Oak
-CONFIG_OAK
-  Select Oak if you have an IBM 403GCX "Oak" Evaluation Board.
-
-  Select Walnut if you have an IBM 405GP "Walnut" Evaluation Board.
-
-  More information on these boards is available at:
-  <http://www.chips.ibm.com/products/powerpc/tools/evk_pn.html#GCX>.
-
-Walnut
-CONFIG_WALNUT
-  Select Walnut if you have an IBM 405GP "Walnut" Evaluation Board.
-
-Workarounds for PPC601 bugs
-CONFIG_PPC601_SYNC_FIX
-  Some versions of the PPC601 (the first PowerPC chip) have bugs which
-  mean that extra synchronization instructions are required near
-  certain instructions, typically those that make major changes to the
-  CPU state.  These extra instructions reduce performance slightly.
-  If you say N here, these extra instructions will not be included,
-  resulting in a kernel which will run faster but may not run at all
-  on some systems with the PPC601 chip.
-
-  If in doubt, say Y here.
-
-8xx Cache (Copy-Back or Writethrough)
-CONFIG_8xx_COPYBACK
-  Saying Y here will cause the cache on an MPC8xx processor to be used
-  in Copy-Back mode.  If you say N here, it is used in Writethrough
-  mode.
-
-  If in doubt, say Y here.
-
-MPC860 (Pre Rev. C) CPU6 Silicon Errata
-CONFIG_8xx_CPU6
-  MPC860 CPUs, prior to Rev C have some bugs in the silicon, which
-  require workarounds for Linux (and most other OSes to work).  If you
-  get a BUG() very early in boot, this might fix the problem.  For
-  more details read the document entitled "MPC860 Family Device Errata
-  Reference" on Motorola's website.  This option also incurs a
-  performance hit.
-
-  If in doubt, say N here.
-
-MPC8xx direct IDE support on PCMCIA port
-CONFIG_BLK_DEV_MPC8xx_IDE
-  This option provides support for IDE on Motorola MPC8xx Systems.
-  Please see 'Type of MPC8xx IDE interface' for details.
-
-  If unsure, say N.
-
-# Choice: mpc8xxtype
-Type of MPC8xx IDE interface
-CONFIG_IDE_8xx_PCCARD
-  Select how the IDE devices are connected to the MPC8xx system:
-
-  8xx_PCCARD uses the 8xx internal PCMCIA interface in combination
-             with a PC Card (e.g. ARGOSY portable Hard Disk Adapter),
-             ATA PC Card HDDs or ATA PC Flash Cards (example: TQM8xxL
-             systems)
-
-  8xx_DIRECT is used for directly connected IDE devices using the 8xx
-             internal PCMCIA interface (example: IVMS8 systems)
-
-  EXT_DIRECT is used for IDE devices directly connected to the 8xx
-             bus using some glue logic, but _not_ the 8xx internal
-             PCMCIA interface (example: IDIF860 systems)
-
-Use SMC2 for UART
-CONFIG_SMC2_UART
-  If you would like to use SMC2 as a serial port, say Y here.
-
-  If in doubt, say Y here.
-
-Use SMC2 for Console
-CONFIG_CONS_SMC2
-  If you are going to have a serial console on your device and are
-  using SMC2 for your serial port, say Y here, else say N.
-
-Use the alternate SMC2 I/O
-CONFIG_ALTSMC2
-  If you have an MPC823 or MPC850 and would like to use the alternate
-  SMC2 for I/O, say Y here.
-
-  If in doubt, say N here.
-
-Enable SCC2 and SCC3 for UART
-CONFIG_USE_SCC_IO
-  If your MPC8xx board has other SCC ports that you would like to use
-  for for a serial port, say Y here.
-
-  If in doubt, say N here.
-
-# Choice: ppc6xxtype
-Machine Type
-CONFIG_ALL_PPC
-  Linux currently supports several different kinds of PowerPC-based
-  machines: Apple Power Macintoshes and clones (such as the Motorola
-  Starmax series), PReP (PowerPC Reference Platform) machines (such
-  as the Motorola PowerStacks, Motorola cPCI/VME embedded systems,
-  and some IBM RS/6000 systems), CHRP (Common Hardware Reference
-  Platform), and several embedded PowerPC systems containing 4xx, 6xx,
-  7xx, 8xx, 74xx, and 82xx processors.  Currently, the default option
-  is to build a kernel which works on the first three.
-
-  Select PowerMac/PReP/MTX/CHRP if configuring for any of the above.
-
-  Select Gemini if configuring for a Synergy Microsystems' Gemini
-  series Single Board Computer.  More information is available at:
-  <http://www.synergymicro.com/PressRel/97_10_15.html>.
-
-  Select APUS if configuring for a PowerUP Amiga.  More information is
-  available at: <http://linux-apus.sourceforge.net/>.
-
-  Note that Total Impact briQ is handled as a CHRP machine.
-
-Synergy-Gemini
-CONFIG_GEMINI
-  Select Gemini if configuring for a Synergy Microsystems' Gemini
-  series Single Board Computer.  More information is available at:
-  <http://www.synergymicro.com/PressRel/97_10_15.html>.
-
-Amiga-Apus
-CONFIG_APUS
-  Select APUS if configuring for a PowerUP Amiga.
-  More information is available at:
-  <http://linux-apus.sourceforge.net/>.
-
-AltiVec kernel support
-CONFIG_ALTIVEC
-  This option enables kernel support for the Altivec extensions to the
-  PowerPC processor. The kernel currently supports saving and restoring
-  altivec registers, and turning on the 'altivec enable' bit so user
-  processes can execute altivec instructions.
-
-  This option is only usefully if you have a processor that supports
-  altivec (G4, otherwise known as 74xx series), but does not have
-  any affect on a non-altivec cpu (it does, however add code to the
-  kernel).
-
-  If in doubt, say Y here.
-
-Thermal Management Support
-CONFIG_TAU
-  G3 and G4 processors have an on-chip temperature sensor called the
-  'Thermal Assist Unit (TAU)', which, in theory, can measure the on-die
-  temperature within 2-4 degrees Celsius. This option shows the current
-  on-die temperature in /proc/cpuinfo if the cpu supports it.
-
-  Unfortunately, on some chip revisions, this sensor is very inaccurate
-  and in some cases, does not work at all, so don't assume the cpu
-  temp is actually what /proc/cpuinfo says it is.
-
-Interrupt driven TAU driver
-CONFIG_TAU_INT
-  The TAU supports an interrupt driven mode which causes an interrupt
-  whenever the temperature goes out of range. This is the fastest way
-  to get notified the temp has exceeded a range. With this option off,
-  a timer is used to re-check the temperature periodically.
-
-  However, on some cpus it appears that the TAU interrupt hardware
-  is buggy and can cause a situation which would lead unexplained hard
-  lockups.
-
-  Unless you are extending the TAU driver, or enjoy kernel/hardware
-  debugging, leave this option off.
-
-Average high and low temp
-CONFIG_TAU_AVERAGE
-  The TAU hardware can compare the temperature to an upper and lower bound.
-  The default behaviour is to show both the upper and lower bound in
-  /proc/cpuinfo. If the range is large, the temperature is either changing
-  a lot, or the TAU hardware is broken (likely on some G4's). If the range
-  is small (around 4 degrees), the temperature is relatively stable.
-
-Power management support for PowerBooks
-CONFIG_PMAC_PBOOK
-  This provides support for putting a PowerBook to sleep; it also
-  enables media bay support.  Power management works on the
-  PB2400/3400/3500, Wallstreet, Lombard, and Bronze PowerBook G3. You
-  must get the power management daemon, pmud, to make it work and you
-  must have the /dev/pmu device (see the pmud README).
-
-  Get pmud from <ftp://ftp.samba.org/pub/ppclinux/pmud/>.
-
-  If you have a PowerBook, you should say Y.
-
-  You may also want to compile the dma sound driver as a module and
-  have it autoloaded. The act of removing the module shuts down the
-  sound hardware for more power savings.
-
-APM emulation
-CONFIG_PMAC_APM_EMU
-  This driver provides an emulated /dev/apm_bios and /proc/apm. The
-  first one is mostly intended for XFree to sleep & wakeup properly,
-  the second ones provides some battery informations to allow existing
-  APM utilities to work. It provides less useful informations than
-  tools specifically designed for PowerBooks or /proc/pmu/battery_x
-
-Backlight control for LCD screens
-CONFIG_PMAC_BACKLIGHT
-  Say Y here to build in code to manage the LCD backlight on a
-  Macintosh PowerBook.  With this code, the backlight will be turned
-  on and off appropriately on power-management and lid-open/lid-closed
-  events; also, the PowerBook button device will be enabled so you can
-  change the screen brightness.
-
-# Choice: ppc8xxtype
-Embedded 8xx Board Type
-CONFIG_RPXLITE
-  Single-board computers based around the PowerPC MPC8xx chips and
-  intended for embedded applications.  The following types are
-  supported:
-
-  RPX-Lite:
-    Embedded Planet RPX Lite. PC104 form-factor SBC based on the MPC823.
-
-  RPX-Classic:
-    Embedded Planet RPX Classic Low-fat. Credit-card-size SBC based on 
-    the MPC 860
-
-  BSE-IP: 
-    Bright Star Engineering ip-Engine.
-
-  TQM823L:
-  TQM850L:
-  TQM855L:
-  TQM860L:
-    MPC8xx based family of mini modules, half credit card size,
-    up to 64 MB of RAM, 8 MB Flash, (Fast) Ethernet, 2 x serial ports,
-    2 x CAN bus interface, ...
-      Manufacturer: TQ Components, www.tq-group.de
-      Date of Release: October (?) 1999
-      End of Life: not yet :-)
-      URL:
-      - module: <http://www.denx.de/PDF/TQM8xxLHWM201.pdf>
-      - starter kit: <http://www.denx.de/PDF/STK8xxLHWM201.pdf>
-      - images: <http://www.denx.de/embedded-ppc-en.html>
-
-  FPS850L:
-    FingerPrint Sensor System (based on TQM850L)
-      Manufacturer: IKENDI AG, <http://www.ikendi.com/>
-      Date of Release: November 1999
-      End of life: end 2000 ?
-      URL: see TQM850L
-
-  SPD823TS:
-    MPC823 based board used in the "Tele Server" product
-    Manufacturer: Speech Design, <http://www.speech-design.de/>
-    Date of Release: Mid 2000 (?)
-    End of life: -
-    URL: <http://www.speech-design.de/>
-         select "English", then "Teleteam Solutions", then "TeleServer"
-
-  IVMS8:
-    MPC860 based board used in the "Integrated Voice Mail System",
-    Small Version (8 voice channels)
-    Manufacturer: Speech Design, <http://www.speech-design.de/>
-    Date of Release: December 2000 (?)
-    End of life: -
-    URL: <http://www.speech-design.de/>
-
-  IVML24:
-    MPC860 based board used in the "Integrated Voice Mail System", 
-    Large Version (24 voice channels)
-    Manufacturer: Speech Design, <http://www.speech-design.de/>
-    Date of Release: March 2001  (?)
-    End of life: -
-    URL: <http://www.speech-design.de/>
-
-  SM850:
-    Service Module (based on TQM850L)
-    Manufacturer: Dependable Computer Systems, <http://www.decomsys.com/>
-    Date of Release: end 2000 (?)
-    End of life: mid 2001 (?)
-    URL: <http://www.tz-mikroelektronik.de/ServiceModule/index.html>
-
-  HERMES_PRO:
-    Hermes-Pro ISDN/LAN router with integrated 8 x hub
-    Manufacturer: Multidata Gesellschaft für Datentechnik und Informatik
-      <http://www.multidata.de/>
-    Date of Release: 2000 (?)
-    End of life: -
-    URL: <http://www.multidata.de/english/products/hpro.htm>
-
-  IP860:       
-    VMEBus IP (Industry Pack) carrier board with MPC860
-    Manufacturer: MicroSys GmbH, <http://www.microsys.de/>
-    Date of Release: ?
-    End of life: -
-    URL: <http://www.microsys.de/html/ip860.html>
-
-  PCU_E:
-    PCU = Peripheral Controller Unit, Extended
-    Manufacturer: Siemens AG, ICN (Information and Communication Networks)
-       <http://www.siemens.de/page/1,3771,224315-1-999_2_226207-0,00.html>
-    Date of Release: April 2001
-    End of life: August 2001
-    URL: n. a.
-
-RPX-Classic
-CONFIG_RPXCLASSIC
-  The RPX-Classic is a single-board computer based on the Motorola
-  MPC860.  It features 16MB of DRAM and a variable amount of flash,
-  I2C EEPROM, thermal monitoring, a PCMCIA slot, a DIP switch and two
-  LEDs.  Variants with Ethernet ports exist.  Say Y here to support it
-  directly.
-
-BSE-IP
-CONFIG_BSEIP
-  Say Y here to support the Bright Star Engineering ipEngine SBC.
-  This is a credit-card-sized device featuring a MPC823 processor,
-  26MB DRAM, 4MB flash, Ethernet, a 16K-gate FPGA, USB, an LCD/video
-  controller, and two RS232 ports.
-
-TQM823L
-CONFIG_TQM823L
-  Say Y here to support the TQM823L, one of an MPC8xx-based family of
-  mini SBCs (half credit-card size) from TQ Components first released
-  in late 1999.  Technical references are at
-  <http://www.denx.de/PDF/TQM8xxLHWM201.pdf>, and
-  <http://www.denx.de/PDF/STK8xxLHWM201.pdf>, and an image at
-  <http://www.denx.de/embedded-ppc-en.html>.
-
-TQM850L
-CONFIG_TQM850L
-  Say Y here to support the TQM850L, one of an MPC8xx-based family of
-  mini SBCs (half credit-card size) from TQ Components first released
-  in late 1999.  Technical references are at
-  <http://www.denx.de/PDF/TQM8xxLHWM201.pdf>, and
-  <http://www.denx.de/PDF/STK8xxLHWM201.pdf>, and an image at
-  <http://www.denx.de/embedded-ppc-en.html>.
-
-TQM855L
-CONFIG_TQM855L
-  Say Y here to support the TQM855L, one of an MPC8xx-based family of
-  mini SBCs (half credit-card size) from TQ Components first released
-  in late 1999.  Technical references are at
-  <http://www.denx.de/PDF/TQM8xxLHWM201.pdf>, and
-  <http://www.denx.de/PDF/STK8xxLHWM201.pdf>, and an image at
-  <http://www.denx.de/embedded-ppc-en.html>.
-
-TQM860L
-CONFIG_TQM860L
-  Say Y here to support the TQM860L, one of an MPC8xx-based family of
-  mini SBCs (half credit-card size) from TQ Components first released
-  in late 1999.  Technical references are at
-  <http://www.denx.de/PDF/TQM8xxLHWM201.pdf>, and
-  <http://www.denx.de/PDF/STK8xxLHWM201.pdf>, and an image at
-  <http://www.denx.de/embedded-ppc-en.html>.
-
-FPS850
-CONFIG_FPS850
-  Say Y here to support the FingerPrint Sensor from AKENDI IG, based
-  on the TQ Components TQM850L module, released November 1999 and
-  discontinued a year later.
-
-TQM860
-CONFIG_TQM860
-  Say Y here to support the TQM860, one of an MPC8xx-based family of
-  SBCs (credit-card size) from TQ Components first released in 
-  mid-1999 and discontinued mid-2000.
-
-SM850
-CONFIG_SM850
-  Say Y here to support the Service Module 850 from Dependable
-  Computer Systems, an SBC based on the TQM850L module by TQ
-  Components.  This board is no longer in production.  The
-  manufacturer's website is at <http://www.decomsys.com/>.
-
-SPD823TS
-CONFIG_SPD823TS
-  Say Y here to support the Speech Design 823 Tele-Server from Speech
-  Design, released in 2000.  The manufacturer's website is at
-  <http://www.speech-design.de/>.
-
-IVMS8
-CONFIG_IVMS8
-  Say Y here to support the Integrated Voice-Mail Small 8-channel SBC
-  from Speech Design, released March 2001.  The manufacturer's website
-  is at <http://www.speech-design.de/>.
-
-# IVML24 is not yet active
-IVML24
-CONFIG_IVML24
-  Say Y here to support the Integrated Voice-Mail Large 24-channel SBC
-  from Speech Design, released March 2001.  The manufacturer's website
-  is at <http://www.speech-design.de/>.
-
-MBX
-CONFIG_MBX
-  MBX is a line of Motorola single-board computer based around the
-  MPC821 and MPC860 processors, and intended for embedded-controller
-  applications.  Say Y here to support these boards directly.
-
-WinCept
-CONFIG_WINCEPT
-  The Wincept 100/110 is a Motorola single-board computer based on the
-  MPC821 PowerPC, introduced in 1998 and designed to be used in
-  thin-client machines.  Say Y to support it directly.
-
-# More systems that will be supported soon, according to
-# Wolfgang Denk <wd@denx.de>:
-#
-# TQM8260:
-#         MPC8260 based module
-#
-#         Manufacturer: TQ Components, www.tq-group.de
-#         Date of Release: June 2001
-#         End of Life: not yet :-)
-#         URL: <http://www.denx.de/PDF/TQM82xx_SPEC_Rev003.pdf>
-#
-# IP860:
-#         VMEBus IP (Industry Pack) carrier board with MPC860
-#
-#         Manufacturer: MicroSys GmbH, <http://www.microsys.de/>
-#         Date of Release: ?
-#         End of life: -
-#         URL: <http://www.microsys.de/html/ip860.html>
-#
-# CU824:
-#         VMEBus Board with PCI extension with MPC8240 CPU
-#
-#         Manufacturer: MicroSys GmbH, <http://www.microsys.de/>
-#         Date of Release: early 2001 (?)
-#         End of life: -
-#         URL: <http://www.microsys.de/html/cu824.html>
-#
-# PM826:
-#         Modular system with MPC8260 CPU
-#
-#         Manufacturer: MicroSys GmbH, <http://www.microsys.de/>
-#         Date of Release: mid 2001
-#         End of life: -
-#         URL: <http://www.microsys.de/html/pm826.html>
-#
-# PCU_E:
-#         PCU = Peripheral Controller Unit; E = extended (?)
-#
-#         Mfr: Siemens AG, ICN (Information and Communication Networks)
-#         <http://www.siemens.de/page/1,3771,224315-1-999_2_226207-0,00.html>
-#         Date of Release: April 2001
-#         End of life: -
-#         URL: n. a.o
-
-# Choice: ppc82xxtype
-Embedded 82xx Board Type
-CONFIG_EST8260
-  EST8260:
-    The EST8260 is a single-board computer manufactured by Wind River
-    Systems, Inc. (formerly Embedded Support Tools Corp.) and based on
-    the MPC8260.  Wind River Systems has a website at
-    <http://www.windriver.com/>, but the EST8260 cannot be found on it
-    and has probably been discontinued or rebadged.
-
-  TQM8260:
-    MPC8260 based module, little larger than credit card,
-    up to 128 MB global + 64 MB local RAM, 32 MB Flash,
-    32 kB EEPROM, 256 kB L@ Cache, 10baseT + 100baseT Ethernet,
-    2 x serial ports, ...
-      Manufacturer: TQ Components, www.tq-group.de
-      Date of Release: June 2001
-      End of Life: not yet :-)
-      URL: <http://www.denx.de/PDF/TQM82xx_SPEC_Rev005.pdf>
-
-  PM826:
-    Modular system with MPC8260 CPU
-    Manufacturer: MicroSys GmbH, <http://www.microsys.de/>
-    Date of Release: mid 2001
-    End of life: -
-    URL: <http://www.microsys.de/html/pm826.html>
-
-  CU824:
-    VMEBus Board with PCI extension with MPC8240 CPU
-    Manufacturer: MicroSys GmbH, <http://www.microsys.de/>
-    Date of Release: early 2001 (?)
-    End of life: -
-    URL: <http://www.microsys.de/html/cu824.html>
-
-ADB raw keycode support
-CONFIG_MAC_ADBKEYCODES
-  This provides support for sending raw ADB keycodes to console
-  devices.  This is the default up to 2.4.0, but in future this may be
-  phased out in favor of generic Linux keycodes.  If you say Y here,
-  you can dynamically switch via the
-      /proc/sys/dev/mac_hid/keyboard_sends_linux_keycodes
-  sysctl and with the "keyboard_sends_linux_keycodes=" kernel
-  argument.
-
-  This option is now deprecated and will be removed in a future
-  kernel release.
-  
-  If unsure, say N here.
-
-I2C/SPI Microcode Patch
-CONFIG_UCODE_PATCH
-  Motorola releases microcode updates for their 8xx CPM modules.  The
-  microcode update file has updates for IIC, SMC and USB.  Currently only
-  the USB update is available by default, if the MPC8xx USB option is
-  enabled.  If in doubt, say 'N' here.
-
-Mouse button 2+3 emulation support
-CONFIG_MAC_EMUMOUSEBTN
-  This provides generic support for emulating the 2nd and 3rd mouse
-  button with keypresses.  If you say Y here, the emulation is still
-  disabled by default.  The emulation is controlled by these sysctl
-  entries:
-      /proc/sys/dev/mac_hid/mouse_button_emulation
-      /proc/sys/dev/mac_hid/mouse_button2_keycode
-      /proc/sys/dev/mac_hid/mouse_button3_keycode
-
-Enhanced Real Time Clock Support (/dev/rtc)
-CONFIG_PPC_RTC
-  If you say Y here and create a character special file /dev/rtc with
-  major number 10 and minor number 135 using mknod ("man mknod"), you
-  will get access to the real time clock (or hardware clock) built
-  into your computer.
-
-  If unsure, say Y here.
-
-Support for Open Firmware device tree in /proc
-CONFIG_PROC_DEVICETREE
-  This option adds a device-tree directory under /proc which contains
-  an image of the device tree that the kernel copies from Open
-  Firmware. If unsure, say Y here.
-
-RTAS (RunTime Abstraction Services) in /proc
-CONFIG_PPC_RTAS
-  When you use this option, you will be able to use RTAS from
-  userspace.
-
-  RTAS stands for RunTime Abstraction Services and should
-  provide a portable way to access and set system information. This is
-  commonly used on RS/6000 (pSeries) computers.
-
-  You can access RTAS via the special proc file system entry rtas.
-  Don't confuse this rtas entry with the one in /proc/device-tree/rtas
-  which is readonly.
-
-  If you don't know if you can use RTAS look into
-  /proc/device-tree/rtas. If there are some entries, it is very likely
-  that you will be able to use RTAS.
-
-  You can do cool things with rtas. To print out information about
-  various sensors in the system, just do a
-
-    $ cat /proc/rtas/sensors
-
-  or if you power off your machine at night but want it running when
-  you enter your office at 7:45 am, do a
-
-    # date -d 'tomorrow 7:30' +%s > /proc/rtas/poweron
-
-  and shutdown.
-
-  If unsure, say Y.
-
-MESH (Power Mac internal SCSI) support
-CONFIG_SCSI_MESH
-  Many Power Macintoshes and clones have a MESH (Macintosh Enhanced
-  SCSI Hardware) SCSI bus adaptor (the 7200 doesn't, but all of the
-  other Power Macintoshes do). Say Y to include support for this SCSI
-  adaptor. This driver is also available as a module called mesh.o
-  ( = code which can be inserted in and removed from the running
-  kernel whenever you want). If you want to compile it as a module,
-  say M here and read <file:Documentation/modules.txt>.
-
-Maximum synchronous transfer rate (MB/s) (0 = async)
-CONFIG_SCSI_MESH_SYNC_RATE
-  On Power Macintoshes (and clones) where the MESH SCSI bus adaptor
-  drives a bus which is entirely internal to the machine (such as the
-  7500, 7600, 8500, etc.), the MESH is capable of synchronous
-  operation at up to 10 MB/s. On machines where the SCSI bus
-  controlled by the MESH can have external devices connected, it is
-  usually rated at 5 MB/s. 5 is a safe value here unless you know the
-  MESH SCSI bus is internal only; in that case you can say 10. Say 0
-  to disable synchronous operation.
-
-53C94 (Power Mac external SCSI) support
-CONFIG_SCSI_MAC53C94
-  On Power Macintoshes (and clones) with two SCSI buses, the external
-  SCSI bus is usually controlled by a 53C94 SCSI bus adaptor. Older
-  machines which only have one SCSI bus, such as the 7200, also use
-  the 53C94. Say Y to include support for the 53C94.
-
-  This driver is also available as a module called mac53c94.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-MACE (Power Mac Ethernet) support
-CONFIG_MACE
-  Power Macintoshes and clones with Ethernet built-in on the
-  motherboard will usually use a MACE (Medium Access Control for
-  Ethernet) interface. Say Y to include support for the MACE chip.
-
-  This driver is also available as a module called mace.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Use AAUI port instead of TP by default
-CONFIG_MACE_AAUI_PORT
-  Some Apple machines (notably the Apple Network Server) which use the
-  MACE ethernet chip have an Apple AUI port (small 15-pin connector),
-  instead of an 8-pin RJ45 connector for twisted-pair ethernet.  Say
-  Y here if you have such a machine.  If unsure, say N.
-  The driver will default to AAUI on ANS anyway, and if you use it as
-  a module, you can provide the port_aaui=0|1 to force the driver.
-
-BMAC (G3 Ethernet) support
-CONFIG_BMAC
-  Say Y for support of BMAC Ethernet interfaces. These are used on G3
-  computers.
-
-  This driver is also available as a module called bmac.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-GMAC (G4/iBook Ethernet) support
-CONFIG_GMAC
-  Say Y for support of GMAC Ethernet interfaces. These are used on G4
-  and iBook computers.
-
-  This driver is also available as a module called gmac.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-National DP83902AV (Oak Ethernet) support
-CONFIG_OAKNET
-  Say Y if your machine has this type of Ethernet network card.
-
-  This driver is also available as a module called oaknet.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Video For Linux
-CONFIG_VIDEO_DEV
-  Support for audio/video capture and overlay devices and FM radio
-  cards. The exact capabilities of each device vary. User tools for
-  this are available from
-  <ftp://ftp.uk.linux.org/pub/linux/video4linux/>.
-
-  If you are interested in writing a driver for such an audio/video
-  device or user software interacting with such a driver, please read
-  the file <file:Documentation/video4linux/API.html>.
-
-  This driver is also available as a module called videodev.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Video For Linux /proc file system information
-CONFIG_VIDEO_PROC_FS
-  If you say Y here, you are able to access video device information
-  in /proc/video.
-
-  To use this option, you have to check, that the "/proc file system
-  support" (CONFIG_PROC_FS) is enabled too.
-
-AIMSlab RadioTrack (aka RadioReveal) support
-CONFIG_RADIO_RTRACK
-  Choose Y here if you have one of these FM radio cards, and then fill
-  in the port address below.
-
-  Note that newer AIMSlab RadioTrack cards have a different chipset
-  and are not supported by this driver.  For these cards, use the
-  RadioTrack II driver below.
-
-  If you have a GemTeks combined (PnP) sound- and radio card you must
-  use this driver as a module and setup the card with isapnptools.
-  You must also pass the module a suitable io parameter, 0x248 has
-  been reported to be used by these cards.
-
-  In order to control your radio card, you will need to use programs
-  that are compatible with the Video For Linux API.  Information on
-  this API and pointers to "v4l" programs may be found on the WWW at
-  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.  More
-  information is contained in the file
-  <file:Documentation/video4linux/radiotrack.txt>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called radio-aimslab.o.
-
-RadioTrack I/O port
-CONFIG_RADIO_RTRACK_PORT
-  Enter either 0x30f or 0x20f here.  The card default is 0x30f, if you
-  haven't changed the jumper setting on the card.
-
-AIMSlab RadioTrack II support
-CONFIG_RADIO_RTRACK2
-  Choose Y here if you have this FM radio card, and then fill in the
-  port address below.
-
-  In order to control your radio card, you will need to use programs
-  that are compatible with the Video For Linux API.  Information on
-  this API and pointers to "v4l" programs may be found on the WWW at
-  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called radio-rtrack2.o.
-
-RadioTrack II I/O port
-CONFIG_RADIO_RTRACK2_PORT
-  Enter either 0x30c or 0x20c here.  The card default is 0x30c, if you
-  haven't changed the jumper setting on the card.
-
-Aztech/Packard Bell Radio
-CONFIG_RADIO_AZTECH
-  Choose Y here if you have one of these FM radio cards, and then fill
-  in the port address below.
-
-  In order to control your radio card, you will need to use programs
-  that are compatible with the Video For Linux API.  Information on
-  this API and pointers to "v4l" programs may be found on the WWW at
-  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called radio-aztech.o.
-
-Aztech/Packard Bell radio card I/O port
-CONFIG_RADIO_AZTECH_PORT
-  Enter either 0x350 or 0x358 here.  The card default is 0x350, if you
-  haven't changed the setting of jumper JP3 on the card.  Removing the
-  jumper sets the card to 0x358.
-
-ADS Cadet AM/FM Radio Tuner Card
-CONFIG_RADIO_CADET
-  Choose Y here if you have one of these AM/FM radio cards, and then
-  fill in the port address below.
-
-  In order to control your radio card, you will need to use programs
-  that are compatible with the Video For Linux API.  Information on
-  this API and pointers to "v4l" programs may be found on the WWW at
-  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
-
-  Further documentation on this driver can be found on the WWW at
-  <http://linux.blackhawke.net/cadet.html>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called radio-cadet.o.
-
-SF16FMI Radio
-CONFIG_RADIO_SF16FMI
-  Choose Y here if you have one of these FM radio cards.  If you
-  compile the driver into the kernel and your card is not PnP one, you
-  have to add "sf16fm=<io>" to the kernel command line (I/O address is
-  0x284 or 0x384).
-
-  In order to control your radio card, you will need to use programs
-  that are compatible with the Video For Linux API.  Information on
-  this API and pointers to "v4l" programs may be found on the WWW at
-  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called radio-sf16fmi.o.
-
-SF16FMR2 Radio
-CONFIG_RADIO_SF16FMR2
-  Choose Y here if you have one of these FM radio cards.  If you
-  compile the driver into the kernel and your card is not PnP one, you
-  have to add "sf16fmr2=<io>" to the kernel command line (I/O address is
-  0x284 or 0x384, default 0x384).
-
-  In order to control your radio card, you will need to use programs
-  that are compatible with the Video For Linux API.  Information on
-  this API and pointers to "v4l" programs may be found on the WWW at
-  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called radio-sf16fmr2.o.
-
-Typhoon Radio (a.k.a. EcoRadio)
-CONFIG_RADIO_TYPHOON
-  Choose Y here if you have one of these FM radio cards, and then fill
-  in the port address and the frequency used for muting below.
-
-  In order to control your radio card, you will need to use programs
-  that are compatible with the Video For Linux API.  Information on
-  this API and pointers to "v4l" programs may be found on the WWW at
-  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called radio-typhoon.o.
-
-Support for /proc/radio-typhoon
-CONFIG_RADIO_TYPHOON_PROC_FS
-  Say Y here if you want the typhoon radio card driver to write
-  status information (frequency, volume, muted, mute frequency,
-  base address) to /proc/radio-typhoon. The file can be viewed with
-  your favorite pager (i.e. use "more /proc/radio-typhoon" or "less
-  /proc/radio-typhoon" or simply "cat /proc/radio-typhoon").
-
-Typhoon I/O port (0x316 or 0x336)
-CONFIG_RADIO_TYPHOON_PORT
-  Enter the I/O port of your Typhoon or EcoRadio radio card.
-
-Typhoon frequency set when muting the device (kHz)
-CONFIG_RADIO_TYPHOON_MUTEFREQ
-  Enter the frequency used for muting the radio. The device is never
-  completely silent. If the volume is just turned down, you can still
-  hear silent voices and music. For that reason, the frequency of the
-  radio device is set to the frequency you can enter here whenever
-  the device is muted. There should be no local radio station at that
-  frequency.
-
-Zoltrix Radio
-CONFIG_RADIO_ZOLTRIX
-  Choose Y here if you have one of these FM radio cards, and then fill
-  in the port address below.
-
-  In order to control your radio card, you will need to use programs
-  that are compatible with the Video For Linux API.  Information on
-  this API and pointers to "v4l" programs may be found on the WWW at
-  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called radio-zoltrix.o.
-
-ZOLTRIX I/O port (0x20c or 0x30c)
-CONFIG_RADIO_ZOLTRIX_PORT
-  Enter the I/O port of your Zoltrix radio card.
-
-I2C on parallel port
-CONFIG_I2C_PARPORT
-  I2C is a simple serial bus system used in many micro controller
-  applications.  Saying Y here will allow you to use your parallel
-  port as an I2C interface.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called i2c-parport.o.
-
-miroSOUND PCM20 radio
-CONFIG_RADIO_MIROPCM20
-  Choose Y here if you have this FM radio card. You also need to say Y
-  to "ACI mixer (miroSOUND PCM1-pro/PCM12/PCM20 radio)" (in "Sound")
-  for this to work.
-
-  In order to control your radio card, you will need to use programs
-  that are compatible with the Video For Linux API.  Information on
-  this API and pointers to "v4l" programs may be found on the WWW at
-  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called miropcm20.o.
-
-miroSOUND PCM20 radio RDS user interface (EXPERIMENTAL)
-CONFIG_RADIO_MIROPCM20_RDS
-  Choose Y here if you want to see RDS/RBDS information like
-  RadioText, Programme Service name, Clock Time and date, Programme
-  TYpe and Traffic Announcement/Programme identification.  You also
-  need to say Y to "miroSOUND PCM20 radio" and devfs!
-
-  It's not possible to read the raw RDS packets from the device, so
-  the driver cant provide an V4L interface for this.  But the
-  availability of RDS is reported over V4L by the basic driver
-  already.  Here RDS can be read from files in /dev/v4l/rds.
-
-  As module the driver will be called miropcm20-rds.o.
-
-Maestro on board radio
-CONFIG_RADIO_MAESTRO
-  Say Y here to directly support the on-board radio tuner on the
-  Maestro 2 or 2E sound card.
-
-  In order to control your radio card, you will need to use programs
-  that are compatible with the Video For Linux API.  Information on
-  this API and pointers to "v4l" programs may be found on the WWW at
-  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called radio-maestro.o.
-
-Guillemot MAXI Radio FM 2000 Radio Card
-CONFIG_RADIO_MAXIRADIO
-  Choose Y here if you have this radio card.  This card may also be
-  found as GemTek PCI FM.
-
-  In order to control your radio card, you will need to use programs
-  that are compatible with the Video For Linux API.  Information on
-  this API and pointers to "v4l" programs may be found on the WWW at
-  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called radio-maxiradio.o.
-
-GemTek Radio Card support
-CONFIG_RADIO_GEMTEK
-  Choose Y here if you have this FM radio card, and then fill in the
-  port address below.
-
-  In order to control your radio card, you will need to use programs
-  that are compatible with the Video For Linux API.  Information on
-  this API and pointers to "v4l" programs may be found on the WWW at
-  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called radio-gemtek.o.
-
-GemTek I/O port
-CONFIG_RADIO_GEMTEK_PORT
-  Enter either 0x20c, 0x30c, 0x24c or 0x34c here. The card default is
-  0x34c, if you haven't changed the jumper setting on the card. On
-  Sound Vision 16 Gold PnP with FM Radio (ESS1869+FM GemTek), the I/O
-  port is 0x28c.
-
-GemTek PCI Radio Card support
-CONFIG_RADIO_GEMTEK_PCI
-  Choose Y here if you have this PCI FM radio card.
-
-  In order to control your radio card, you will need to use programs
-  that are compatible with the Video for Linux API.  Information on 
-  this API and pointers to "v4l" programs may be found on the WWW at
-  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called radio-gemtek-pci.o.
-
-PlanB Video-In for PowerMacs
-CONFIG_VIDEO_PLANB
-  PlanB is the V4L driver for the PowerMac 7x00/8x00 series video
-  input hardware. If you want to experiment with this, say Y.
-  Otherwise, or if you don't understand a word, say N.
-  See <http://www.cpu.lu/~mlan/planb.html> for more info.
-
-  Saying M will compile this driver as a module (planb.o).
-
-TerraTec ActiveRadio
-CONFIG_RADIO_TERRATEC
-  Choose Y here if you have this FM radio card, and then fill in the
-  port address below. (TODO)
-
-  Note: This driver is in its early stages.  Right now volume and
-  frequency control and muting works at least for me, but
-  unfortunately I have not found anybody who wants to use this card
-  with Linux.  So if it is this what YOU are trying to do right now,
-  PLEASE DROP ME A NOTE!!  Rolf Offermanns (rolf@offermanns.de)
-
-  In order to control your radio card, you will need to use programs
-  that are compatible with the Video For Linux API.  Information on
-  this API and pointers to "v4l" programs may be found on the WWW at
-  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
-
-  If you want to compile this driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called radio-terratec.o.
-
-Terratec I/O port (normally 0x590)
-CONFIG_RADIO_TERRATEC_PORT
-  Fill in the I/O port of your TerraTec FM radio card. If unsure, go
-  with the default.
-
-Trust FM radio card
-CONFIG_RADIO_TRUST
-  This is a driver for the Trust FM radio cards. Say Y if you have
-  such a card and want to use it under Linux.
-
-  This driver is also available as a module called radio-trust.o ( =
-  code which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-Trust I/O port (usually 0x350 or 0x358)
-CONFIG_RADIO_TRUST_PORT
-  Enter the I/O port of your Trust FM radio card. If unsure, try the
-  values "0x350" or "0x358".
-
-BT848 Video For Linux
-CONFIG_VIDEO_BT848
-  Support for BT848 based frame grabber/overlay boards. This includes
-  the Miro, Hauppauge and STB boards. Please read the material in
-  <file:Documentation/video4linux/bttv> for more information.
-
-  If you say Y or M here, you need to say Y or M to "I2C support" and
-  "I2C bit-banging interfaces" in the character device section.
-
-  This driver is available as a module called bttv.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-BT878 audio DMA
-CONFIG_SOUND_BT878
-  Audio DMA support for bt878 based grabber boards.  As you might have
-  already noticed, bt878 is listed with two functions in /proc/pci.
-  Function 0 does the video stuff (bt848 compatible), function 1 does
-  the same for audio data.  This is a driver for the audio part of
-  the chip.  If you say 'Y' here you get a oss-compatible dsp device
-  where you can record from.  If you want just watch TV you probably
-  don't need this driver as most TV cards handle sound with a short
-  cable from the TV card to your sound card's line-in.
-
-  This driver is available as a module called btaudio.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-SGI Vino Video For Linux
-CONFIG_VIDEO_VINO
-  Say Y here to build in support for the Vino video input system found
-  on SGI Indy machines.
-
-Stradis 4:2:2 MPEG-2 video driver
-CONFIG_VIDEO_STRADIS
-  Say Y here to enable support for the Stradis 4:2:2 MPEG-2 video
-  driver for PCI.  There is a product page at
-  <http://www.stradis.com/decoder.html>.
-
-Zoran ZR36057/36060 Video For Linux
-CONFIG_VIDEO_ZORAN
-  Say Y here to include support for video cards based on the Zoran
-  ZR36057/36060 encoder/decoder chip (including the Iomega Buz and the
-  Miro DC10 and DC30 video capture cards).
-
-Include support for Iomega Buz
-CONFIG_VIDEO_ZORAN_BUZ
-  Say Y here to include support for the Iomega Buz video card.  There
-  is a Buz/Linux homepage at <http://www.lysator.liu.se/~gz/buz/>.
-
-Miro DC10(+) support
-CONFIG_VIDEO_ZORAN_DC10
-  Say Y to support the Pinnacle Systems Studio DC10 plus TV/Video
-  card.  Linux page at
-  <http://lhd.datapower.com/db/dispproduct.php3?DISP?1511>.  Vendor
-  page at <http://www.pinnaclesys.com/>.
-
-Linux Media Labs LML33 support
-CONFIG_VIDEO_ZORAN_LML33
-  Say Y here to support the Linux Media Labs LML33 TV/Video card.
-  Resources page is at <http://www.linuxmedialabs.com/lml33doc.html>.
-
-Zoran ZR36120/36125 Video For Linux
-CONFIG_VIDEO_ZR36120
-  Support for ZR36120/ZR36125 based frame grabber/overlay boards.
-  This includes the Victor II, WaveWatcher, Video Wonder, Maxi-TV,
-  and Buster boards. Please read the material in
-  <file:Documentation/video4linux/zr36120.txt> for more information.
-
-  This driver is also available as a module called zr36120.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-SAA5249 Teletext processor
-CONFIG_VIDEO_SAA5249
-  Support for I2C bus based teletext using the SAA5249 chip. At the
-  moment this is only useful on some European WinTV cards.
-
-  This driver is also available as a module called saa5249.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-QuickCam BW Video For Linux
-CONFIG_VIDEO_BWQCAM
-  Say Y have if you the black and white version of the QuickCam
-  camera. See the next option for the color version.
-
-  This driver is also available as a module called bw-qcam.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-QuickCam Colour Video For Linux
-CONFIG_VIDEO_CQCAM
-  This is the video4linux driver for the colour version of the
-  Connectix QuickCam.  If you have one of these cameras, say Y here,
-  otherwise say N.  This driver does not work with the original
-  monochrome QuickCam, QuickCam VC or QuickClip.  It is also available
-  as a module (c-qcam.o).
-  Read <file:Documentation/video4linux/CQcam.txt> for more information.
-
-W9966 Webcam (FlyCam Supra and others) Video For Linux
-CONFIG_VIDEO_W9966
-  Video4linux driver for Winbond's w9966 based Webcams.
-  Currently tested with the LifeView FlyCam Supra.
-  If you have one of these cameras, say Y here
-  otherwise say N.
-  This driver is also available as a module (w9966.o).
-
-  Check out <file:drivers/media/video4linux/w9966.txt> and
-  <file:drivers/media/video/w9966.c> for more information.
-
-CPiA Video For Linux
-CONFIG_VIDEO_CPIA
-  This is the video4linux driver for cameras based on Vision's CPiA
-  (Colour Processor Interface ASIC), such as the Creative Labs Video
-  Blaster Webcam II. If you have one of these cameras, say Y here
-  and select parallel port and/or USB lowlevel support below,
-  otherwise say N. This will not work with the Creative Webcam III.
-
-  Please read <file:Documentation/video4linux/README.cpia> for more
-  information.
-
-  This driver is also available as a module (cpia.o).
-
-CPiA Parallel Port Lowlevel Support
-CONFIG_VIDEO_CPIA_PP
-  This is the lowlevel parallel port support for cameras based on
-  Vision's CPiA (Colour Processor Interface ASIC), such as the
-  Creative Webcam II. If you have the parallel port version of one
-  of these cameras, say Y here, otherwise say N. It is also available
-  as a module (cpia_pp.o).
-
-CPiA USB Lowlevel Support
-CONFIG_VIDEO_CPIA_USB
-  This is the lowlevel USB support for cameras based on Vision's CPiA
-  (Colour Processor Interface ASIC), such as the Creative Webcam II.
-  If you have the USB version of one of these cameras, say Y here,
-  otherwise say N. This will not work with the Creative Webcam III.
-  It is also available as a module (cpia_usb.o).
-
-Mediavision Pro Movie Studio Video For Linux
-CONFIG_VIDEO_PMS
-  Say Y if you have such a thing.  This driver is also available as a
-  module called pms.o ( = code which can be inserted in and removed
-  from the running kernel whenever you want).  If you want to compile
-  it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-Sony Vaio Picturebook Motion Eye Video For Linux
-CONFIG_VIDEO_MEYE
-  This is the video4linux driver for the Motion Eye camera found
-  in the Vaio Picturebook laptops. Please read the material in
-  <file:Documentation/video4linux/meye.txt> for more information.
-
-  If you say Y or M here, you need to say Y or M to "Sony Programmable
-  I/O Control Device" in the character device section.
-
-  This driver is available as a module called meye.o ( = code
-  which can be inserted in and removed from the running kernel
-  whenever you want). If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.
-
-IBM's S/390 architecture
-CONFIG_ARCH_S390
-  Select this option, if you want to run the Kernel on one of IBM's
-  mainframes of the S/390 generation. You should have installed the
-  s390-compiler released by IBM (based on gcc-2.95.1) before.
-
-Merge some code into the kernel to make the image IPLable
-CONFIG_IPL
-  If you want to use the produced kernel to IPL directly from a
-  device, you have to merge a bootsector specific to the device
-  into the first bytes of the kernel. You will have to select the
-  IPL device on another question, that pops up, when you select
-  CONFIG_IPL.
-
-IPL from a S/390 tape unit
-CONFIG_IPL_TAPE
-  Select this option if you want to IPL the image from a Tape.
-
-IPL from a virtual card reader emulated by VM/ESA
-CONFIG_IPL_VM
-  Select this option if you are running under VM/ESA and want 
-  to IPL the image from the emulated card reader.
-
-CONFIG_PFAULT
-  Select this option, if you want to use PFAULT pseudo page fault
-  handling under VM. If running native or in LPAR, this option
-  has no effect. If your VM does not support PFAULT, PAGEEX
-  pseudo page fault handling will be used.
-  Note that VM 4.2 supports PFAULT but has a bug in its
-  implementation that causes some problems.
-  Everybody who wants to run Linux under VM != VM4.2 should select
-  this option.
-
-CONFIG_SHARED_KERNEL
-  Select this option, if you want to share the text segment of the
-  Linux kernel between different VM guests. This reduces memory
-  usage with lots of guests but greatly increases kernel size.
-  You should only select this option if you know what you are
-  doing and want to exploit this feature.
-
-Support for IBM-style disk-labels (S/390)
-CONFIG_S390_PARTITION
-  Enable this option to assure standard IBM labels on the DASDs.
-  You must enable it, if you are planning to access DASDs also
-  attached to another IBM mainframe operation system (OS/390, 
-  VM/ESA, VSE/ESA).
-
-Support for DASD hard disks
-CONFIG_DASD
-  Enable this option if you want to access DASDs directly utilizing
-  S/390s channel subsystem commands. This is necessary for running
-  natively on a single image or an LPAR.
-
-Support for ECKD hard disks
-CONFIG_DASD_ECKD
-  ECKD (Extended Count Key Data) devices are the most commonly used 
-  devices on S/390s. You should enable this option unless you are 
-  very sure you have no ECKD device.
-
-ECKD demand loading
-CONFIG_DASD_AUTO_ECKD
-  This option enables demand loading of the ECKD module. 
-
-Support for FBA hard disks
-CONFIG_DASD_FBA
-  Select this option if you want to use FBA (Fixed Block) devices.
-  If you are not sure what it is, say "Y".
-
-FBA demand loading
-CONFIG_DASD_AUTO_FBA
-  This option enables demand loading of the FBA module. 
-
-Support for DIAG access to CMS reserved Disks
-CONFIG_DASD_DIAG
-  Select this option if you want to use CMS reserved Disks under VM
-  with the Diagnose250 command.  If you are not running under VM or
-  unsure what it is, say "N".
-
-DIAG demand loading
-CONFIG_DASD_AUTO_DIAG
-  This option enables demand loading of the DIAG module. 
-
-Merge some code into the kernel to make the image IPLable
-CONFIG_IPLABLE
-  If you want to use the produced kernel to IPL directly from a
-  device, you have to merge a bootsector specific to the device
-  into the first bytes of the kernel. You will have to select the
-  IPL device on another question, that pops up, when you select
-  CONFIG_IPLABE.
-
-Support for 3215 line mode terminal
-CONFIG_TN3215
-  Include support for IBM 3215 line-mode terminals.
-
-Support for console on 3215 line mode terminal
-CONFIG_TN3215_CONSOLE
-  Include support for using an IBM 3215 line-mode terminal as a
-  Linux system console.
-
-Support for 3270 line mode terminal
-CONFIG_TN3270
-  Include support for IBM 3270 line-mode terminals.
-
-Support for console on 3270 line mode terminal
-CONFIG_TN3270_CONSOLE
-  Include support for using an IBM 3270 line-mode terminal as a Linux
-  system console.  Available only if 3270 support is compiled in
-  statically.
-
-Support for HWC line mode terminal
-CONFIG_HWC
-  Include support for IBM HWC line-mode terminals.
-
-Console on HWC line mode terminal
-CONFIG_HWC_CONSOLE
-  Include support for using an IBM HWC line-mode terminal as the Linux
-  system console.
-
-Control Program Identification
-CONFIG_HWC_CPI
-  Allows for Control Program Identification via the HWC interface,
-  i.e. provides a mean to pass an OS instance name (system name)
-  to the machine.
-
-  This option should only be selected as a module since the
-  system name has to be passed as module parameter. The module
-  will be called hwc_cpi.o.
-
-S/390 tape device support
-CONFIG_S390_TAPE
-  Select this option if you want to access channel-attached tape
-  devices on IBM S/390 or zSeries.
-  If you select this option you will also want to select at
-  least one of the tape interface options and one of the tape
-  hardware options in order to access a tape device.
-  This option is also available as a module. The module will be
-  called tape390.o and include all selected interfaces.
-  The hardware drivers will be seperate modules.
-  If unsure, say "Y".
-
-Support for tape character devices
-CONFIG_S390_TAPE_CHAR
-  Select this option if you want to access your channel-attached
-  tape devices using the character device interface.
-  This interface is similar to other Linux tape devices like
-  SCSI-Tapes (st) and the floppy tape device (ftape).
-  If unsure, say "Y".
-
-Support for tape block devices
-CONFIG_S390_TAPE_BLOCK
-  Select this option if you want to access your channel-attached tape
-  devices using the block device interface.  This interface is similar
-  to CD-ROM devices on other platforms.  The tapes can only be
-  accessed read-only when using this interface.  Have a look at
-  Documentation/s390/TAPE for further information about creating
-  volumes for and using this interface.  It is safe to say "Y" here.
-
-Support for 3490 tape hardware
-CONFIG_S390_TAPE_3490
-  Select this option if you want to access IBM 3490 magnetic
-  tape subsystems and 100% compatibles.
-  This option is also available as a module. The module will be
-  called tape3490.o. If CONFIG_S390_TAPE is selected as a module,
-  this hardware driver cannot be built-in but is only available
-  as a module.
-  It is safe to say "Y" here.
-
-Support for 3480 tape hardware
-CONFIG_S390_TAPE_3480
-  Select this option if you want to access IBM 3480 magnetic
-  tape subsystems and 100% compatibles.
-  This option is also available as a module. The module will be
-  called tape3480.o. If CONFIG_S390_TAPE is selected as a module,
-  this hardware driver cannot be built-in but is only available
-  as a module.
-  It is safe to say "Y" here.
-
-CTC device support
-CONFIG_CTC
-  Select this option if you want to use channel-to-channel networking
-  on IBM S/390 or zSeries. This device driver supports real CTC
-  coupling using ESCON. It also supports virtual CTCs when running
-  under VM. It will use the channel device configuration if this is
-  available.  This option is also available as a module which will be
-  called ctc.o.  If you do not know what it is, it's safe to say "Y".
-
-XPRAM disk support
-CONFIG_BLK_DEV_XPRAM
-  Select this option if you want to use your expanded storage on S/390
-  or zSeries as a disk.  This is useful as a _fast_ swap device if you
-  want to access more than 2G of memory when running in 31 bit mode.
-  This option is also available as a module which will be called
-  xpram.o.  If unsure, say "N".
-
-Fast IRQ handling
-CONFIG_FAST_IRQ
-  Select this option in order to get the interrupts processed faster
-  on your S/390 or zSeries machine.  If selected, after an interrupt
-  is processed, the channel subsystem will be asked for other pending
-  interrupts which will also be processed before leaving the interrupt
-  context.  This speeds up the I/O a lot. Say "Y".
-
-IUCV device support (VM only)
-CONFIG_IUCV
-  Select this option if you want to use inter-user communication
-  vehicle networking under VM or VIF.  This option is also available
-  as a module which will be called iucv.o. If unsure, say "Y".
-
-Process warning machine checks
-CONFIG_MACHCHK_WARNING
-  Select this option if you want the machine check handler on IBM S/390 or 
-  zSeries to process warning machine checks (e.g. on power failures). 
-  If unsure, say "Y".
-
-Use chscs for Common I/O
-CONFIG_CHSC
-  Select this option if you want the s390 common I/O layer to use information
-  obtained by channel subsystem calls. This will enable Linux to process link
-  failures and resource accessibility events. Moreover, if you have procfs
-  enabled, you'll be able to toggle chpids logically offline and online. Even
-  if you don't understand what this means, you should say "Y".
-
-Kernel support for 31 bit ELF binaries
-CONFIG_S390_SUPPORT
-  Select this option if you want to enable your system kernel to
-  handle system-calls from ELF binaries for 31 bit ESA.  This option
-  (and some other stuff like libraries and such) is needed for
-  executing 31 bit applications.  It is safe to say "Y".
-
-Channel Device Configuration
-CONFIG_CHANDEV
-  The channel device layer is a layer to provide a consistent
-  interface for configuration & default machine check (devices
-  appearing & disappearing) handling on Linux for s/390 & z/Series
-  channel devices.
-
-  s/390 & z/Series channel devices include among others
-
-  lcs (the most common ethernet/token ring/fddi standard on
-  zSeries)
-  ctc/escon hi speed like serial link standard on zSeries
-  claw used to talk to cisco routers.
-  qeth gigabit ethernet.
-
-  These devices use two channels one read & one write for
-  configuration & communication (& a third channel, the data
-  channel the case of gigabit ethernet). The motivation
-  behind developing this layer was that there was a lot of
-  duplicate code among the channel device drivers for
-  configuration.
-
-  Also the lcs & ctc drivers tended to fight over
-  3088/08's & 3088/1F's which could be either 2216/3172
-  channel attached lcs compatible devices or escon/ctc pipes
-  had to be configured separately as they couldn't autodetect,
-  this is now simplified by doing the configuration in a single
-  place (the channel device layer).
-
-  This layer isn't invasive & it is quite okay to use channel
-  drivers which don't use the channel device layer in
-  conjunction with drivers which do.
-
-  For more info see the chandev manpage usually distributed in
-  <file:Documentation/s390/chandev.8> in the Linux source tree.
-
-SAB3036 tuner support
-CONFIG_TUNER_3036
-  Say Y here to include support for Philips SAB3036 compatible tuners.
-  If in doubt, say N.
-
-Compaq SMART2 support
-CONFIG_BLK_CPQ_DA
-  This is the driver for Compaq Smart Array controllers.  Everyone
-  using these boards should say Y here.  See the file
-  <file:Documentation/cpqarray.txt> for the current list of boards
-  supported by this driver, and for further information on the use of
-  this driver.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called
-  cpqarray.o
-
-Show crashed user process info
-CONFIG_PROCESS_DEBUG
-  Say Y to print all process fault locations to the console.  This is
-  a debugging option; you probably do not want to set it unless you
-  are an S390 port maintainer.
-
-#
-# ARM options
-#
-# CML2 transition note: CML1 asks ARCH_ARCA5K, then has ARCH_A5K and ARCH_ARK
-# as subquestions.  CML2 asks the subquestions in the armtype menu and makes
-# ARCH_ARCA5K a derived symbol.
-ARM System type
-CONFIG_ARCH_ARCA5K
-  This selects what ARM system you wish to build the kernel for. It
-  also selects to some extent the CPU type. If you are unsure what
-  to set this option to, please consult any information supplied with
-  your system.
-
-# Choice: armtype
-A5000
-CONFIG_ARCH_A5K
-  Say Y here to to support the Acorn A5000.  Linux can support the
-  internal IDE disk and CD-ROM interface, serial and parallel port,
-  and the floppy drive.  Note that on some A5000s the floppy is
-  plugged into the wrong socket on the motherboard.
-
-Archimedes
-CONFIG_ARCH_ARC
-  The Acorn Archimedes was an personal computer based on an 8K ARM2
-  processor, released in 1987.  It supported 512K of RAM and 2 800K
-  floppy disks.  Picture and more detailed specifications at
-  <http://www.computingmuseum.com/museum/archi.htm>.
-
-EBSA-110
-CONFIG_ARCH_EBSA110
-  This is an evaluation board for the StrongARM processor available
-  from Digital. It has limited hardware on-board, including an onboard
-  Ethernet interface, two PCMCIA sockets, two serial ports and a
-  parallel port.
-
-RiscPC
-CONFIG_ARCH_RPC
-  On the Acorn Risc-PC, Linux can support the internal IDE disk and
-  CD-ROM interface, serial and parallel port, and the floppy drive.
-
-2MB physical memory
-CONFIG_PAGESIZE_16
-  Say Y here if your Archimedes or A5000 system has only 2MB of
-  memory, otherwise say N.  The resulting kernel will not run on a
-  machine with 4MB of memory.
-
-CATS
-CONFIG_ARCH_CATS
-  Say Y here if you intend to run this kernel on the CATS.
-
-  Saying N will reduce the size of the Footbridge kernel.
-
-EBSA285 (addin mode)
-CONFIG_ARCH_EBSA285_ADDIN
-  Say Y here if you intend to run this kernel on the EBSA285 card
-  in addin mode.
-
-  Saying N will reduce the size of the Footbridge kernel.
-
-EBSA285 (host mode)
-CONFIG_ARCH_EBSA285_HOST
-  Say Y here if you intend to run this kernel on the EBSA285 card
-  in host ("central function") mode.
-
-  Saying N will reduce the size of the Footbridge kernel.
-
-LinkUp Systems L7200 SDB
-CONFIG_ARCH_L7200
-  Say Y here if you intend to run this kernel on a LinkUp Systems
-  L7200 Software Development Board which uses an ARM720T processor.
-  Information on this board can be obtained at:
-
-  <http://www.linkupsys.com/>
-
-  If you have any questions or comments about the Linux kernel port
-  to this board, send e-mail to sjhill@cotw.com.
-
-NetWinder
-CONFIG_ARCH_NETWINDER
-  Say Y here if you intend to run this kernel on the Rebel.COM
-  NetWinder.  Information about this machine can be found at:
-
-  <http://www.netwinder.org/>
-
-  Saying N will reduce the size of the Footbridge kernel.
-
-P720T
-CONFIG_ARCH_P720T
-  Say Y here if you intend to run this kernel on the ARM Prospector
-  720T.
-
-Compaq Personal Server
-CONFIG_ARCH_PERSONAL_SERVER
-  Say Y here if you intend to run this kernel on the Compaq
-  Personal Server.
-
-  Saying N will reduce the size of the Footbridge kernel.
-
-  The Compaq Personal Server is not available for purchase.
-  There are no product plans beyond the current research
-  prototypes at this time.  Information is available at:
-
-  <http://crl.research.compaq.com/projects/personalserver/>
-
-  If you have any questions or comments about the  Compaq Personal
-  Server, send e-mail to skiff@crl.dec.com.
-
-Cirrus Logic EDB-7211 evaluation board
-CONFIG_ARCH_EDB7211
-  Say Y here if you intend to run this kernel on a Cirrus Logic EDB-7211
-  evaluation board.
-
-EP7211 infrared support
-CONFIG_EP7211_IR
-  Say Y here if you wish to use the infrared port on the EP7211. Note
-  that you can't use the first UART and the infrared port at the same
-  time, and that the EP7211 only supports SIR mode, at speeds up to
-  115.2 kbps. To use the I/R port, you will need to get the source to
-  irda-utils and apply the patch at
-  <http://lists.arm.linux.org.uk/pipermail/linux-arm-kernel/2001-June/003510.html>.
-
-Assabet
-CONFIG_SA1100_ASSABET
-  Say Y here if you are using the Intel(R) StrongARM(R) SA-1110
-  Microprocessor Development Board (also known as the Assabet).
-
-Neponset
-CONFIG_ASSABET_NEPONSET
-  Say Y here if you are using the Intel(R) StrongARM(R) SA-1110
-  Microprocessor Development Board (Assabet)  with the SA-1111
-  Development Board (Nepon).
-
-Compaq iPAQ H3600
-CONFIG_SA1100_H3600
-  Say Y here if you intend to run this kernel on the Compaq iPAQ
-  H3600 handheld computer.  Information about this machine and the
-  Linux port to this machine can be found at:
-
-  <http://www.handhelds.org/Compaq/index.html#iPAQ_H3600>
-  <http://www.compaq.com/products/handhelds/pocketpc/>
-
-Brutus
-CONFIG_SA1100_BRUTUS
-  Say Y here if you are using the Intel(R) StrongARM(R) SA-1100
-  Microprocessor Development Board (also known as the Brutus).
-
-LART
-CONFIG_SA1100_LART
-  Say Y here if you are using the Linux Advanced Radio Terminal
-  (also known as the LART).  See <http://www.lart.tudelft.nl/> for
-  information on the LART.
-
-GraphicsClient
-CONFIG_SA1100_GRAPHICSCLIENT
-  Say Y here if you are using an Applied Data Systems Intel(R)
-  StrongARM(R) SA-1100 based Graphics Client SBC.  See
-  <http://www.applieddata.net/> for information on this system.
-
-GraphicsMaster
-CONFIG_SA1100_GRAPHICSMASTER
-  Say Y here if you are using an Applied Data Systems Intel(R)
-  StrongARM(R) SA-1100 based Graphics Master SBC with SA-1111
-  StrongARM companion chip.  See
-  <http://www.applieddata.net/products_masterSpec.asp> for information
-  on this system.
-
-ADSBitsy
-CONFIG_SA1100_ADSBITSY
-  Say Y here if you are using Applied Data Systems Intel(R)
-  StrongARM(R) 1110 based Bitsy, 3 x 5 inches in size, Compaq - IPAQ -
-  like platform. See
-  <http://www.applieddata.net/products_bitsySpec.asp> for more
-  information.
-
-ITSY
-CONFIG_SA1100_ITSY
-  Say Y here if you are using the Compaq Itsy experimental pocket
-  computer. See <http://research.compaq.com/wrl/projects/itsy/> for
-  more information.
-
-PLEB
-CONFIG_SA1100_PLEB
-  Say Y here if you are using a Portable Linux Embedded Board
-  (also known as PLEB). See <http://www.cse.unsw.edu.au/~pleb/>
-  for more information.
-
-CerfBoard
-CONFIG_SA1100_CERF
-  The Intrinsyc CerfBoard is based on the StrongARM 1110.
-  More information is available at:
-  <http://www.intrinsyc.com/products/referenceplatforms/cerfboard.html>.
-
-  Say Y if configuring for an Intrinsyc CerfBoard.
-  Say N otherwise.
-
-FlexaNet
-CONFIG_SA1100_FLEXANET
-  Say Y here if you intend to run this kernel on the FlexaNet
-  handheld instruments. Information about this machine can be
-  found at: <http://www.flexanet.com/>.
-
-nanoEngine
-CONFIG_SA1100_NANOENGINE
-  The nanoEngine is a StrongARM 1110-based single board computer
-  from Bright Star Engineering. More information is available at:
-  <http://www.brightstareng.com/arm/nanoeng.htm>.
-
-  Say Y if configuring for a nanoEngine.
-  Say N otherwise.
-
-Pangolin
-CONFIG_SA1100_PANGOLIN
-  Pangolin is a StrongARM 1110-based evaluation platform produced
-  by Dialogue Technology.  It has EISA slots for ease of configuration
-  with SDRAM/Flash memory card, USB/Serial/Audio card, Compact Flash
-  card, and TFT-LCD card.
-
-  Say Y if configuring for a Pangolin.
-  Say N otherwise.
-
-Victor
-CONFIG_SA1100_VICTOR
-  Say Y here if you are using a Visu Aide Intel(R) StrongARM(R)
-  SA-1100 based Victor Digital Talking Book Reader.  See
-  <http://www.visuaide.com/pagevictor.en.html> for information on
-  this system.
-
-# Choice: cerf_ram
-Cerf on-board RAM size
-CONFIG_SA1100_CERF_8MB
-   Declare the size of the CerfBoard's on-board RAM.
-   Alternatives are 8, 16, 32, and 64MB.
-
-16MB
-CONFIG_SA1100_CERF_16MB
-   Declare that the CerfBoard has 16MB RAM.
-
-32MB
-CONFIG_SA1100_CERF_32MB
-   Declare that the CerfBoard has 32MB RAM.
-
-64MB
-CONFIG_SA1100_CERF_64MB
-   Declare that the CerfBoard has 64MB RAM.
-
-# Choice: cerf_flash
-Cerf flash memory size
-CONFIG_SA1100_CERF_FLASH_8MB
-  Tell the Cerf kernel the size of on-board memory.  The choices
-  are 8MB, 16MB, or 32MB.
-
-16MB
-CONFIG_SA1100_CERF_FLASH_16MB
-  Configure the Cerf kernel to expect 16MB of flash memory.
-
-32MB
-CONFIG_SA1100_CERF_FLASH_32MB
-  Configure the Cerf kernel to expect 32MB of flash memory.
-
-Support ARM610 processor
-CONFIG_CPU_ARM610
-  The ARM610 is the successor to the ARM3 processor
-  and was produced by VLSI Technology Inc.
-
-  Say Y if you want support for the ARM610 processor.
-  Otherwise, say N.
-
-Support ARM710 processor
-CONFIG_CPU_ARM710
-  A 32-bit RISC microprocessor based on the ARM7 processor core
-  designed by Advanced RISC Machines Ltd. The ARM710 is the
-  successor to the ARM610 processor. It was released in
-  July 1994 by VLSI Technology Inc.
-
-  Say Y if you want support for the ARM710 processor.
-  Otherwise, say N.
-
-Support ARM720T processor
-CONFIG_CPU_ARM720T
-  A 32-bit RISC processor with 8kByte Cache, Write Buffer and
-  MMU built around an ARM7TDMI core.
-
-  Say Y if you want support for the ARM720T processor.
-  Otherwise, say N.
-
-Support ARM920T processor
-CONFIG_CPU_ARM920T
-  The ARM920T is licensed to be produced by numerous vendors,
-  and is used in the Maverick EP9312.  More information at
-  <http://linuxdevices.com/products/PD2382866068.html>.
-
-  Say Y if you want support for the ARM920T processor.
-  Otherwise, say N.
-
-Support ARM1020 processor
-CONFIG_CPU_ARM1020
-  The ARM1020 is the cached version of the ARM10 processor,
-  with an addition of a floating-point unit.
-
-  Say Y if you want support for the ARM1020 processor.
-  Otherwise, say N.
-
-Support StrongARM SA-110 processor
-CONFIG_CPU_SA110
-  The Intel StrongARM(R) SA-110 is a 32-bit microprocessor and
-  is available at five speeds ranging from 100 MHz to 233 MHz.
-  More information is available at
-  <http://developer.intel.com/design/strong/sa110.htm>.
-
-  Say Y if you want support for the SA-110 processor.
-  Otherwise, say N.
-
-Tulsa
-CONFIG_SA1100_PFS168
-  The Radisys Corp. PFS-168 (aka Tulsa) is an Intel® StrongArm® SA-1110 based
-  computer which includes the SA-1111 Microprocessor Companion Chip and other
-  custom I/O designed to add connectivity and multimedia features for vending
-  and business machine applications. Say Y here if you require support for
-  this target.
-
-HP Jornada 720
-CONFIG_SA1100_JORNADA720
-  Say Y here if you want to build a kernel for the HP Jornada 720
-  handheld computer.  See <http://www.hp.com/jornada/products/720>
-  for details.
-
-InHand Electronics OmniMeter
-CONFIG_SA1100_OMNIMETER
-  Say Y here if you are using the inhand electronics OmniMeter.  See
-  <http://www.inhandelectronics.com/html/omni1.html> for details.
-
-Load kernel using Angel Debug Monitor
-CONFIG_ANGELBOOT
-  Say Y if you plan to load the kernel using Angel, ARM Ltd's target
-  debug stub.  If you are not using Angel, you must say N.  It is
-  important to get this setting correct.
-
-CDB89712
-CONFIG_ARCH_CDB89712
-  This is an evaluation board from Cirrus for the CS89712 processor.  The
-  board includes 2 serial ports, Ethernet, IRDA, and expansion headers.
-  It comes with 16 MB SDRAM and 8 MB flash ROM.
-
-CLPS-711X internal ROM bootstrap
-CONFIG_EP72XX_ROM_BOOT
-  If you say Y here, your CLPS711x-based kernel will use the bootstrap
-  mode memory map instead of the normal memory map.
-
-  Processors derived from the Cirrus CLPS-711X core support two boot modes.
-  Normal mode boots from the external memory device at CS0.  Bootstrap mode
-  rearranges parts of the memory map, placing an internal 128 byte bootstrap
-  ROM at CS0.  This option performs the address map changes required to
-  support booting in this mode.
-
-  You almost surely want to say N here.
-
-Math emulation
-CONFIG_FPE_NWFPE
-  Say Y to include the NWFPE floating point emulator in the kernel.
-  This is necessary to run most binaries. Linux does not currently
-  support floating point hardware so you need to say Y here even if
-  your machine has an FPA or floating point co-processor podule.
-
-  It is also possible to say M to build the emulator as a module
-  (nwfpe.o) or indeed to leave it out altogether. However, unless you
-  know what you are doing this can easily render your machine
-  unbootable. Saying Y is the safe option.
-
-  You may say N here if you are going to load the Acorn FPEmulator
-  early in the bootup.
-
-FastFPE math emulation
-CONFIG_FPE_FASTFPE
-  Say Y here to include the FAST floating point emulator in the kernel.
-  This is an experimental much faster emulator which has only 32 bit
-  precision for the mantissa.  It does not support any exceptions.
-  This makes it very simple, it is approximately 4-8 times faster than
-  NWFPE.
-
-  It should be sufficient for most programs.  It is definitely not
-  suitable if you do scientific calculations that need double
-  precision for iteration formulas that sum up lots of very small
-  numbers.  If you do not feel you need a faster FP emulation you
-  should better choose NWFPE.
-
-  It is also possible to say M to build the emulator as a module
-  (fastfpe.o).  But keep in mind that you should only load the FP
-  emulator early in the bootup.  You should never change from NWFPE to
-  FASTFPE or vice versa in an active system!
-
-DS1620 thermometer support
-CONFIG_DS1620
-  Say Y here to include support for the thermal management hardware
-  found in the NetWinder. This driver allows the user to control the
-  temperature set points and to read the current temperature.
-
-  It is also possible to say M here to build it as a module (ds1620.o)
-  It is recommended to be used on a NetWinder, but it is not a
-  necessity.
-
-Check for stack overflows
-CONFIG_DEBUG_STACKOVERFLOW
-  This option make do_IRQ() check for enough stack space beeing left.
-  This is safe to enable.
-
-Debug high memory support
-CONFIG_DEBUG_HIGHMEM
-  This options enables addition error checking for high memory systems.
-  Disable for production systems.
-
-Verbose kernel error messages
-CONFIG_DEBUG_ERRORS
-  This option controls verbose debugging information which can be
-  printed when the kernel detects an internal error. This debugging
-  information is useful to kernel hackers when tracking down problems,
-  but mostly meaningless to other people. It's safe to say Y unless
-  you are concerned with the code size or don't want to see these
-  messages.
-
-Compile kernel with frame pointer
-CONFIG_FRAME_POINTER
-  If you say Y here, the resulting kernel will be slightly larger and
-  slower, but it will give very useful debugging information. If you
-  don't debug the kernel, you can say N, but we may not be able to
-  solve problems without frame pointers.
-
-Verbose user fault messages
-CONFIG_DEBUG_USER
-  When a user program crashes due to an exception, the kernel can
-  print a brief message explaining what the problem was. This is
-  sometimes helpful for debugging but serves no purpose on a
-  production system. Most people should say N here.
-
-Include gdb debugging information in kernel binary
-CONFIG_DEBUG_INFO
-  Say Y here to include source-level debugging information in the
-  `vmlinux' binary image. This is handy if you want to use gdb or
-  addr2line to debug the kernel. It has no impact on the in-memory
-  footprint of the running kernel but it can increase the amount of
-  time and disk space needed for compilation of the kernel. If in
-  doubt say N.
-
-Kernel low-level debugging functions
-CONFIG_DEBUG_LL
-  Say Y here to include definitions of printascii, printchar, printhex
-  in the kernel.  This is helpful if you are debugging code that
-  executes before the console is initialized.
-
-Kernel low-level debugging messages via footbridge serial port
-CONFIG_DEBUG_DC21285_PORT
-  Say Y here if you want the debug print routines to direct their
-  output to the serial port in the DC21285 (Footbridge). Saying N
-  will cause the debug messages to appear on the first 16550
-  serial port.
-
-Kernel low-level debugging messages via UART2
-CONFIG_DEBUG_CLPS711X_UART2
-  Say Y here if you want the debug print routines to direct their
-  output to the second serial port on these devices.  Saying N will
-  cause the debug messages to appear on the first serial port.
-
-Disable pgtable cache
-CONFIG_NO_PGT_CACHE
-  Normally the kernel maintains a `quicklist' of preallocated
-  pagetable structures in order to increase performance. On machines
-  with very few pages this may however be a loss. Say Y here to
-  disable the pgtable cache.
-
-RISC OS personality
-CONFIG_ARTHUR
-  Say Y here to include the kernel code necessary if you want to run
-  Acorn RISC OS/Arthur binaries under Linux. This code is still very
-  experimental; if this sounds frightening, say N and sleep in peace.
-  You can also say M here to compile this support as a module (which
-  will be called arthur.o).
-
-Initial kernel command line
-CONFIG_CMDLINE
-  On some architectures (EBSA110 and CATS), there is currently no way
-  for the boot loader to pass arguments to the kernel. For these
-  architectures, you should supply some command-line options at build
-  time by entering them here. As a minimum, you should specify the
-  memory size and the root device (e.g., mem=64M root=/dev/nfs).
-
-Kernel-mode alignment trap handler
-CONFIG_ALIGNMENT_TRAP
-  ARM processors can not fetch/store information which is not
-  naturally aligned on the bus, i.e., a 4 byte fetch must start at an
-  address divisible by 4. On 32-bit ARM processors, these non-aligned
-  fetch/store instructions will be emulated in software if you say
-  here, which has a severe performance impact. This is necessary for
-  correct operation of some network protocols. With an IP-only
-  configuration it is safe to say N, otherwise say Y.
-
-DC21285 serial port support
-CONFIG_SERIAL_21285
-  If you have a machine based on a 21285 (Footbridge) StrongARM(R)/
-  PCI bridge you can enable its onboard serial port by enabling this
-  option. The device has major ID 4, minor 64.
-
-Console on DC21285 serial port
-CONFIG_SERIAL_21285_CONSOLE
-  If you have enabled the serial port on the 21285 footbridge you can
-  make it the console by answering Y to this option.
-
-SA1100 serial port support
-CONFIG_SERIAL_SA1100
-  * Orphaned entry retained 20 April 2001 by Russell King       *
-  * If you read this note from the configurator, please contact *
-  * the Configure.help maintainers.                             *
-  If you have a machine based on a SA1100/SA1110 StrongARM CPU you can
-  enable its onboard serial port by enabling this option.
-  Please read <file:Documentation/arm/SA1100/serial_UART> for further
-  info.
-
-Console on SA1100 serial port
-CONFIG_SERIAL_SA1100_CONSOLE
-  * Orphaned entry retained 20 April 2001 by Russell King       *
-  * If you read this note from the configurator, please contact *
-  * the Configure.help maintainers.                             *
-  If you have enabled the serial port on the SA1100/SA1110 StrongARM
-  CPU you can make it the console by answering Y to this option.
-
-L7200 serial port support
-CONFIG_SERIAL_L7200
-  * Orphaned entry retained 20 April 2001 by Russell King       *
-  * If you read this note from the configurator, please contact *
-  * the Configure.help maintainers.                             *
-  If you have a LinkUp Systems L7200 board you can enable its two
-  onboard serial ports by enabling this option. The device numbers
-  are major ID 4 with minor 64 and 65 respectively.
-
-Console on L7200 serial port
-CONFIG_SERIAL_L7200_CONSOLE
-  * Orphaned entry retained 20 April 2001 by Russell King       *
-  * If you read this note from the configurator, please contact *
-  * the Configure.help maintainers.                             *
-  If you have enabled the serial ports on the L7200 development board
-  you can make the first serial port the console by answering Y to
-  this option.
-
-L7200 SDB keyboard support
-CONFIG_KEYBOARD_L7200
-  * Orphaned entry retained 20 April 2001 by Russell King       *
-  * If you read this note from the configurator, please contact *
-  * the Configure.help maintainers.                             *
-  Enable this option if you would like to be able to use a keyboard
-  on a LinkUp Systems L7200 board.
-
-L7200 SDB Fujitsu keyboard support
-CONFIG_KEYBOARD_L7200_NORM
-  * Orphaned entry retained 20 April 2001 by Russell King       *
-  * If you read this note from the configurator, please contact *
-  * the Configure.help maintainers.                             *
-  Select the Fujitsu keyboard if you want a normal QWERTY style
-  keyboard on the LinkUp SDB.
-
-L7200 SDB Prototype keyboard support
-CONFIG_KEYBOARD_L7200_DEMO
-  * Orphaned entry retained 20 April 2001 by Russell King       *
-  * If you read this note from the configurator, please contact *
-  * the Configure.help maintainers.                             *
-  Select the prototype keyboard if you want to play with the
-  LCD/keyboard combination on the LinkUp SDB.
-
-Footbridge Mode
-CONFIG_HOST_FOOTBRIDGE
-  * Orphaned entry retained 20 April 2001 by Russell King       *
-  * If you read this note from the configurator, please contact *
-  * the Configure.help maintainers.                             *
-  The 21285 Footbridge chip can operate in either `host mode' or
-  `add-in' mode.  Say Y if your 21285 is in host mode, and therefore
-  is the configuration master, otherwise say N. This must not be
-  set to Y if the card is used in 'add-in' mode.
-
-MFM hard disk support
-CONFIG_BLK_DEV_MFM
-  Support the MFM hard drives on the Acorn Archimedes both
-  on-board the A4x0 motherboards and via the Acorn MFM modules.
-  Drives up to 64MB are supported. If you haven't got one of these
-  machines or drives just say N.
-
-Old Archimedes floppy (1772) support
-CONFIG_BLK_DEV_FD1772
-  Support the floppy drive on the Acorn Archimedes (A300, A4x0, A540,
-  R140 and R260) series of computers; it supports only 720K floppies
-  at the moment. If you don't have one of these machines just answer
-  N.
-
-Autodetect hard drive geometry
-CONFIG_BLK_DEV_MFM_AUTODETECT
-  If you answer Y, the MFM code will attempt to automatically detect
-  the cylinders/heads/sectors count on your hard drive. WARNING: This
-  sometimes doesn't work and it also does some dodgy stuff which
-  potentially might damage your drive.
-
-NetWinder /dev/flash support
-CONFIG_NWFLASH
-  If you say Y here and create a character device /dev/flash with
-  major 10 and minor 160 you can manipulate the flash ROM containing
-  the NetWinder firmware. Be careful as accidentally overwriting the
-  flash contents can render your computer unbootable. On no account
-  allow random users access to this device. :-)
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called nwflash.o. If you want to compile it as a
-  module, say M here and read <file:Documentation/modules.txt>.
-
-  If you're not sure, say N.
-
-SRM environment variables in procfs
-CONFIG_SRM_ENV
-  If you enable this option, a subdirectory inside /proc called
-  /proc/srm_environment will give you access to the all important
-  SRM environment variables (those which have a name) and also
-  to all others (by their internal number).
-
-  SRM is something like a BIOS for Alpha machines. There are some
-  other such BIOSes, like AlphaBIOS, which this driver cannot
-  support (hey, that's not SRM!).
-
-  Despite the fact that this driver doesn't work on all Alphas (but
-  only on those which have SRM as their firmware), it's save to
-  build it even if your particular machine doesn't know about SRM
-  (or if you intend to compile a generic kernel). It will simply
-  not create those subdirectory in /proc (and give you some warning,
-  of course).
-
-  This driver is also available as a module and will be called
-  srm_env.o then.
-
-Footbridge internal watchdog
-CONFIG_21285_WATCHDOG
-  The Intel Footbridge chip contains a builtin watchdog circuit. Say Y
-  here if you wish to use this. Alternatively say M to compile the
-  driver as a module, which will be called wdt285.o.
-
-  This driver does not work on all machines. In particular, early CATS
-  boards have hardware problems that will cause the machine to simply
-  lock up if the watchdog fires.
-
-  "If in doubt, leave it out" - say N.
-
-NetWinder WB83C977 watchdog
-CONFIG_977_WATCHDOG
-  Say Y here to include support for the WB977 watchdog included in
-  NetWinder machines. Alternatively say M to compile the driver as
-  a module, which will be called wdt977.o.
-
-  Not sure? It's safe to say N.
-
-IrDA subsystem support
-CONFIG_IRDA
-  Say Y here if you want to build support for the IrDA (TM) protocols.
-  The Infrared Data Associations (tm) specifies standards for wireless
-  infrared communication and is supported by most laptops and PDA's.
-
-  To use Linux support for the IrDA (tm) protocols, you will also need
-  some user-space utilities like irattach.  For more information, see
-  the file <file:Documentation/networking/irda.txt>.  You also want to
-  read the IR-HOWTO, available at
-  <http://www.tldp.org/docs.html#howto>.
-
-  If you want to exchange bits of data (vCal, vCard) with a PDA, you
-  will need to install some OBEX application, such as OpenObex :
-  <http://sourceforge.net/projects/openobex/>
-
-  This support is also available as a module called irda.o.  If you
-  want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-
-Ultra (connectionless) protocol
-CONFIG_IRDA_ULTRA
-  Say Y here to support the connectionless Ultra IRDA protocol.
-  Ultra allows to exchange data over IrDA with really simple devices
-  (watch, beacon) without the overhead of the IrDA protocol (no handshaking,
-  no management frames, simple fixed header).
-  Ultra is available as a special socket : socket(AF_IRDA, SOCK_DGRAM, 1);
-
-IrDA cache last LSAP
-CONFIG_IRDA_CACHE_LAST_LSAP
-  Say Y here if you want IrLMP to cache the last LSAP used.  This
-  makes sense since most frames will be sent/received on the same
-  connection.  Enabling this option will save a hash-lookup per frame.
-
-  If unsure, say Y.
-
-IrDA Fast RRs
-CONFIG_IRDA_FAST_RR
-  Say Y here is you want IrLAP to send fast RR (Receive Ready) frames
-  when acting as a primary station.
-  Disabling this option will make latency over IrDA very bad. Enabling
-  this option will make the IrDA stack send more packet than strictly
-  necessary, thus reduce your battery life (but not that much).
-
-  Fast RR will make IrLAP send out a RR frame immediately when
-  receiving a frame if its own transmit queue is currently empty. This
-  will give a lot of speed improvement when receiving much data since
-  the secondary station will not have to wait the max. turn around
-  time (usually 500ms) before it is allowed to transmit the next time.
-  If the transmit queue of the secondary is also empty, the primary will
-  start backing-off before sending another RR frame, waiting longer
-  each time until the back-off reaches the max. turn around time.
-  This back-off increase in controlled via
-  /proc/sys/net/irda/fast_poll_increase
-
-  If unsure, say Y.
-
-IrDA debugging information
-CONFIG_IRDA_DEBUG
-  Say Y here if you want the IrDA subsystem to write debug information
-  to your syslog. You can change the debug level in
-  /proc/sys/net/irda/debug .
-  When this option is enabled, the IrDA also perform many extra internal
-  verifications which will usually prevent the kernel to crash in case of
-  bugs.
-
-  If unsure, say Y (since it makes it easier to find the bugs).
-
-IrLAN protocol
-CONFIG_IRLAN
-  Say Y here if you want to build support for the IrLAN protocol.  If
-  you want to compile it as a module (irlan.o), say M here and read
-  <file:Documentation/modules.txt>.  IrLAN emulates an Ethernet and
-  makes it possible to put up a wireless LAN using infrared beams.
-
-  The IrLAN protocol can be used to talk with infrared access points
-  like the HP NetbeamIR, or the ESI JetEye NET.  You can also connect
-  to another Linux machine running the IrLAN protocol for ad-hoc
-  networking!
-
-IrNET protocol
-CONFIG_IRNET
-  Say Y here if you want to build support for the IrNET protocol.  If
-  you want to compile it as a module (irnet.o), say M here and read
-  <file:Documentation/modules.txt>.  IrNET is a PPP driver, so you
-  will also need a working PPP subsystem (driver, daemon and
-  config)...
-
-  IrNET is an alternate way to transfer TCP/IP traffic over IrDA.  It
-  uses synchronous PPP over a set of point to point IrDA sockets.  You
-  can use it between Linux machine or with W2k.
-
-IrCOMM protocol
-CONFIG_IRCOMM
-  Say Y here if you want to build support for the IrCOMM protocol.  If
-  you want to compile it as a module (you will get ircomm.o and
-  ircomm-tty.o), say M here and read <file:Documentation/modules.txt>.
-  IrCOMM implements serial port emulation, and makes it possible to
-  use all existing applications that understands TTY's with an
-  infrared link.  Thus you should be able to use application like PPP,
-  minicom and others.  Enabling this option will create two modules
-  called ircomm and ircomm_tty.
-
-IrTTY IrDA Device Driver
-CONFIG_IRTTY_SIR
-  Say Y here if you want to build support for the IrTTY line
-  discipline.  If you want to compile it as a module (irtty.o), say M
-  here and read <file:Documentation/modules.txt>.  IrTTY makes it
-  possible to use Linux's own serial driver for all IrDA ports that
-  are 16550 compatible.  Most IrDA chips are 16550 compatible so you
-  should probably say Y to this option.  Using IrTTY will however
-  limit the speed of the connection to 115200 bps (IrDA SIR mode).
-
-  If unsure, say Y.
-
-IrPORT IrDA serial driver
-CONFIG_IRPORT_SIR
-  Say Y here if you want to build support for the IrPORT IrDA device
-  driver. If you want to compile it as a module (irport.o), say M here
-  and read <file:Documentation/modules.txt>.  IrPORT can be used
-  instead of IrTTY and sometimes this can be better.  One example is
-  if your IrDA port does not have echo-canceling, which will work OK
-  with IrPORT since this driver is working in half-duplex mode only.
-  You don't need to use irattach with IrPORT, but you just insert it
-  the same way as FIR drivers (insmod irport io=0x3e8 irq=11).  Notice
-  that IrPORT is a SIR device driver which means that speed is limited
-  to 115200 bps.
-
-  If unsure, say Y.
-
-USB IrDA FIR dongle Device Driver
-CONFIG_USB_IRDA
-  Say Y here if you want to build support for the USB IrDA FIR Dongle
-  device driver.  If you want to compile it as a module (irda-usb.o),
-  say M here and read <file:Documentation/modules.txt>.  IrDA-USB
-  support the various IrDA USB dongles available and most of their
-  peculiarities.  Those dongles plug in the USB port of your computer,
-  are plug and play, and support SIR and FIR (4Mbps) speeds.  On the
-  other hand, those dongles tend to be less efficient than a FIR
-  chipset.
-
-  Please note that the driver is still experimental.  And of course,
-  you will need both USB and IrDA support in your kernel...
-
-Datafab MDCFE-B Compact Flash Reader support
-CONFIG_USB_STORAGE_DATAFAB
-  This option enables a sub-driver of the USB Mass Storage driver.  These
-  sub-drivers are considered experimental, and should only be used by very
-  brave people.  System crashes and other bad things are likely to occur if
-  you use this driver.  If in doubt, select N.
-
-HP CD-Writer 82xx support
-CONFIG_USB_STORAGE_HP8200e
-  This option enables a sub-driver of the USB Mass Storage driver.  These
-  sub-drivers are considered experimental, and should only be used by very
-  brave people.  System crashes and other bad things are likely to occur if
-  you use this driver.  If in doubt, select N.
-
-Lexar Jumpshot Compact Flash Reader
-CONFIG_USB_STORAGE_JUMPSHOT       
-  This option enables a sub-driver of the USB Mass Storage driver.  These
-  sub-drivers are considered experimental, and should only be used by very
-  brave people.  System crashes and other bad things are likely to occur if
-  you use this driver.  If in doubt, select N.
-
-Winbond W83977AF IrDA Device Driver
-CONFIG_WINBOND_FIR
-  Say Y here if you want to build IrDA support for the Winbond
-  W83977AF super-io chipset.  This driver should be used for the IrDA
-  chipset in the Corel NetWinder.  The driver supports SIR, MIR and
-  FIR (4Mbps) speeds.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  The module will be called
-  w83977af_ir.o.
-
-NSC PC87108/PC87338 IrDA Device Driver
-CONFIG_NSC_FIR
-  Say Y here if you want to build support for the NSC PC87108 and
-  PC87338 IrDA chipsets.  This driver supports SIR,
-  MIR and FIR (4Mbps) speeds.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  The module will be called
-  nsc-ircc.o.
-
-National Semiconductor DP83820 support
-CONFIG_NS83820
-  This is a driver for the National Semiconductor DP83820 series
-  of gigabit ethernet MACs.  Cards using this chipset include:
-
-        SMC 9452TX          SMC SMC9462TX       
-        D-Link DGE-500T     PureData PDP8023Z-TG
-        SOHO-GA2000T        SOHO-GA2500T.
-        NetGear GA621
-
-  This driver supports the use of zero copy on tx, checksum 
-  validation on rx, and 64 bit addressing.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called ns83820.o.
-
-Toshiba Type-O IR Port device driver (old driver)
-CONFIG_TOSHIBA_OLD
-  Say Y here if you want to build support for the Toshiba Type-O IR
-  chipset.  This chipset is used by the Toshiba Libretto 100CT, and
-  many more laptops. This driver is obsolete, will no more be
-  maintained and will be removed in favor of the new driver.
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-  The module will be called toshoboe.o.
-
-Toshiba Type-O IR Port device driver
-CONFIG_TOSHIBA_FIR
-  Say Y here if you want to build support for the Toshiba Type-O IR
-  and Donau oboe chipsets. These chipsets are used by the Toshiba
-  Libretto 100/110CT, Tecra 8100, Portege 7020 and many more laptops.
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.
-  The module will be called donauboe.o.
-
-SMC IrCC
-CONFIG_SMC_IRCC_FIR
-  Say Y here if you want to build support for the SMC Infrared
-  Communications Controller.  It is used in the Fujitsu Lifebook 635t
-  and Sony PCG-505TX.  If you want to compile it as a module, say M
-  here and read <file:Documentation/modules.txt>.  The module will be
-  called smc-ircc.o.
-
-ALi M5123 FIR controller driver
-CONFIG_ALI_FIR
-  Say Y here if you want to build support for the ALi M5123 FIR
-  Controller.  The ALi M5123 FIR Controller is embedded in ALi M1543C,
-  M1535, M1535D, M1535+, M1535D Sourth Bridge.  This driver supports
-  SIR, MIR and FIR (4Mbps) speeds.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  The module will be called
-  ali-ircc.o.
-
-VLSI 82C147 PCI-IrDA SIR/MIR/FIR Controller driver
-CONFIG_VLSI_FIR
-  Say Y here if you want to build support for the VLSI 82C147
-  PCI-IrDA Controller. This controller is used by the HP OmniBook 800
-  and 5500 notebooks. The driver provides support for SIR, MIR and
-  FIR (4Mbps) speeds.
-
-  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>. The module will be called vlsi_ir.o.
-
-Serial dongle support
-CONFIG_DONGLE
-  Say Y here if you have an infrared device that connects to your
-  computer's serial port. These devices are called dongles. Then say Y
-  or M to the driver for your particular dongle below.
-
-  Note that the answer to this question won't directly affect the
-  kernel: saying N will just cause the configurator to skip all
-  the questions about serial dongles.
-
-ESI JetEye PC dongle
-CONFIG_ESI_DONGLE
-  Say Y here if you want to build support for the Extended Systems
-  JetEye PC dongle.  If you want to compile it as a module, say M here
-  and read <file:Documentation/modules.txt>.  The ESI dongle attaches
-  to the normal 9-pin serial port connector, and can currently only be
-  used by IrTTY.  To activate support for ESI dongles you will have to
-  start irattach like this: "irattach -d esi".
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called esi.o.
-
-ACTiSYS IR-220L and IR220L+ dongle
-CONFIG_ACTISYS_DONGLE
-  Say Y here if you want to build support for the ACTiSYS IR-220L and
-  IR220L+ dongles.  If you want to compile it as a module, say M here
-  and read <file:Documentation/modules.txt>.  The ACTiSYS dongles
-  attaches to the normal 9-pin serial port connector, and can
-  currently only be used by IrTTY.  To activate support for ACTiSYS
-  dongles you will have to start irattach like this:
-  "irattach -d actisys" or "irattach -d actisys+".
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called actisys.o.
-
-Tekram IrMate 210B dongle
-CONFIG_TEKRAM_DONGLE
-  Say Y here if you want to build support for the Tekram IrMate 210B
-  dongle.  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  The Tekram dongle attaches to the
-  normal 9-pin serial port connector, and can currently only be used
-  by IrTTY.  To activate support for Tekram dongles you will have to
-  start irattach like this: "irattach -d tekram".
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called tekram.o.
-
-Greenwich GIrBIL dongle
-CONFIG_GIRBIL_DONGLE
-  Say Y here if you want to build support for the Greenwich GIrBIL
-  dongle.  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  The Greenwich dongle attaches to
-  the normal 9-pin serial port connector, and can currently only be
-  used by IrTTY.  To activate support for Greenwich dongles you will
-  have to insert "irattach -d girbil" in the /etc/irda/drivers script.
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called girbil.o.
-
-Parallax LiteLink dongle
-CONFIG_LITELINK_DONGLE
-  Say Y here if you want to build support for the Parallax Litelink
-  dongle.  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  The Parallax dongle attaches to
-  the normal 9-pin serial port connector, and can currently only be
-  used by IrTTY.  To activate support for Parallax dongles you will
-  have to start irattach like this "irattach -d litelink".
-
-  If you want to compile the driver as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read <file:Documentation/modules.txt>.  The module
-  will be called litelink.o.
-
-Microchip MCP2120 dongle
-CONFIG_MCP2120_DONGLE
-  Say Y here if you want to build support for the Microchip MCP2120
-  dongle.  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  The MCP2120 dongle attaches to
-  the normal 9-pin serial port connector, and can currently only be
-  used by IrTTY.  To activate support for MCP2120 dongles you will
-  have to insert "irattach -d mcp2120" in the /etc/irda/drivers script.
-
-  You must build this dongle yourself.  For more information see:
-  <http://www.eyetap.org/~tangf/irda_sir_linux.html>
-
-Old Belkin dongle
-CONFIG_OLD_BELKIN_DONGLE
-  Say Y here if you want to build support for the Adaptec Airport 1000
-  and 2000 dongles.  If you want to compile it as a module, say M here
-  and read <file:Documentation/modules.txt>.  The module will be
-  called old_belkin.o.  Some information is contained in the comments
-  at the top of <file:drivers/net/irda/old_belkin.c>.
-ACTiSYS IR-200L dongle (Experimental)
-CONFIG_ACT200L_DONGLE
-  Say Y here if you want to build support for the ACTiSYS IR-200L
-  dongle. If you want to compile it as a module, say M here and read
-  Documentation/modules.txt. The ACTiSYS IR-200L dongle attaches to
-  the normal 9-pin serial port connector, and can currently only be
-  used by IrTTY. To activate support for ACTiSYS IR-200L dongles
-  you will have to start irattach like this: "irattach -d act200l".
-
-Mobile Action MA600 dongle (Experimental)
-CONFIG_MA600_DONGLE
-  Say Y here if you want to build support for the Mobile Action MA600
-  dongle.  If you want to compile it as a module, say M here and read
-  <file:Documentation/modules.txt>.  The MA600 dongle attaches to
-  the normal 9-pin serial port connector, and can currently only be
-  tested on IrCOMM.  To activate support for MA600 dongles you will
-  have to insert "irattach -d ma600" in the /etc/irda/drivers script.
-  Note: irutils 0.9.15 requires no modification. irutils 0.9.9 needs
-  modification. For more information, download the following tar gzip
-  file.
-
-  There is a pre-compiled module on
-  <http://engsvr.ust.hk/~eetwl95/download/ma600-2.4.x.tar.gz>
-
-VME (Motorola and BVM) support
-CONFIG_VME
-  Say Y here if you want to build a kernel for a 680x0 based VME
-  board.  Boards currently supported include Motorola boards MVME147,
-  MVME162, MVME166, MVME167, MVME172, and MVME177.  BVME4000 and
-  BVME6000 boards from BVM Ltd are also supported.
-
-MVME147 support
-CONFIG_MVME147
-  Say Y to include support for early Motorola VME boards.  This will
-  build a kernel which can run on MVME147 single-board computers.  If
-  you select this option you will have to select the appropriate
-  drivers for SCSI, Ethernet and serial ports later on.
-
-MVME162, 166 and 167 support
-CONFIG_MVME16x
-  Say Y to include support for Motorola VME boards.  This will build a
-  kernel which can run on MVME162, MVME166, MVME167, MVME172, and
-  MVME177 boards.  If you select this option you will have to select
-  the appropriate drivers for SCSI, Ethernet and serial ports later
-  on.
-
-BVME4000 and BVME6000 support
-CONFIG_BVME6000
-  Say Y to include support for VME boards from BVM Ltd.  This will
-  build a kernel which can run on BVME4000 and BVME6000 boards.  If
-  you select this option you will have to select the appropriate
-  drivers for SCSI, Ethernet and serial ports later on.
-
-Use write-through caching for 68060 supervisor accesses
-CONFIG_060_WRITETHROUGH
-  The 68060 generally uses copyback caching of recently accessed data.
-  Copyback caching means that memory writes will be held in an on-chip
-  cache and only written back to memory some time later.  Saying Y
-  here will force supervisor (kernel) accesses to use writethrough
-  caching.  Writethrough caching means that data is written to memory
-  straight away, so that cache and memory data always agree.
-  Writethrough caching is less efficient, but is needed for some
-  drivers on 68060 based systems where the 68060 bus snooping signal
-  is hardwired on.  The 53c710 SCSI driver is known to suffer from
-  this problem.
-
-WD33C93 SCSI driver for MVME147
-CONFIG_MVME147_SCSI
-  Support for the on-board SCSI controller on the Motorola MVME147
-  single-board computer.
-
-SCC support for MVME147 serial ports
-CONFIG_MVME147_SCC
-  This is the driver for the serial ports on the Motorola MVME147
-  boards.  Everyone using one of these boards should say Y here.
-
-NCR53C710 SCSI driver for MVME16x
-CONFIG_MVME16x_SCSI
-  The Motorola MVME162, 166, 167, 172 and 177 boards use the NCR53C710
-  SCSI controller chip.  Almost everyone using one of these boards
-  will want to say Y to this question.
-
-NCR53C710 SCSI driver for BVME6000
-CONFIG_BVME6000_SCSI
-  The BVME4000 and BVME6000 boards from BVM Ltd use the NCR53C710
-  SCSI controller chip.  Almost everyone using one of these boards
-  will want to say Y to this question.
-
-MVME147 (Lance) Ethernet support
-CONFIG_MVME147_NET
-  Support for the on-board Ethernet interface on the Motorola MVME147
-  single-board computer.  Say Y here to include the
-  driver for this chip in your kernel.   If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-MVME16x Ethernet support
-CONFIG_MVME16x_NET
-  This is the driver for the Ethernet interface on the Motorola
-  MVME162, 166, 167, 172 and 177 boards.  Say Y here to include the
-  driver for this chip in your kernel.   If you want to compile it as
-  a module, say M here and read <file:Documentation/modules.txt>.
-
-BVME6000 Ethernet support
-CONFIG_BVME6000_NET
-  This is the driver for the Ethernet interface on BVME4000 and
-  BVME6000 VME boards.  Say Y here to include the driver for this chip
-  in your kernel.   If you want to compile it as a module, say M here
-  and read <file:Documentation/modules.txt>.
-
-CD2401 support for MVME166/7 serial ports
-CONFIG_SERIAL167
-  This is the driver for the serial ports on the Motorola MVME166,
-  167, and 172 boards.  Everyone using one of these boards should say
-  Y here.
-
-SCC support for MVME162 serial ports
-CONFIG_MVME162_SCC
-  This is the driver for the serial ports on the Motorola MVME162 and
-  172 boards.  Everyone using one of these boards should say Y here.
-
-SCC support for BVME6000 serial ports
-CONFIG_BVME6000_SCC
-  This is the driver for the serial ports on the BVME4000 and BVME6000
-  boards from BVM Ltd.  Everyone using one of these boards should say
-  Y here.
-
-7-Segment Display support
-CONFIG_DISPLAY7SEG
-  This is the driver for the 7-segment display and LED present on
-  Sun Microsystems CompactPCI models CP1400 and CP1500.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called display7seg.o. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-  If you do not have a CompactPCI model CP1400 or CP1500, or
-  another UltraSPARC-IIi-cEngine boardset with a 7-segment display,
-  you should say N to this option.
-
-# Choice: cristype
-Etrax-100-LX-v1
-CONFIG_ETRAX100LX
-  Support version 1 of the Etrax 100LX.
-
-Etrax-100-LX-v2
-CONFIG_ETRAX100LX_V2
-  Support version 2 of the Etrax 100LX.
-
-Etrax-100-LX-for-xsim-simulator
-CONFIG_SVINTO_SIM
-  Support the xsim ETRAX Simulator.
-
-DRAM size (dec, in MB)
-CONFIG_ETRAX_DRAM_SIZE
-  Size of DRAM (decimal in MB) typically 2, 8 or 16.
-
-ETRAX Flash Memory configuration
-CONFIG_ETRAX_FLASH_BUSWIDTH
-  Width in bytes of the Flash bus (1, 2 or 4). Is usually 2.
-
-# Choice: crisleds
-LED configuration on PA
-CONFIG_ETRAX_PA_LEDS
-  The Etrax network driver is responsible for flashing LED's when
-  packets arrive and are sent.  It uses macros defined in
-  <file:include/asm-cris/io.h>, and those macros are defined after what
-  YOU choose in this option.  The actual bits used are configured
-  separately.  Select this if the LEDs are on port PA.  Some products
-  put the leds on PB or a memory-mapped latch (CSP0) instead.
-
-LED configuration on PB
-CONFIG_ETRAX_PB_LEDS
-  The Etrax network driver is responsible for flashing LED's when
-  packets arrive and are sent.  It uses macros defined in
-  <file:include/asm-cris/io.h>, and those macros are defined after what
-  YOU choose in this option.  The actual bits used are configured
-  separately.  Select this if the LEDs are on port PB.  Some products
-  put the leds on PA or a memory-mapped latch (CSP0) instead.
-
-LED configuration on CSP0
-CONFIG_ETRAX_CSP0_LEDS
-  The Etrax network driver is responsible for flashing LED's when
-  packets arrive and are sent. It uses macros defined in
-  <file:include/asm-cris/io.h>, and those macros are defined after what
-  YOU choose in this option.  The actual bits used are configured
-  separately.  Select this if the LEDs are on a memory-mapped latch
-  using chip select CSP0, this is mapped at 0x90000000.
-  Some products put the leds on PA or PB instead.
-
-No LED at all
-CONFIG_ETRAX_NO_LEDS
-  Select this option if you don't have any LED at all.
-
-First green LED bit
-CONFIG_ETRAX_LED1G
-  Bit to use for the first green LED.
-  Most Axis products use bit 2 here.
-
-First red LED bit
-CONFIG_ETRAX_LED1R
-  Bit to use for the first red LED.
-  Most Axis products use bit 3 here.
-  For products with only one controllable LED,
-  set this to same as CONFIG_ETRAX_LED1G (normally 2).
-
-Second green LED bit
-CONFIG_ETRAX_LED2G
-  Bit to use for the second green LED. The "Active" LED.
-  Most Axis products use bit 4 here.
-  For products with only one controllable LED,
-  set this to same as CONFIG_ETRAX_LED1G (normally 2).
-
-Second red LED bit
-CONFIG_ETRAX_LED2R
-  Bit to use for the second red LED.
-  Most Axis products use bit 5 here.
-  For products with only one controllable LED,
-  set this to same as CONFIG_ETRAX_LED1G (normally 2).
-
-Third green LED bit
-CONFIG_ETRAX_LED3G
-  Bit to use for the third green LED. The "Drive" LED.
-  For products with only one or two controllable LEDs,
-  set this to same as CONFIG_ETRAX_LED1G (normally 2).
-
-Third red LED bit
-CONFIG_ETRAX_LED3R
-  Bit to use for the third red LED.
-  For products with only one or two controllable LEDs,
-  set this to same as CONFIG_ETRAX_LED1G (normally 2).
-
-Fourth green LED bit
-CONFIG_ETRAX_LED4G
-  Bit to use for the fourth green LED.
-  For products with only one or two controllable LEDs,
-  set this to same as CONFIG_ETRAX_LED1G (normally 2).
-
-Fourth red LED bit
-CONFIG_ETRAX_LED4R
-  Bit to use for the fourth red LED.
-  For products with only one or two controllable LEDs,
-  set this to same as CONFIG_ETRAX_LED1G (normally 2).
-
-Fifth green LED bit
-CONFIG_ETRAX_LED5G
-  Bit to use for the fifth green LED.
-  For products with only one or two controllable LEDs,
-  set this to same as CONFIG_ETRAX_LED1G (normally 2).
-
-Fifth red LED bit
-CONFIG_ETRAX_LED5R
-  Bit to use for the fifth red LED.
-  For products with only one or two controllable LEDs,
-  set this to same as CONFIG_ETRAX_LED1G (normally 2).
-
-Sixth green LED bit
-CONFIG_ETRAX_LED6G
-  Bit to use for the sixth green LED. The "Drive" LED.
-  For products with only one or two controllable LEDs,
-  set this to same as CONFIG_ETRAX_LED1G (normally 2).
-
-Sixth red LED bit
-CONFIG_ETRAX_LED6R
-  Bit to use for the sixth red LED.
-  For products with only one or two controllable LEDs,
-  set this to same as CONFIG_ETRAX_LED1G (normally 2).
-
-Seventh green LED bit
-CONFIG_ETRAX_LED7G
-  Bit to use for the seventh green LED.
-  For products with only one or two controllable LEDs,
-  set this to same as CONFIG_ETRAX_LED1G (normally 2).
-
-Seventh red LED bit
-CONFIG_ETRAX_LED7R
-  Bit to use for the seventh red LED.
-  For products with only one or two controllable LEDs,
-  set this to same as CONFIG_ETRAX_LED1G (normally 2).
-
-Eighth yellow LED bit
-CONFIG_ETRAX_LED8Y
-  Bit to use for the eighth yellow LED. The "Drive" LED.
-  For products with only one or two controllable LEDs,
-  set this to same as CONFIG_ETRAX_LED1G (normally 2).
-
-Ninth yellow LED bit
-CONFIG_ETRAX_LED9Y
-  Bit to use for the ninth yellow LED.
-  For products with only one or two controllable LEDs,
-  set this to same as CONFIG_ETRAX_LED1G (normally 2).
-
-Tenth yellow LED bit
-CONFIG_ETRAX_LED10Y
-  Bit to use for the tenth yellow LED.
-  For products with only one or two controllable LEDs,
-  set this to same as CONFIG_ETRAX_LED1G (normally 2).
-
-Eleventh yellow LED bit
-CONFIG_ETRAX_LED11Y
-  Bit to use for the eleventh yellow LED.
-  For products with only one or two controllable LEDs,
-  set this to same as CONFIG_ETRAX_LED1G (normally 2).
-
-Twelfth red LED bit
-CONFIG_ETRAX_LED12R
-  Bit to use for the twelfth red LED.
-  For products with only one or two controllable LEDs,
-  set this to same as CONFIG_ETRAX_LED1G (normally 2).
-
-Flash LED off during activity
-CONFIG_ETRAX_LED_OFF_DURING_ACTIVITY
-  This option allows you to decide whether the network LED (and
-  Bluetooth LED in case you use Bluetooth) will be on or off when
-  the network is connected, and whether it should flash off or on
-  when there is activity. If you say y to this option the network
-  LED will be lit when there is a connection, and will flash off
-  when there is activity.
-
-PA button configuration
-CONFIG_ETRAX_PA_BUTTON_BITMASK
-  This is a bitmask with information about what bits on PA that
-  are used for buttons.
-  Most products has a so called TEST button on PA1, if that's true
-  use 02 here.
-  Use 00 if there are no buttons on PA.
-  If the bitmask is <> 00 a button driver will be included in the gpio
-  driver. Etrax general I/O support must be enabled.
-
-PA changeable direction bits
-CONFIG_ETRAX_PA_CHANGEABLE_DIR
-  This is a bitmask with information of what bits in PA that a user
-  can change direction on using ioctl's.
-  Bit set = changeable.
-  You probably want 00 here.
-
-PA changeable data bits
-CONFIG_ETRAX_PA_CHANGEABLE_BITS
-  This is a bitmask with information of what bits in PA that a user
-  can change change the value on using ioctl's.
-  Bit set = changeable.
-  You probably want 00 here.
-
-PA changeable direction bits
-CONFIG_ETRAX_PB_CHANGEABLE_DIR
-  This is a bitmask with information of what bits in PB that a user
-  can change direction on using ioctl's.
-  Bit set = changeable.
-  You probably want 00 here.
-
-PB changeable data bits
-CONFIG_ETRAX_PB_CHANGEABLE_BITS
-  This is a bitmask with information of what bits in PB that a user
-  can change the value on using ioctl's.
-  Bit set = changeable.
-  You probably want 00 here.
-
-Kernel debugger (kgdb)
-CONFIG_ETRAX_KGDB
-  The CRIS version of gdb can be used to remotely debug a running
-  Linux kernel via the serial debug port.  Provided you have gdb-cris
-  installed, run gdb-cris vmlinux, then type
-
-  (gdb) set remotebaud 115200           <- kgdb uses 115200 as default
-  (gdb) target remote /dev/ttyS0        <- maybe you use another port
-
-  This should connect you to your booted kernel (or boot it now if you
-  didn't before).  The kernel halts when it boots, waiting for gdb if
-  this option is turned on!
-
-Etrax bus waitstates
-CONFIG_ETRAX_DEF_R_WAITSTATES
-  Waitstates for SRAM, Flash and peripherals (not DRAM).  95f8 is a
-  good choice for most Axis products...
-
-Etrax bus configuration
-CONFIG_ETRAX_DEF_R_BUS_CONFIG
-  Assorted bits controlling write mode, DMA burst length etc.  104 is
-  a good choice for most Axis products...
-
-Etrax SDRAM configuration
-CONFIG_ETRAX_SDRAM
-  Enable this if you use SDRAM chips and configure
-  R_SDRAM_CONFIG and R_SDRAM_TIMING as well.
-
-DRAM size (dec, in MB)
-CONFIG_ETRAX_DEF_R_DRAM_CONFIG
-  The R_DRAM_CONFIG register specifies everything on how the DRAM
-  chips in the system are connected to the Etrax CPU.  This is
-  different depending on the manufacturer, chip type and number of
-  chips.  So this value often needs to be different for each Axis
-  product.
-
-Etrax DRAM timing
-CONFIG_ETRAX_DEF_R_DRAM_TIMING
-  Different DRAM chips have different speeds.  Current Axis products
-  use 50ns DRAM chips which can use the timing: 5611.
-
-Etrax SDRAM configuration
-CONFIG_ETRAX_DEF_R_SDRAM_CONFIG
-  The R_SDRAM_CONFIG register specifies everything on how the SDRAM
-  chips in the system are connected to the Etrax CPU.  This is
-  different depending on the manufacturer, chip type and number of
-  chips.  So this value often needs to be different for each Axis
-  product.
-
-Etrax SDRAM timing
-CONFIG_ETRAX_DEF_R_SDRAM_TIMING
-  Different SDRAM chips have different timing.
-
-Etrax General port A direction
-CONFIG_ETRAX_DEF_R_PORT_PA_DIR
-  Configures the direction of general port A bits.  1 is out, 0 is in.
-  This is often totally different depending on the product used.
-  There are some guidelines though - if you know that only LED's are
-  connected to port PA, then they are usually connected to bits 2-4
-  and you can therefore use 1c.  On other boards which don't have the
-  LED's at the general ports, these bits are used for all kinds of
-  stuff.  If you don't know what to use, it is always safe to put all
-  as inputs, although floating inputs isn't good.
-
-Etrax General port A data
-CONFIG_ETRAX_DEF_R_PORT_PA_DATA
-  Configures the initial data for the general port A bits.  Most
-  products should use 00 here.
-
-Etrax General port B config
-CONFIG_ETRAX_DEF_R_PORT_PB_CONFIG
-  Configures the type of the general port B bits.  1 is chip select,
-  0 is port.  Most products should use 00 here.
-
-Etrax General port B direction
-CONFIG_ETRAX_DEF_R_PORT_PB_DIR
-  Configures the direction of general port B bits. 1 is out, 0 is in.
-  This is often totally different depending on the product used.  Bits
-  0 and 1 on port PB are usually used for I2C communication, but the
-  kernel I2C driver sets the appropriate directions itself so you
-  don't need to take that into consideration when setting this option.
-  If you don't know what to use, it is always safe to put all as
-  inputs.
-
-Etrax General port B data
-CONFIG_ETRAX_DEF_R_PORT_PB_DATA
-  Configures the initial data for the general port A bits.  Most
-  products should use FF here.
-
-Etrax General port device
-CONFIG_ETRAX_GPIO
-  Enables the Etrax general port device (major 120, minors 0 and 1).
-  You can use this driver to access the general port bits. It supports
-  these ioctl's:
-        #include <linux/etraxgpio.h>
-       fd = open("/dev/gpioa", O_RDWR); // or /dev/gpiob
-       ioctl(fd, _IO(ETRAXGPIO_IOCTYPE, IO_SETBITS), bits_to_set);
-       ioctl(fd, _IO(ETRAXGPIO_IOCTYPE, IO_CLRBITS), bits_to_clear);
-       val = ioctl(fd, _IO(ETRAXGPIO_IOCTYPE, IO_READBITS), NULL);
-  Remember that you need to setup the port directions appropriately in
-  the General configuration.
-
-Etrax parallel data support
-CONFIG_ETRAX_PARDATA
-  Adds support for writing data to the parallel port par0 of the ETRAX
-  100.  If you create a character special file with major number 126,
-  you can write to the data bits of par0.
-  Note: you need to disable Etrax100 parallel port support.
-
-Etrax parallel LCD (HD44780) Driver
-CONFIG_ETRAX_LCD_HD44780
-  Adds support for a HD44780 controlled LCD connected to the parallel
-  port par0 of the Etrax.
-
-Etrax Serial port ser0 support
-CONFIG_ETRAX_SERIAL
-  Enables the ETRAX 100 serial driver for ser0 (ttyS0)
-  You probably want this enabled.
-
-/proc/serial entry
-CONFIG_ETRAX_SERIAL_PROC_ENTRY
-  Enables /proc/serial entry where errors and statistics can be
-  viewed.  CONFIG_PROC_FS must also be set for this to work.
-
-Etrax Serial port fast flush of DMA using fast timer API
-CONFIG_ETRAX_SERIAL_FAST_TIMER
-  Select this to have the serial DMAs flushed at a higher rate than
-  normally, possible by using the fast timer API, the timeout is
-  approx. 4 character times.
-  If unsure, say N.
-
-Etrax Serial port fast flush of DMA
-CONFIG_ETRAX_SERIAL_FLUSH_DMA_FAST
-  Select this to have the serial DMAs flushed at a higher rate than
-  normally possible through a fast timer interrupt (currently at
-  15360 Hz).
-  If unsure, say N.
-
-Etrax Serial port receive flush timeout
-CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS
-  Number of timer ticks between flush of receive fifo (1 tick = 10ms).
-  Try 0-3 for low latency applications.  Approx 5 for high load
-  applications (e.g. PPP).  Maybe this should be more adaptive some
-  day...
-
-Etrax Serial port ser0 DTR, RI, DSR and CD support on PB
-CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_ON_PB
-  Enables the status and control signals DTR, RI, DSR and CD on PB for
-  ser0.
-
-Serial port 1 enabled
-CONFIG_ETRAX_SERIAL_PORT1
-  Enables the ETRAX 100 serial driver for ser1 (ttyS1).
-
-Etrax Serial port ser1 DTR, RI, DSR and CD support on PB
-CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_ON_PB
-  Enables the status and control signals DTR, RI, DSR and CD on PB for
-  ser1.
-
-Serial port 2 enabled
-CONFIG_ETRAX_SERIAL_PORT2
-  Enables the ETRAX 100 serial driver for ser2 (ttyS2).
-
-Etrax Serial port ser2 DTR, RI, DSR and CD support on PA
-CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_ON_PA
-  Enables the status and control signals DTR, RI, DSR and CD on PA for
-  ser2.
-
-Serial port 3 enabled
-CONFIG_ETRAX_SERIAL_PORT3
-  Enables the ETRAX 100 serial driver for ser3 (ttyS3).
-
-Etrax100 RS-485 support
-CONFIG_ETRAX_RS485
-  Enables support for RS-485 serial communication.  For a primer on
-  RS-485, see <http://www.hw.cz/english/docs/rs485/rs485.html>.
-
-Etrax100 RS-485 mode on PA
-CONFIG_ETRAX_RS485_ON_PA
-  Control Driver Output Enable on RS485 transceiver using a pin on PA
-  port:
-          Axis 2400/2401 uses PA 3.
-
-Etrax100 RS-485 mode on PA bit
-CONFIG_ETRAX_RS485_ON_PA_BIT
-  Control Driver Output Enable on RS485 transceiver using a this bit
-  on PA port.
-
-Ser0 DTR on PB bit
-CONFIG_ETRAX_SER0_DTR_ON_PB_BIT
-  Specify the pin of the PB port to carry the DTR signal for serial
-  port 0.
-
-Ser0 RI  on PB bit
-CONFIG_ETRAX_SER0_RI_ON_PB_BIT
-  Specify the pin of the PB port to carry the RI signal for serial
-  port 0.
-
-Ser0 DSR on PB bit
-CONFIG_ETRAX_SER0_DSR_ON_PB_BIT
-  Specify the pin of the PB port to carry the DSR signal for serial
-  port 0.
-
-Ser0 CD  on PB bit
-CONFIG_ETRAX_SER0_CD_ON_PB_BIT
-  Specify the pin of the PB port to carry the CD signal for serial
-  port 0.
-
-Ser1 DTR on PB bit
-CONFIG_ETRAX_SER1_DTR_ON_PB_BIT
-  Specify the pin of the PB port to carry the DTR signal for serial
-  port 1.
-
-Ser1 RI  on PB bit
-CONFIG_ETRAX_SER1_RI_ON_PB_BIT
-  Specify the pin of the PB port to carry the RI signal for serial
-  port 1.
-
-Ser1 DSR on PB bit
-CONFIG_ETRAX_SER1_DSR_ON_PB_BIT
-  Specify the pin of the PB port to carry the DSR signal for serial
-  port 1.
-
-Ser1 CD  on PB bit
-CONFIG_ETRAX_SER1_CD_ON_PB_BIT
-  Specify the pin of the PB port to carry the CD signal for serial
-  port 1.
-
-Ser2 DTR on PA bit
-CONFIG_ETRAX_SER2_DTR_ON_PA_BIT
-  Specify the pin of the PA port to carry the DTR signal for serial
-  port 2.
-
-Ser2 RI  on PA bit
-CONFIG_ETRAX_SER2_RI_ON_PA_BIT
-  Specify the pin of the PA port to carry the RI signal for serial
-  port 2.
-
-Ser2 DSR on PA bit
-CONFIG_ETRAX_SER2_DSR_ON_PA_BIT
-  Specify the pin of the PA port to carry the DTR signal for serial
-  port 2.
-
-Ser2 CD  on PA bit
-CONFIG_ETRAX_SER2_CD_ON_PA_BIT
-  Specify the pin of the PA port to carry the CD signal for serial
-  port 2.
-
-Etrax100 RS-485 disable receiver
-CONFIG_ETRAX_RS485_DISABLE_RECEIVER
-  It's necessary to disable the serial receiver to avoid serial
-  loopback.  Not all products are able to do this in software only.
-  Axis 2400/2401 must disable receiver.
-
-Etrax100 I2C Support
-CONFIG_ETRAX_I2C
-  Enables an I2C driver on PB0 and PB1 on ETRAX100.
-  EXAMPLE usage:
-        i2c_arg = I2C_WRITEARG(STA013_WRITE_ADDR, reg, val);
-       ioctl(fd, _IO(ETRAXI2C_IOCTYPE, I2C_WRITEREG), i2c_arg);
-       i2c_arg = I2C_READARG(STA013_READ_ADDR, reg);
-       val = ioctl(fd, _IO(ETRAXI2C_IOCTYPE, I2C_READREG), i2c_arg);
-
-Etrax100 I2C configuration
-CONFIG_ETRAX_I2C_USES_PB_NOT_PB_I2C
-  Select whether to use the special I2C mode in the PB I/O register or
-  not.  This option needs to be selected in order to use some drivers
-  that access the I2C I/O pins directly instead of going through the
-  I2C driver, like the DS1302 realtime-clock driver.  If you are
-  uncertain, choose Y here.
-
-Etrax100 I2C EEPROM (NVRAM) support
-CONFIG_ETRAX_I2C_EEPROM
-  Enables I2C EEPROM (non-volatile RAM) on PB0 and PB1 using the I2C
-  driver.  Select size option: Probed, 2k, 8k, 16k.
-  (Probing works for 2k and 8k but not that well for 16k)
-
-Etrax100 I2C EEPROM (NVRAM) size/16kB
-CONFIG_ETRAX_I2C_EEPROM_16KB
-  Use a 16kB EEPROM.
-
-Etrax100 I2C EEPROM (NVRAM) size/2kB
-CONFIG_ETRAX_I2C_EEPROM_2KB
-  Use a 2kB EEPROM.
-
-Etrax100 I2C EEPROM (NVRAM) size/8kB
-CONFIG_ETRAX_I2C_EEPROM_8KB
-  Use a 8kB EEPROM.
-
-# Choice: etrax_eeprom
-Etrax100 I2C EEPROM (NVRAM) size/probe
-CONFIG_ETRAX_I2C_EEPROM_PROBE
-  Specifies size or auto probe of the EEPROM size.
-  Options: Probed, 2k, 8k, 16k.
-  (Probing works for 2k and 8k but not that well for 16k)
-
-Etrax DS1302 Real-Time Clock driver
-CONFIG_ETRAX_DS1302
-  Enables the driver for the DS1302 Real-Time Clock battery-backed
-  chip on some products.  The kernel reads the time when booting, and
-  the date can be set using ioctl(fd, RTC_SET_TIME, &rt) with rt a
-  rtc_time struct (see <file:include/asm-cris/rtc.h>) on the /dev/rtc
-  device, major 121.  You can check the time with cat /proc/rtc, but
-  normal time reading should be done using libc function time and
-  friends.
-
-Etrax DS1302 RST on the Generic Port
-CONFIG_ETRAX_DS1302_RST_ON_GENERIC_PORT
-  If your product has the RST signal line for the DS1302 RTC on the
-  Generic Port then say Y here, otherwise leave it as N in which
-  case the RST signal line is assumed to be connected to Port PB
-  (just like the SCL and SDA lines).
-
-Etrax DS1302 RST bit number
-CONFIG_ETRAX_DS1302_RSTBIT
-  This is the bit number for the RST signal line of the DS1302 RTC on
-  the selected port. If you have selected the generic port then it
-  should be bit 27, otherwise your best bet is bit 5.
-
-Etrax DS1302 SCL bit number
-CONFIG_ETRAX_DS1302_SCLBIT
-  This is the bit number for the SCL signal line of the DS1302 RTC on
-  Port PB. This is probably best left at 3.
-
-Etrax DS1302 SDA bit number
-CONFIG_ETRAX_DS1302_SDABIT
-  This is the bit number for the SDA signal line of the DS1302 RTC on
-  Port PB. This is probably best left at 2.
-
-Etrax 100 IDE Reset
-CONFIG_ETRAX_IDE_CSP0_8_RESET
-  Configures the pin used to reset the IDE bus.
-
-Etrax 100 IDE Reset
-CONFIG_ETRAX_IDE_CSPE1_16_RESET
-  Configures the pin used to reset the IDE bus.
-
-Delay for drives to regain consciousness
-CONFIG_ETRAX_IDE_DELAY
-  Sets the time to wait for disks to regain consciousness after reset.
-
-Etrax 100 IDE Reset
-CONFIG_ETRAX_IDE_G27_RESET
-  Configures the pin used to reset the IDE bus.
-
-# Choice: ide_reset
-IDE reset on PB Bit 7
-CONFIG_ETRAX_IDE_PB7_RESET
-  Configures the pin used to reset the IDE bus.
-
-USB 1.1 host
-CONFIG_ETRAX_USB_HOST
-  This option enables the host functionality of the ETRAX 100LX
-  built-in USB controller. In host mode the controller is designed
-  for CTRL and BULK traffic only, INTR traffic may work as well
-  however (depending on the requirements of timeliness).
-
-USB 1.1 host port 1 enabled
-CONFIG_ETRAX_USB_HOST_PORT1
-  This option enables port 1 of the ETRAX 100LX USB root hub (RH).
-
-USB 1.1 host port 2 enabled
-CONFIG_ETRAX_USB_HOST_PORT2
-  This option enables port 2 of the ETRAX 100LX USB root hub (RH).
-
-ETRAX 100LX 10/100Mbit Ethernet controller
-CONFIG_ETRAX_ETHERNET
-  This option enables the ETRAX 100LX built-in 10/100Mbit Ethernet
-  controller.
-
-ETRAX 100LX Synchronous serial ports
-CONFIG_ETRAX_SYNCHRONOUS_SERIAL
-  This option enables support for the ETRAX 100LX built-in
-  synchronous serial ports. These ports are used for continuous
-  streamed data like audio. The default setting is compatible
-  with the STA 013 MP3 decoder, but can easily be tuned to fit
-  any other audio encoder/decoder and SPI.
-
-ETRAX 100LX Synchronous serial port 0 enabled
-CONFIG_ETRAX_SYNCHRONOUS_SERIAL_PORT0
-  Enables the ETRAX 100LX synchronous serial port 0 (syncser0).
-
-ETRAX 100LX Synchronous serial port 0 uses DMA
-CONFIG_ETRAX_SYNCHRONOUS_SERIAL0_DMA
-  Makes synchronous serial port 0 use DMA.
-
-ETRAX 100LX Synchronous serial port 1 enabled
-CONFIG_ETRAX_SYNCHRONOUS_SERIAL_PORT1
-  Enables the ETRAX 100LX synchronous serial port 1 (syncser1).
-
-ETRAX 100LX Synchronous serial port 1 uses DMA
-CONFIG_ETRAX_SYNCHRONOUS_SERIAL1_DMA
-  Makes synchronous serial port 1 use DMA.
-
-Delay for drives to regain consciousness
-CONFIG_IDE_DELAY
-  Number of seconds to wait for IDE drives to spin up after an IDE
-  reset.
-
-ARTPEC-1 support
-CONFIG_JULIETTE
-  The ARTPEC-1 is a video-compression chip used in the AXIS 2100
-  network camera, which is built around an ETRAX-100 board.  With this
-  option selected, the ETRAX kernel configures a DMA channel at boot
-  time to talk to the chip.
-
-Axis flash-map support
-CONFIG_ETRAX_AXISFLASHMAP
-  This option enables MTD mapping of flash devices.  Needed to use
-  flash memories.  If unsure, say Y.
-
-Byte-offset of partition table sector
-CONFIG_ETRAX_PTABLE_SECTOR
-  Byte-offset of the partition table in the first flash chip.
-  The default value is 64kB and should not be changed unless
-  you know exactly what you are doing. The only valid reason
-  for changing this is when the flash block size is bigger
-  than 64kB (e.g. when using two parallel 16 bit flashes).
-
-Enable Etrax100 watchdog
-CONFIG_ETRAX_WATCHDOG
-  Enable the built-in watchdog timer support on Etrax100 embedded
-  network computers.
-
-# Choice: crisdebug
-Serial-0
-CONFIG_ETRAX_DEBUG_PORT0
-  Choose a serial port for the ETRAX debug console.  Default to
-  port 0.
-
-Etrax debug port on ser1
-CONFIG_ETRAX_DEBUG_PORT1
-  Use serial port 1 for the console.
-
-Etrax debug port on ser2
-CONFIG_ETRAX_DEBUG_PORT2
-  Use serial port 2 for the console.
-
-Etrax debug port on ser3
-CONFIG_ETRAX_DEBUG_PORT3
-  Use serial port 3 for the console.
-
-No Etrax debug port
-CONFIG_ETRAX_DEBUG_PORT_NULL
-  Disable serial-port debugging.
-
-Parallel port support
-CONFIG_ETRAX_PARPORT
-  Say Y here to enable the ETRAX on-board parallel ports.
-
-Parallel port 0 enabled
-CONFIG_ETRAX_PARALLEL_PORT0
-  Say Y here to enable parallel port 0.
-
-Parallel port 1 enabled
-CONFIG_ETRAX_PARALLEL_PORT1
-  Say Y here to enable parallel port 1.
-
-# Choice: crisrescue
-Select a product rescue port
-CONFIG_ETRAX_RESCUE_SER0
-  Select one of the four serial ports as a rescue port.  The default
-  is port 0.
-
-Serial-1
-CONFIG_ETRAX_RESCUE_SER1
-  Use serial port 1 as the rescue port.
-
-Serial-2
-CONFIG_ETRAX_RESCUE_SER2
-  Use serial port 2 as the rescue port.
-
-Serial-3
-CONFIG_ETRAX_RESCUE_SER3
-  Use serial port 3 as the rescue port.
-
-RIO Hardware Watchdog support
-CONFIG_WATCHDOG_RIO
-  Say Y here to support the hardware watchdog capability on Sun RIO
-  machines.  The watchdog timeout period is normally one minute but
-  can be changed with a boot-time parameter.
-
-CP1XXX Hardware Watchdog support
-CONFIG_WATCHDOG_CP1XXX
-  This is the driver for the hardware watchdog timers present on
-  Sun Microsystems CompactPCI models CP1400 and CP1500.
-
-  This driver is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called cpwatchdog.o. If you want to compile it
-  as a module, say M here and read <file:Documentation/modules.txt>.
-
-  If you do not have a CompactPCI model CP1400 or CP1500, or
-  another UltraSPARC-IIi-cEngine boardset with hardware watchdog,
-  you should say N to this option.
-
-# Choice: ia64type
-Itanium
-CONFIG_ITANIUM
-  Select your IA64 processor type.  The default is Intel Itanium.
-
-McKinley
-CONFIG_MCKINLEY
-  Select this to configure for a McKinley processor.
-
-# Choice: ia64system
-IA-64 system type
-CONFIG_IA64_GENERIC
-  This selects the system type of your hardware.  A "generic" kernel
-  will run on any supported IA-64 system.  However, if you configure
-  a kernel for your specific system, it will be faster and smaller.
-
-  To find out what type of IA-64 system you have, you may want to
-  check the IA-64 Linux web site at <http://www.linux-ia64.org/>.
-  As of the time of this writing, most hardware is DIG compliant,
-  so the "DIG-compliant" option is usually the right choice.
-
-  HP-simulator   For the HP simulator (<http://software.hp.com/ia64linux/>).
-  HP-zx1        For HP zx1 Platforms.
-  SN1            For SGI SN1 Platforms.
-  SN2            For SGI SN2 Platforms.
-  DIG-compliant  For DIG ("Developer's Interface Guide") compliant systems.
-
-  If you don't know what to do, choose "generic".
-
-CONFIG_IA64_HP_ZX1
-  Build a kernel that runs on HP zx1-based systems.  This adds support
-  for the zx1 IOMMU and makes root bus bridges appear in PCI config space
-  (required for zx1 agpgart support).
-
-# Choice: pagesize
-Kernel page size
-CONFIG_IA64_PAGE_SIZE_4KB
-  This lets you select the page size of the kernel.  For best IA-64
-  performance, a page size of 8KB or 16KB is recommended.  For best
-  IA-32 compatibility, a page size of 4KB should be selected (the vast
-  majority of IA-32 binaries work perfectly fine with a larger page
-  size).  For Itanium systems, do NOT chose a page size larger than
-  16KB.
-
-  4KB                For best IA-32 compatibility
-  8KB                For best IA-64 performance
-  16KB               For best IA-64 performance
-  64KB               Not for Itanium.
-
-  If you don't know what to do, choose 8KB.
-
-Enable Itanium B-step specific code
-CONFIG_ITANIUM_BSTEP_SPECIFIC
-  Select this option to build a kernel for an Itanium prototype system
-  with a B-step CPU.  Only B3 step CPUs are supported.  You have a B3-step
-  CPU if the "revision" field in /proc/cpuinfo is equal to 4.  If the
-  "revision" field shows a number bigger than 4, you do not have to turn
-  on this option.
-
-Enable IA-64 Machine Check Abort
-CONFIG_IA64_MCA
-  Say Y here to enable machine check support for IA-64.  If you're
-  unsure, answer Y.
-
-Disable IA-64 Virtual Hash Page Table
-CONFIG_DISABLE_VHPT
-  The Virtual Hash Page Table (VHPT) enhances virtual address
-  translation performance.  Normally you want the VHPT active but you
-  can select this option to disable the VHPT for debugging.  If you're
-  unsure, answer N.
-
-Turn on compare-and-exchange bug checking (slow!)
-CONFIG_IA64_DEBUG_CMPXCHG
-  Selecting this option turns on bug checking for the IA64
-  compare-and-exchange instructions.  This is slow!  Itaniums
-  from step B3 or later don't have this problem. If you're unsure,
-  select N.
-
-IA64 IRQ bug checking
-CONFIG_IA64_DEBUG_IRQ
-  Selecting this option turns on bug checking for the IA64 irq_save
-  and restore instructions.  It's useful for tracking down spinlock
-  problems, but slow!  If you're unsure, select N.
-
-Early printk support (requires VGA!)
-CONFIG_IA64_EARLY_PRINTK
-  Selecting this option uses the VGA screen for printk() output before
-  the consoles are initialised.  It is useful for debugging problems
-  early in the boot process, but only if you have a VGA screen
-  attached.  If you're unsure, select N.
-
-Print possible IA64 hazards to console
-CONFIG_IA64_PRINT_HAZARDS
-  Selecting this option prints more information for Illegal Dependency
-  Faults, that is, for Read after Write, Write after Write or Write
-  after Read violations.  If you're unsure, select Y.
-
-Performance monitor support
-CONFIG_PERFMON
-  Selects whether support for the IA-64 performance monitor hardware
-  is included in the kernel.  This makes some kernel data-structures a
-  little bigger and slows down execution a bit, but it is still
-  usually a good idea to turn this on.  If you're unsure, say N.
-
-/proc/pal support
-CONFIG_IA64_PALINFO
-  If you say Y here, you are able to get PAL (Processor Abstraction
-  Layer) information in /proc/pal.  This contains useful information
-  about the processors in your systems, such as cache and TLB sizes
-  and the PAL firmware version in use.
-
-  To use this option, you have to check that the "/proc file system
-  support" (CONFIG_PROC_FS) is enabled, too.
-
-/proc/efi/vars support
-CONFIG_EFI_VARS
-  If you say Y here, you are able to get EFI (Extensible Firmware
-  Interface) variable information in /proc/efi/vars.  You may read,
-  write, create, and destroy EFI variables through this interface.
-
-  To use this option, you have to check that the "/proc file system
-  support" (CONFIG_PROC_FS) is enabled, too.
-
-Kernel support for IA-32 emulation
-CONFIG_IA32_SUPPORT
-  IA64 processors can run IA32 (that is, x86) binaries by emulating
-  the IA32 instruction set.  Say Y here to build in kernel support for
-  this.  If in doubt, say Y.
-
-Physical memory granularity (16 MB)
-CONFIG_IA64_GRANULE_16MB
-  IA64 identity-mapped regions use a large page size.  We'll call such
-  large pages "granules".  If you can think of a better name that's
-  unambiguous, let us know...  Unless your identity-mapped regions are
-  very large, select a granule size of 16MB.
-
-Physical memory granularity (64 MB)
-CONFIG_IA64_GRANULE_64MB
-  IA64 identity-mapped regions use a large page size.  We'll call such
-  large pages "granules".  If you can think of a better name that's
-  unambiguous, let us know...  Unless your identity-mapped regions are
-  very large, select a granule size of 16MB.  (This is the "large" choice.)
-
-Enable SGI SN extra debugging code
-CONFIG_IA64_SGI_SN_DEBUG
-  Turns on extra debugging code in the SGI SN (Scalable NUMA) platform
-  for IA64.  Unless you are debugging problems on an SGI SN IA64 box,
-  say N.
-
-Enable SGI Medusa Simulator Support
-CONFIG_IA64_SGI_SN_SIM
-  If you are compiling a kernel that will run under SGI's IA64
-  simulator (Medusa) then say Y, otherwise say N.
-
-PCIBA Support
-CONFIG_PCIBA
-  IRIX PCIBA-inspired user mode PCI interface for the SGI SN (Scalable
-  NUMA) platform for IA64.  Unless you are compiling a kernel for an              SGI SN IA64 box, say N.
-
-Enable protocol mode for the L1 console
-SERIAL_SGI_L1_PROTOCOL
-  Uses protocol mode instead of raw mode for the level 1 console on the
-  SGI SN (Scalable NUMA) platform for IA64.  If you are compiling for
-  an SGI SN box then Y is the recommended value, otherwise say N.
-
-Directly Connected Compact Flash support
-CONFIG_CF_ENABLER
-  Compact Flash is a small, removable mass storage device introduced
-  in 1994 originally as a PCMCIA device.  If you say `Y' here, you
-  compile in support for Compact Flash devices directly connected to
-  a SuperH processor.  A Compact Flash FAQ is available at
-  <http://www.compactflash.org/faqs/faq.htm>.
-
-  If your board has "Directly Connected" CompactFlash at area 5 or 6,
-  you may want to enable this option.  Then, you can use CF as
-  primary IDE drive (only tested for SanDisk).
-
-  If in doubt, select 'N'.
-
-Kernel debugging
-CONFIG_DEBUG_KERNEL
-  Say Y here if you are developing drivers or trying to debug and
-  identify kernel problems.
-
-Debug memory allocations
-CONFIG_DEBUG_SLAB
-  Say Y here to have the kernel do limited verification on memory
-  allocation as well as poisoning memory on free to catch use of freed
-  memory.
-
-Memory mapped I/O debugging
-CONFIG_DEBUG_IOVIRT
-  Say Y here to get warned whenever an attempt is made to do I/O on
-  obviously invalid addresses such as those generated when ioremap()
-  calls are forgotten.  Memory mapped I/O will go through an extra
-  check to catch access to unmapped ISA addresses, an access method
-  that can still be used by old drivers that are being ported from
-  2.0/2.2.
-
-Spinlock debugging
-CONFIG_DEBUG_SPINLOCK
-  Say Y here and build SMP to catch missing spinlock initialization
-  and certain other kinds of spinlock errors commonly made.  This is
-  best used in conjunction with the NMI watchdog so that spinlock
-  deadlocks are also debuggable.
-
-Read-write spinlock debugging
-CONFIG_DEBUG_RWLOCK
-  If you say Y here then read-write lock processing will count how many
-  times it has tried to get the lock and issue an error message after
-  too many attempts.  If you suspect a rwlock problem or a kernel
-  hacker asks for this option then say Y.  Otherwise say N.
-
-Semaphore debugging
-CONFIG_DEBUG_SEMAPHORE
-  If you say Y here then semaphore processing will issue lots of
-  verbose debugging messages.  If you suspect a semaphore problem or a
-  kernel hacker asks for this option then say Y.  Otherwise say N.
-
-Verbose BUG() reporting (adds 70K)
-CONFIG_DEBUG_BUGVERBOSE
-  Say Y here to make BUG() panics output the file name and line number
-  of the BUG call as well as the EIP and oops trace.  This aids
-  debugging but costs about 70-100K of memory.
-
-Include kgdb kernel debugger
-CONFIG_KGDB
-  Include in-kernel hooks for kgdb, the Linux kernel source level
-  debugger.  This project has a web page at
-  <http://kgdb.sourceforge.net/>.
-
-Include xmon kernel debugger
-CONFIG_XMON
-  Include in-kernel hooks for the xmon kernel monitor/debugger
-  supported by the PPC port.
-
-Include BDI2000 debugger support
-CONFIG_BDI_SWITCH
-  Include in-kernel support for the Abatron BDI2000 debugger.  To
-  learn more about the Abatron BDI2000, visit the web page at
-  <http://www.abatron.ch/>.
-
-Add additional CFLAGS to the kernel build
-CONFIG_MORE_COMPILE_OPTIONS
-  If you want to add additional CFLAGS to the kernel build, such as
-  -g for KGDB, XMON or the BDI2000, enable this option and then
-  enter what you would like to add in the next question.
-
-Include kgdb kernel debugger
-CONFIG_KWDB
-  Include in-kernel hooks for kdb, the source level debugger for the
-  PA-RISC port.
-
-IODC console
-CONFIG_IODC_CONSOLE
-  IODC is HP's pre-PCI standard for device identification (a la PCI
-  vendor, device IDs), detection, configuration, initialization and so
-  on.  It also can provide firmware function to do the actual IO,
-  which are slow, not really defined for runtime usage and generally
-  not desirable.
-
-  See <http://www.linuxhq.com/kernel/v2.4/doc/parisc/IODC.txt.html>
-  for the gory details.
-
-  Say Y here to enable use of the IODC firmware functions for console
-  I/O.  This is only useful on older PA-RISC workstations.  If in
-  doubt, say Y.
-
-U2/Uturn I/O MMU
-CONFIG_IOMMU_CCIO
-  Say Y here to enable DMA management routines for the first
-  generation of PA-RISC cache-coherent machines.  Programs the
-  U2/Uturn chip in "Virtual Mode" and use the I/O MMU.
-
-LBA/Elroy PCI support
-CONFIG_PCI_LBA
-  Say Y here to give the PA-RISC kernel access to PCI configuration
-  and IO-port space on PA-RISC workstations equipped with a Lower Bus
-  Adapter (LBA).  This includes A, B, C, J, L, and N-class machines
-  with 4-digit model numbers, also the A300.
-
-LASI I/O support
-CONFIG_GSC_LASI
-  Say Y here to directly support the LASI controller chip found on
-  PA-RISC workstations.  Linux-oriented documentation for this chip
-  can be found at <http://www.parisc-linux.org/documentation/>.
-
-LASI/ASP builtin parallel-port
-CONFIG_PARPORT_GSC
-  Say Y here to build in low-level parallel-support for PC-style
-  hardware integrated in the LASI-Controller (on the GSC Bus) for
-  HP-PARISC workstations.
-
-Fujitsu Vendor Specific
-CONFIG_BLK_DEV_IDEDISK_FUJITSU
-  Enable vendor-specific code for Fujitsu IDE disks.  Unless you are
-  the IDE maintainer, you probably do not want to mess with this.
-
-IBM Vendor Specific
-CONFIG_BLK_DEV_IDEDISK_IBM
-  Enable vendor-specific code for IBM IDE disks.  Unless you are the
-  IDE maintainer, you probably do not want to mess with this.
-
-Maxtor Vendor Specific
-CONFIG_BLK_DEV_IDEDISK_MAXTOR
-  Enable vendor-specific code for Maxtor IDE disks.  Unless you are
-  the IDE maintainer, you probably do not want to mess with this.
-
-Quantum Vendor Specific
-CONFIG_BLK_DEV_IDEDISK_QUANTUM
-  Enable vendor-specific code for Quantum IDE disks.  Unless you are
-  the IDE maintainer, you probably do not want to mess with this.
-
-Seagate Vendor Specific
-CONFIG_BLK_DEV_IDEDISK_SEAGATE
-  Enable vendor-specific code for Seagate IDE disks.  Unless you are
-  the IDE maintainer, you probably do not want to mess with this.
-
-Western Digital Vendor Specific
-CONFIG_BLK_DEV_IDEDISK_WD
-  Enable vendor-specific code for Western Digital IDE disks.  Unless
-  you are the IDE maintainer, you probably do not want to mess with
-  this.
-
-TiVo Commerial Application Specific
-CONFIG_BLK_DEV_TIVO
-  Enable vendor-specific code for TiVo IDE disks.  Unless you are the
-  IDE maintainer, you probably do not want to mess with this.
-
-# Choice: superhsys
-Generic
-CONFIG_SH_GENERIC
-  Select Generic if configuring for a generic SuperH system.
-  The "generic" option compiles in *all* the possible hardware
-  support and relies on the sh_mv= kernel command option to choose
-  at runtime which routines to use.  "MV" stands for "machine vector";
-  each of the machines below is described by a machine vector.
-
-  Select SolutionEngine if configuring for a Hitachi SH7709
-  or SH7750/7750S evaluation board.
-
-  Select Overdrive if configuring for a ST407750 Overdrive board.
-  More information at
-  <http://linuxsh.sourceforge.net/docs/7750overdrive.php3>.
-
-  Select HP620 if configuring for a HP Jornada HP620.
-  More information (hardware only) at
-  <http://www.hp.com/jornada/>.
-
-  Select HP680 if configuring for a HP Jornada HP680.
-  More information (hardware only) at
-  <http://www.hp.com/jornada/products/680/>.
-
-  Select HP690 if configuring for a HP Jornada HP690.
-  More information (hardware only) at
-  <http://www.hp.com/jornada/products/680/>.
-
-  Select CqREEK if configuring for a CqREEK SH7708 or SH7750.
-  More information at
-  <http://sources.redhat.com/ecos/hardware.html#SuperH>.
-
-  Select DMIDA if configuring for a DataMyte 4000 Industrial
-  Digital Assistant. More information at <http://www.dmida.com/>.
-
-  Select EC3104 if configuring for a system with an Eclipse
-  International EC3104 chip, e.g. the Harris AD2000 or Compaq Aero 8000.
-
-  Select Dreamcast if configuring for a SEGA Dreamcast.
-  More information at
-  <http://www.m17n.org/linux-sh/dreamcast/>.  There is a
-  Dreamcast project is at <http://linuxdc.sourceforge.net/>.
-
-  Select BareCPU if you know what this means, and it applies
-  to your system.
-
-# These may have to be merged in when we go to CML2:
-#  - "SolutionEngine7751" for Hitachi SolutionEngine (7751)
-#  - "STB1_Harp" for STMicroelectronics HARP
-#  - "CqREEK" for CQ Publishing CqREEK SH-4
-#  - "CAT68701" for CAT 68701 Evaluation Board (SH7708)
-#  - "BigSur" for Big Sur Evaluation Board
-#  - "SH2000" for SH2000 Evaluation Board (SH7709A)
-#  - "ADX" for A&D ADX
-
-SolutionEngine
-CONFIG_SH_SOLUTION_ENGINE
-  Select SolutionEngine if configuring for a Hitachi SH7709
-  or SH7750 evaluation board.
-
-7751 SolutionEngine
-CONFIG_SH_7751_SOLUTION_ENGINE
-  Select 7751 SolutionEngine if configuring for a Hitachi SH7751
-  evaluation board.
-
-Overdrive
-CONFIG_SH_OVERDRIVE
-  Select Overdrive if configuring for a ST407750 Overdrive board.
-  More information at
-  <http://linuxsh.sourceforge.net/docs/7750overdrive.php3>.
-
-HP620
-CONFIG_SH_HP620
-  Select HP620 if configuring for a HP jornada HP620.
-  More information (hardware only) at
-  <http://www.hp.com/jornada/>.
-
-HP680
-CONFIG_SH_HP680
-  Select HP680 if configuring for a HP Jornada HP680.
-  More information (hardware only) at
-  <http://www.hp.com/jornada/products/680/>.
-
-HP690
-CONFIG_SH_HP690
-  Select HP690 if configuring for a HP Jornada HP690.
-  More information (hardware only)
-  at <http://www.hp.com/jornada/products/680/>.
-
-CqREEK
-CONFIG_SH_CQREEK
-  Select CqREEK if configuring for a CqREEK SH7708 or SH7750.
-  More information at
-  <http://sources.redhat.com/ecos/hardware.html#SuperH>.
-
-DMIDA
-CONFIG_SH_DMIDA
-  Select DMIDA if configuring for a DataMyte 4000 Industrial
-  Digital Assistant. More information at <http://www.dmida.com/>.
-
-EC3104
-CONFIG_SH_EC3104
-  Select EC3104 if configuring for a system with an Eclipse
-  International EC3104 chip, e.g. the Harris AD2000.
-
-Dreamcast
-CONFIG_SH_DREAMCAST
-  Select Dreamcast if configuring for a SEGA Dreamcast.
-  More information at
-  <http://www.m17n.org/linux-sh/dreamcast/>.  There is a
-  Dreamcast project is at <http://linuxdc.sourceforge.net/>.
-
-BareCPU
-CONFIG_SH_UNKNOWN
-  "Bare CPU" aka "unknown" means an SH-based system which is not one
-  of the specific ones mentioned above, which means you need to enter
-  all sorts of stuff like CONFIG_MEMORY_START because the config
-  system doesn't already know what it is.  You get a machine vector
-  without any platform-specific code in it, so things like the RTC may
-  not work.
-
-  This option is for the early stages of porting to a new machine.
-
-# Choice: superhtype
-SH7707
-CONFIG_CPU_SUBTYPE_SH7707
-  Select the type of SuperH processor you have. This information is
-  used for optimizing and configuration purposes.
-
-  Select SH7707 if you have a  60 Mhz SH-3 HD6417707 CPU.
-
-  Select SH7708 if you have a  60 Mhz SH-3 HD6417708S or
-                if you have a 100 Mhz SH-3 HD6417708R CPU.
-
-  Select SH7709 if you have a  80 Mhz SH-3 HD6417709 CPU.
-
-  Select SH7750 if you have a 200 Mhz SH-4 HD6417750 CPU.
-
-  Select SH7751 if you have a SH7751
-
-  Select ST40STB1 if you have a ST40STB1
-
-SH7708
-CONFIG_CPU_SUBTYPE_SH7708
-  Select SH7708 if you have a  60 Mhz SH-3 HD6417708S or
-                if you have a 100 Mhz SH-3 HD6417708R CPU.
-
-SH7709
-CONFIG_CPU_SUBTYPE_SH7709
-  Select SH7709 if you have a  80 Mhz SH-3 HD6417709 CPU.
-
-SH7750
-CONFIG_CPU_SUBTYPE_SH7750
-  Select SH7750 if you have a 200 Mhz SH-4 HD6417750 CPU.
-
-Physical memory start address
-CONFIG_MEMORY_START
-  Computers built with Hitachi SuperH processors always
-  map the ROM starting at address zero.  But the processor
-  does not specify the range that RAM takes.  
-
-  The physical memory (RAM) start address will be automatically
-  set to 08000000, unless you selected one of the following
-  processor types: SolutionEngine, Overdrive, HP620, HP680, HP690,
-  in which case the start address will be set to 0c000000.
-
-  Tweak this only when porting to a new machine which is not already
-  known by the config system.  Changing it from the known correct
-  value on any of the known systems will only lead to disaster.
-
-Hitachi HD64461 companion chip support
-CONFIG_HD64461
-  The Hitachi HD64461 provides an interface for
-  the SH7709 CPU, supporting a LCD controller,
-  CRT color controller, IrDA up to 4 Mbps, and a
-  PCMCIA controller supporting 2 slots.
-
-  More information is available at
-  <http://semiconductor.hitachi.com/windowsce/superh/sld013.htm>.
-
-  Say Y if you want support for the HD64461.
-  Otherwise, say N.
-
-HD64461 PCMCIA enabler
-CONFIG_HD64461_ENABLER
-  Say Y here if you want to enable PCMCIA support
-  via the HD64461 companion chip.
-  Otherwise, say N.
-
-HD64461 virtualized IRQ number
-CONFIG_HD64461_IRQ
-  The default setting of the HD64461 IRQ is 36.
-
-  Do not change this unless you know what you are doing.
-
-Hitachi HD64465 companion chip support
-CONFIG_HD64465
-  The Hitachi HD64465 provides an interface for
-  the SH7750 CPU, supporting a LCD controller,
-  CRT color controller, IrDA, USB, PCMCIA,
-  keyboard controller, and a printer interface.
-
-  More information is available at
-  <http://global.hitachi.com/New/cnews/E/1998/981019B.html>.
-
-  Say Y if you want support for the HD64465.
-  Otherwise, say N.
-
-HD64465 virtualized IRQ number
-CONFIG_HD64465_IRQ
-  The default setting of the HD64465 IRQ is 5.
-
-  Do not change this unless you know what you are doing.
-
-HD64465 start address
-CONFIG_HD64465_IOBASE
-  The default setting of the HD64465 IO base address is 0xb0000000.
-
-  Do not change this unless you know what you are doing.
-  
-Early printk support
-CONFIG_SH_EARLY_PRINTK
-  Say Y here to redirect kernel printk messages to the serial port
-  used by the SH-IPL bootloader, starting very early in the boot
-  process and ending when the kernel's serial console is initialised.
-  This option is only useful porting the kernel to a new machine,
-  when the kernel may crash or hang before the serial console is
-  initialised. If unsure, say N.
-
-SuperH SCI (serial) support
-CONFIG_SH_SCI
-  Selecting this option will allow the Linux kernel to transfer data
-  over SCI (Serial Communication Interface) and/or SCIF (Serial
-  Communication Interface with FIFO) which are built into the Hitachi
-  SuperH processor.  The option provides 1 to 3 (depending
-  on the CPU model) standard Linux tty devices, /dev/ttySC[012]; one
-  of these is normally used as the system console.
-
-  If in doubt, press "y".
-
-Use LinuxSH standard BIOS
-CONFIG_SH_STANDARD_BIOS
-  Say Y here if your target has the gdb-sh-stub
-  package from www.m17n.org (or any conforming standard LinuxSH BIOS)
-  in FLASH or EPROM.  The kernel will use standard BIOS calls during
-  boot for various housekeeping tasks (including calls to read and
-  write characters to a system console, get a MAC address from an
-  on-board Ethernet interface, and shut down the hardware).  Note this
-  does not work with machines with an existing operating system in
-  mask ROM and no flash (WindowsCE machines fall in this category).
-  If unsure, say N.
-
-GDB Stub kernel debug
-CONFIG_DEBUG_KERNEL_WITH_GDB_STUB
-  If you say Y here, it will be possible to remotely debug the SuperH
-  kernel using gdb, if you have the gdb-sh-stub package from
-  www.m17n.org (or any conforming standard LinuxSH BIOS) in FLASH or
-  EPROM.  This enlarges your kernel image disk size by several
-  megabytes but allows you to load, run and debug the kernel image
-  remotely using gdb.  This is only useful for kernel hackers.  If
-  unsure, say N.
-
-Console output to GDB
-CONFIG_GDB_CONSOLE
-  If you are using GDB for remote debugging over a serial port and
-  would like kernel messages to be formatted into GDB $O packets so
-  that GDB prints them as program output, say 'Y'.
-
-802.1Q VLAN Support
-CONFIG_VLAN_8021Q
-  Select this and you will be able to create 802.1Q VLAN interfaces on your
-  ethernet interfaces.  802.1Q VLAN supports almost everything a regular
-  ethernet interface does, including firewalling, bridging, and of course
-  IP traffic.  You will need the 'vconfig' tool from the VLAN project in
-  order to effectively use VLANs.  See the VLAN web page for more
-  information:  <http://www.candelatech.com/~greear/vlan.html>  If unsure,
-  you can safely say 'N'.
-
-ARC console support
-CONFIG_ARC_CONSOLE
-  Support for the PROM-based console on MIPS machines built according
-  to the Advanced Risc Computing specification, which is now (2001)
-  dead.  These included boxes from Deskstation, Acer, Olivetti and
-  NEC.  There is a history at <http://www.openbsd.org/arc.html>.
-
-AUTCPU12
-CONFIG_ARCH_AUTCPU12
-  Say Y if you intend to run the kernel on the autronix autcpu12
-  board. This board is based on a Cirrus Logic CS89712.
-
-IT8172 IDE support
-CONFIG_BLK_DEV_IT8172
-  Say Y here to support the on-board IDE controller on the Integrated
-  Technology Express, Inc. ITE8172 SBC.  Vendor page at
-  <http://www.ite.com.tw/ia/brief_it8172bsp.htm>; picture of the
-  board at <http://www.mvista.com/allies/semiconductor/ite.html>.
-
-Support ARM926T processor
-CONFIG_CPU_ARM926T
-  This is a variant of the ARM920.  It has slightly different
-  instruction sequences for cache and TLB operations.  Curiously,
-  there is no documentation on it at the ARM corporate website.
-
-  Say Y if you want support for the ARM926T processor.
-  Otherwise, say N.
-
-Support CPU clock change (EXPERIMENTAL)
-CONFIG_CPU_FREQ
-  CPU clock scaling allows you to change the clock speed of the
-  running CPU on the fly. This is a nice method to save battery power,
-  because the lower the clock speed, the less power the CPU
-  consumes. Note that this driver doesn't automatically change the CPU
-  clock speed, you need some userland tools (which still have to be
-  written) to implement the policy. If you don't understand what this
-  is all about, it's safe to say 'N'.
-
-SiS
-CONFIG_DRM_SIS
-  Choose this option if you have a SIS graphics card. AGP support is
-  required for this driver to work.
-
-Etrax Ethernet slave support (over lp0/1)
-CONFIG_ETRAX_ETHERNET_LPSLAVE
-  This option enables a slave ETRAX 100 or ETRAX 100LX, connected to a
-  master ETRAX 100 or ETRAX 100LX through par0 and par1, to act as an
-  Ethernet controller.
-
-Slave has its own LEDs
-CONFIG_ETRAX_ETHERNET_LPSLAVE_HAS_LEDS
-  Enable if the slave has it's own LEDs.
-
-ATA/IDE support
-CONFIG_ETRAX_IDE
-  Enable this to get support for ATA/IDE.  You can't use parallel
-  ports or SCSI ports at the same time.
-
-LED on when link
-CONFIG_ETRAX_NETWORK_LED_ON_WHEN_LINK
-
-  Selecting LED_on_when_link will light the LED when there is a
-  connection and will flash off when there is activity.
-
-  Selecting LED_on_when_activity will light the LED only when
-  there is activity.
-
-  This setting will also affect the behaviour of other activity LEDs
-  e.g. Bluetooth.
-
-Power button bit on port G
-CONFIG_ETRAX_POWERBUTTON_BIT
-  Configure where power button is connected.
-
-Root device name
-CONFIG_ETRAX_ROOT_DEVICE
-  Specifies the device that should be mounted as root file system
-  when booting from flash. The axisflashmap driver adds an additional
-  mtd partition for the appended root file system image, so this option
-  should normally be the mtdblock device for the partition after the
-  last partition in the partition table.
-
-Serial port 0 enabled
-CONFIG_ETRAX_SERIAL_PORT0
-  Enables the ETRAX 100 serial driver for ser0 (ttyS0)
-  Normally you want this on, unless you use external DMA 1 that uses
-  the same DMA channels.
-
-Shutdown bit on port CSP0
-CONFIG_ETRAX_SHUTDOWN_BIT
-  Configure what pin on CSPO-port that is used for controlling power
-  supply.
-
-Software Shutdown Support
-CONFIG_ETRAX_SOFT_SHUTDOWN
-  Enable this if Etrax is used with a power-supply that can be turned
-  off and on with PS_ON signal. Gives the possibility to detect
-  powerbutton and then do a power off after unmounting disks.
-
-Disable watchdog during Oops printouts
-CONFIG_ETRAX_WATCHDOG_NICE_DOGGY
-  By enabling this you make sure that the watchdog does not bite while
-  printing oopses. Recommended for development systems but not for
-  production releases.
-
-Compaq iPAQ Handheld sleeve support
-CONFIG_H3600_SLEEVE
-  Choose this option to enable support for extension packs (sleeves)
-  for the Compaq iPAQ H3XXX series of handheld computers.  This option
-  is required for the CF, PCMCIA, Bluetooth and GSM/GPRS extension
-  packs.
-
-AVM Fritz!Card PCI/PCIv2/PnP support (EXPERIMENTAL)
-CONFIG_HISAX_FRITZ_PCIPNP
-  This enables the driver for the AVM Fritz!Card PCI, Fritz!Card PCI v2
-  and Fritz!Card PnP.
-  (the latter also needs you to select "ISA Plug and Play support"
-  from the menu "Plug and Play configuration")
-
-IBM PCI Hotplug driver
-CONFIG_HOTPLUG_PCI_IBM
-  Say Y here if you have a motherboard with a IBM PCI Hotplug
-  controller.
-
-  This code is also available as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want).
-  The module will be called cpqphp.o. If you want to compile it
-  as a module, say M here and read Documentation/modules.txt.
-
-  When in doubt, say N.
-
-Enable autotest (llsc). Option to run cache test instead of booting
-CONFIG_IA64_SGI_AUTOTEST
-  Build a kernel used for hardware validation. If you include the
-  keyword "autotest" on the boot command line, the kernel does NOT boot.
-  Instead, it starts all cpus and runs cache coherency tests instead.
-
-  If unsure, say N.
-
-IEC61883-6 (Audio transmission) support
-CONFIG_IEEE1394_AMDTP
-  This option enables the Audio & Music Data Transmission Protocol
-  (IEC61883-6) driver, which implements audio transmission over
-  IEEE1394.
-
-  The userspace interface is documented in amdtp.h.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt.  The module
-  will be called amdtp.o.
-
-IEC61883-1 Plug support
-CONFIG_IEEE1394_CMP
-  This option enables the Connection Management Procedures
-  (IEC61883-1) driver, which implements input and output plugs.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt.  The module
-  will be called cmp.o.
-
-OHCI-DV I/O support
-CONFIG_IEEE1394_DV1394
-  This driver allows you to transmit and receive DV (digital video)
-  streams on an OHCI-1394 card using a simple frame-oriented
-  interface.
-
-  The user-space API for dv1394 is documented in dv1394.h.
-
-  If you want to compile this as a module ( = code which can be
-  inserted in and removed from the running kernel whenever you want),
-  say M here and read Documentation/modules.txt.  The module
-  will be called dv1394.o.
-
-Ethernet over 1394
-CONFIG_IEEE1394_ETH1394
-  Extremely Experimental! This driver is a Linux specific way to use your
-  IEEE1394 Host as an Ethernet type device. This is _NOT_ IP1394.
-
-Support for older IT8172 (Rev C)
-CONFIG_IT8172_REVC
-  Say Y here to support the older, Revision C version of the Integrated
-  Technology Express, Inc. ITE8172 SBC.  Vendor page at
-  <http://www.ite.com.tw/ia/brief_it8172bsp.htm>; picture of the
-  board at <http://www.mvista.com/allies/semiconductor/ite.html>.
-
-Enable Smart Card Reader 0 Support
-CONFIG_IT8172_SCR0
-  Say Y here to support smart-card reader 0 (SCR0) on the Integrated
-  Technology Express, Inc. ITE8172 SBC.  Vendor page at
-  <http://www.ite.com.tw/ia/brief_it8172bsp.htm>; picture of the
-  board at <http://www.mvista.com/allies/semiconductor/ite.html>.
-
-Enable Smart Card Reader 1 Support
-CONFIG_IT8172_SCR1
-  Say Y here to support smart-card reader 1 (SCR1) on the Integrated
-  Technology Express, Inc. ITE8172 SBC.  Vendor page at
-  <http://www.ite.com.tw/ia/brief_it8172bsp.htm>; picture of the
-  board at <http://www.mvista.com/allies/semiconductor/ite.html>.
-
-IT8172 IDE Tuning support
-CONFIG_IT8172_TUNING
-  Say Y here to support tuning the ITE8172's IDE interface.  This makes
-  it possible to set DMA channel or PIO opration and the transfer rate.
-
-Enable protocol mode for the L1 console
-CONFIG_SERIAL_SGI_L1_PROTOCOL
-  Uses protocol mode instead of raw mode for the level 1 console on the
-  SGI SN (Scalable NUMA) platform for IA64.  If you are compiling for
-  an SGI SN box then Y is the recommended value, otherwise say N.
-
-New bus configuration (EXPERIMENTAL)  
-CONFIG_TULIP_MWI
-  This configures your Tulip card specifically for the card and
-  system cache line size type you are using.
-
-  This is experimental code, not yet tested on many boards.
-
-  If unsure, say N.
-
-NatSemi SCx200 support
-CONFIG_SCx200
-  This provides basic support for the National Semiconductor SCx200
-  processor.  Right now this is just a driver for the GPIO pins.
-
-  If you don't know what to do here, say N.
-
-  This support is also available as a module.  If compiled as a
-  module, it will be called scx200.o.
-
-NatSemi SCx200 Watchdog
-CONFIG_SCx200_WDT
-  Enable the built-in watchdog timer support on the National 
-  Semiconductor SCx200 processors.
-
-  If compiled as a module, it will be called scx200_watchdog.o.
-
-Flash device mapped with DOCCS on NatSemi SCx200
-CONFIG_MTD_SCx200_DOCFLASH
-  Enable support for a flash chip mapped using the DOCCS signal on a
-  National Semiconductor SCx200 processor.
-
-  If you don't know what to do here, say N.
-
-  If compiled as a module, it will be called scx200_docflash.o.
-
-NatSemi SCx200 I2C using GPIO pins
-CONFIG_SCx200_GPIO
-  Enable the use of two GPIO pins of a SCx200 processor as an I2C bus.
-
-  If you don't know what to do here, say N.
-
-  If compiled as a module, it will be called scx200_i2c.o.
-
-GPIO pin used for SCL
-CONFIG_SCx200_I2C_SCL
-  Enter the GPIO pin number used for the SCL signal.  This value can
-  also be specified with a module parameter.
-
-GPIO pin used for SDA
-CONFIG_SCx200_I2C_SDA
-  Enter the GPIO pin number used for the SSA signal.  This value can
-  also be specified with a module parameter.
-
-NatSemi SCx200 ACCESS.bus
-CONFIG_SCx200_ACB
-  Enable the use of the ACCESS.bus controllers of a SCx200 processor.
-
-  If you don't know what to do here, say N.
-
-  If compiled as a module, it will be called scx200_acb.o.
-
-IPMI top-level message handler
-CONFIG_IPMI_HANDLER
-  This enables the central IPMI message handler, required for IPMI
-  to work.  Note that you must have this enabled to do any other IPMI
-  things.
-
-  IPMI is a standard for managing sensors (temperature,
-  voltage, etc.) in a system.
-
-  See Documentation/IPMI.txt for more details on the driver.
-
-  If unsure, say N.
-
-Generate a panic event to all BMCs on a panic
-CONFIG_IPMI_PANIC_EVENT
-  When a panic occurs, this will cause the IPMI message handler to
-  generate an IPMI event describing the panic to each interface
-  registered with the message handler.
-
-Device interface for IPMI
-CONFIG_IPMI_DEVICE_INTERFACE
-  This provides an IOCTL interface to the IPMI message handler so
-  userland processes may use IPMI.  It supports poll() and select().
-
-IPMI KCS handler
-CONFIG_IPMI_KCS
-  Provides a driver for a KCS-style interface to a BMC.
-
-IPMI Watchdog Timer
-CONFIG_IPMI_WATCHDOG
-  This enables the IPMI watchdog timer.
-
-#
-# A couple of things I keep forgetting:
-#   capitalize: AppleTalk, Ethernet, DOS, DMA, FAT, FTP, Internet,
-#               Intel, IRQ, ISDN, Linux, MSDOS, NetWare, NetWinder,
-#               NFS, PCI, SCSI, SPARC
-#   two words:  file system, hard drive, hard disk, home page,
-#               user space, web site
-#   other:      it's safe to save; daemon; use --, not - or ---;
-#               use KB for 1024 bytes, not kB or K.
-#
-#
-# This is used by Emacs' spell checker ispell.el:
-#
-# LocalWords:  CONFIG coprocessor DX Pentium SX lilo loadlin HOWTO ftp ibiblio
-# LocalWords:  unc edu docs emu README kB BLK DEV FD Thinkpad fd MFM RLL IDE gz
-# LocalWords:  cdrom diskless netboot nfs xzvf ATAPI MB ide pavia rubini pl pd
-# LocalWords:  HD CD-ROMs IDECD NEC MITSUMI filesystem XT XD PCI BIOS cezar ATEN
-# LocalWords:  ISA EISA Microchannel VESA BIOSes IPC SYSVIPC ipc Ctrl dmesg hlt
-# LocalWords:  BINFMT Linkable http ac uk jo html GCC SPARC AVANTI CABRIOLET EB
-# LocalWords:  netscape gcc LD CC toplevel MODVERSIONS insmod rmmod modprobe IP
-# LocalWords:  genksyms INET loopback gatewaying Ethernet PPP ARP Arp MEMSIZE
-# LocalWords:  howto multicasting MULTICAST MBONE firewalling ipfw ACCT resp ip
-# LocalWords:  proc acct IPIP encapsulator decapsulator klogd RARP EXT PS
-# LocalWords:  telnetting subnetted NAGLE rlogin NOSR ttyS TGA techinfo mbone nl
-# LocalWords:  Mb SKB IPX Novell dosemu DDP ATALK vmalloc visar ehome
-# LocalWords:  SD CHR scsi thingy SG CD LUNs LUN jukebox Adaptec BusLogic EATA
-# LocalWords:  buslogic DMA DPT ATT eata dma PIO UltraStor fdomain umsdos ext
-# LocalWords:  QLOGIC qlogic TMC seagate Trantor ultrastor FASST wd NETDEVICES
-# LocalWords:  unix BBS linux CSLIP PLIP Kirch's LDP CSlip SL SCC IRQ csustan
-# LocalWords:  Turbo Laplink plip NCSA port's ReQuest IRQs EQL SMC AMD PCnet NE
-# LocalWords:  COM ELPLUS Com EtherLinkIII VLB Arcnet Cabletron DEPCA DE carlos
-# LocalWords:  depca EtherWorks EWRK ewrk SEEQ EtherExpress EEXPRESS NI xxx dia
-# LocalWords:  EtherExpress WaveLAN wavelan PCLAN HPLAN VG SK Ansel Xen de ZNET
-# LocalWords:  PCMCIA cb stanford LAN TEC RealTek ATP atp DLINK NetTools VISWS
-# LocalWords:  TR Sony CDU caddyless cdu Mitsumi MCD cd mcd XA MultiSession CDA
-# LocalWords:  Matsushita Panasonic SBPCD Soundblaster Longshine sbpcd Aztech
-# LocalWords:  Okano Wearnes AZTCD CDD SE aztcd sonycd Goldstar GSCD Philips fs
-# LocalWords:  LMS OPTCD Sanyo SJCD minix faqs xiafs XIA msdos mtools Cichocki
-# LocalWords:  std softlinks umssync NetworkFileSharing nfsd mountd CDs HPFS TI
-# LocalWords:  hpfs SYSV SCO iBCS Wyse WordPerfect tsx mit unixes sysv NR irisa
-# LocalWords:  SMB WfW Cyclades async mux Logitech busmouse MouseSystem aka AST
-# LocalWords:  PSMOUSE Compaq trackballs Travelmate Inport ATIXL ATI busmice ld
-# LocalWords:  gpm config QIC DYNCONF FTAPE Stor Ftape ftape pcsndrv manpage NT
-# LocalWords:  readprofile diskdrives org com masq EtherTalk tcp netrom sunacm
-# LocalWords:  misc AIC aic pio scc Portmaster eql GIS PhotoCDs MCDX Perell PG
-# LocalWords:  mcdx gscd optcd sjcd ISP hdparm Workgroups Lan samba PARIDE PCD
-# LocalWords:  filesystems smbfs ATA ppp PCTech RZ www powerquest txt CMD ESDI
-# LocalWords:  chipset FB multicast MROUTE appletalk ifconfig IBMTR multiport
-# LocalWords:  Multisession STALDRV EasyIO EC EasyConnection ISTALLION ONboard
-# LocalWords:  Brumby pci TNC cis ohio faq usenet NETLINK dev hydra ca Tyne mem
-# LocalWords:  carleton DECstation SUNFD JENSEN Noname XXXM SLiRP LILO's amifb
-# LocalWords:  pppd Zilog ZS SRM bootloader ez mainmenu rarp ipfwadm paride pcd
-# LocalWords:  RTNETLINK mknod xos MTU lwared Macs netatalk macs cs Wolff
-# LocalWords:  dartmouth flowerpt MultiMaster FlashPoint tudelft etherexpress
-# LocalWords:  ICL EtherTeam ETH IDESCSI TXC SmartRAID SmartCache httpd sjc dlp
-# LocalWords:  thesphere TwoServers BOOTP DHCP ncpfs BPQETHER BPQ MG HIPPI cern
-# LocalWords:  bsd comp SPARCstation le SunOS ie Gracilis PackeTwin PT pt LU FX
-# LocalWords:  FX TEAC CR LCS mS ramdisk IDETAPE cmd fperllo encis tcfs unisa
-# LocalWords:  Vertos Genoa Funai hsfs NCP NetWare tgz APM apm ioctls UltraLite
-# LocalWords:  TravelMate CDT LCD backlight VC RPC Mips AXP barlow cdrtools pg
-# LocalWords:  PMAX MILO Alphas Multia Tseng linuxelf endian mipsel mips drv HT
-# LocalWords:  kerneld callouts AdvanSys advansys Admin WDT DataStor EP verden
-# LocalWords:  wdt hdb hdc bugfix SiS vlb Acculogic CSA DTC dtc Holtek ht QDI
-# LocalWords:  QD qd UMC umc ALI ali lena fnet fr azstarnet cdr fb MDA ps esdi
-# LocalWords:  Avanti XL AlphaStations Jensen DECpc AXPpci UDB Cabriolet MCA RC
-# LocalWords:  AlphaPC mca AOUT OUTput PPro sipx gwdg lo nwe FourPort Boca unm
-# LocalWords:  Keepalive linefill RELCOM keepalive analogue CDR conf CDI INIT
-# LocalWords:  OPTi isp irq noisp VFAT vfat NTFS losetup dmsdosfs dosfs ISDN MP
-# LocalWords:  NOWAYOUT behaviour dialin isdn callback BTX Teles  XXXX LVM lvm
-# LocalWords:  ICN EDSS Cisco
-# LocalWords:  ipppd syncppp RFC MPP VJ downloaded icn NICCY Creatix shmem ufr
-# LocalWords:  ibp md ARCnet ether encap NDIS arcether ODI Amigas AmiTCP NetBSD
-# LocalWords:  initrd tue util DES funet des OnNet BIOSP smc Travan Iomega CMS
-# LocalWords:  FC DC dc PPA IOMEGA's ppa RNFS FMV Fujitsu ARPD arpd loran layes
-# LocalWords:  FRAD indiana framerelay DLCI DCLIs Sangoma SDLA mrouted sync sec
-# LocalWords:  Starmode Metricom MosquitoNet mosquitonet kbit nfsroot Digiboard
-# LocalWords:  DIGI Xe Xeve digiboard UMISC touchscreens mtu Ethernets HBAs MEX
-# LocalWords:  Shifflett netcom js jshiffle WIC DECchip ELCP EtherPower dst RTC
-# LocalWords:  rtc SMP lp Digi Intl RightSwitch DGRS dgrs AFFS Amiga UFS SDL AP
-# LocalWords:  Solaris RISCom riscom syncPPP PCBIT pcbit sparc anu au artoo MFB
-# LocalWords:  hitchcock Crynwr cnam pktdrvr NCSA's CyDROM CyCD-ROM FreeBSD NeXT
-# LocalWords:  NeXTstep disklabel disklabels SMD FFS tm AmigaOS diskfiles Un IQ
-# LocalWords:  Bernd informatik rwth aachen uae affs multihosting bytecode java
-# LocalWords:  applets applet JDK ncsa cabi SNI Alphatronix readme LANs scarab
-# LocalWords:  winsock RNIS caltech OSPF honour Honouring Mbit LocalTalk DEFRAG
-# LocalWords:  localtalk download Packetwin Baycom baycom interwork ASCII JNT
-# LocalWords:  Camtec proxying indyramp defragment defragmented UDP FAS FASXX
-# LocalWords:  FastSCSI SIO FDC qlogicfas QLogic qlogicisp setbaycom ife ee LJ
-# LocalWords:  ethz ch Travelmates ProAudioSpectrum ProAudio SoundMan SB SBPro
-# LocalWords:  Thunderboard SM OPL FM ADLIB TSR Gravis MPU PSS ADI SW DSP codec
-# LocalWords:  ADSP ESC ASIC daughtercard GUSMAX MSS NX AdLib Excell Ensoniq YM
-# LocalWords:  SoundScape Spea MediaTriX AudioTriX WSS OTI ThunderBoard VoxWare
-# LocalWords:  Soundscape SSCAPE TRIX MediaTrix PnP Maui dsp midixx EIA getty
-# LocalWords:  mgetty sendfax gert greenie muc lowlevel Lasermate LanManager io
-# LocalWords:  OOPSes trackball binghamton mobileip ncr IOMAPPED settags ns ser
-# LocalWords:  setsync NEGO MPARITY autotuning prefetch PIIX cdwrite utils rc
-# LocalWords:  PCWATCHDOG berkprod bitgate boldt ucsb jf kyoto jp euc Tetsuyasu
-# LocalWords:  YAMADA tetsu cauchy nslab ntt nevod perm su doc kaf kheops wsc
-# LocalWords:  traduc Bourgin dbourgin menuconfig kfill READMEs HOWTOs Virge WA
-# LocalWords:  IDEDISK IDEFLOPPY EIDE firewalls QMAGIC ZMAGIC LocalWords opti
-# LocalWords:  SVGATextMode vga svga Xkernel syr jmwobus comfaqs dhcp flakey GD
-# LocalWords:  IPv IPng interoperability ipng ipv radio's tapr pkthome PLP nano
-# LocalWords:  Ses Mhz sethdlc SOUNDMODEM WindowsSoundSystem smdiag pcf inka ES
-# LocalWords:  smmixer ptt circ soundmodem MKISS FDDI DEFEA DEFPA DEFXX redhat
-# LocalWords:  HyperNews khg mconv sed lina wuftpd MicroChannel netlink irc cum
-# LocalWords:  raudio RealAudio PPROP NETBIOS GUI IBMMCA ELMC Racal Interlan fi
-# LocalWords:  eth shapecfg src esp PCWD PREVSTAT bootparam sig bitwizard SBC
-# LocalWords:  downloads AFSK TCM FP Karn KA FSK RUH LinkSys cron mouseman LLC
-# LocalWords:  SyQuest SyQuest's CCITT MicroSolutions BPCD bpcd ESPSERIAL PROM
-# LocalWords:  SUNESP openprom OPENPROMIO quango themall al TT MC MMU LC RMW AA
-# LocalWords:  INSNS Ataris AutoConfig ZORRO OCS AMIFB Agnus Denise ECS CDTV GB
-# LocalWords:  AGA Cybervision CYBER GSP TMS DMI Zorro ACSI ROMs SLM BioNet GVP
-# LocalWords:  PAMsNet TekMagic Cyberstorm MkI CYBERSTORMII MkII BLZ onboard cx
-# LocalWords:  Village Tronic ATARILANCE RieblCard PAMCard VME MFP sangoma LAPB
-# LocalWords:  Rhotron BioData's Multiface AMIGAMOUSE COPCON Amiga's bitplanes
-# LocalWords:  ATARIMOUSE MFPSER SCC's MegaSTE ESCC Atari's GVPIOEXT DMASOUND
-# LocalWords:  fdutils cisco univercd rpcg htm iface lapb LAPBETHER tpqic qic
-# LocalWords:  SYNTH xd en binfmt aout ipip terra ipx sd sr sg wic framebuffer
-# LocalWords:  ibmmca lapbether mkiss dlci sdla fmv eepro eexpress ni hp ne es
-# LocalWords:  ibmtr isofs ROMFS romfs pcxx cyclades istallion psaux msbusmouse
-# LocalWords:  atixlmouse sbin softdog pcwd USS Lite ACI miroSOUND PCM miroPCM
-# LocalWords:  microcontroller miro Voxware downloading teles acsi slm gvp ltpc
-# LocalWords:  atari ariadne amigamouse atarimouse builtin IPDDP maths bradford
-# LocalWords:  AppleTalk Farallon PhoneNet Zubkoff lnz SCCB HAPN WANs vesafb nt
-# LocalWords:  wanrouter WANPIPE multiprotocol Mbps wanpipe EtherWORKS nodma SC
-# LocalWords:  smp HiSax SiemensChipSet Siemens AVM Elsa ITK hisax PCC MICROR
-# LocalWords:  Mircolink EURO DSS Spellcaster BRI sc spellcast Digiboards GPIO
-# LocalWords:  SYMBIOS COMPAT SDMS rev ASUS Tekram HX VX API ibmmcascsi ASY asy
-# LocalWords:  loader's PCnetPCI automounter AUTOFS amd autofs VT Gallant's Pnp
-# LocalWords:  AEDSP aedsp enskip tik Sysctl sysctl PARPORT parport pnp IDs EPP
-# LocalWords:  Autoprobe bart patrickr HDLS READBACK AB usr DAMA DS SparQ aten
-# LocalWords:  Symbios PCscsi tmscsim RoamAbout GHz Hinds contrib mathematik ok
-# LocalWords:  darmstadt okir DIGIEPCA International's Xem digiepca epca bootup
-# LocalWords:  zorro CAPI AVMB capi avmb VP SYN syncookies EM em pc Ethertalk
-# LocalWords:  Dayna DL Daynatalk LT PhoneNET ATB Daystar queueing CMDS SCBs ls
-# LocalWords:  SCB STATS Thinnet ThunderLAN TLAN Netelligent NetFlex tlan james
-# LocalWords:  caldera Preload Preloading slowdowns schoebel uni NBD nbd prog
-# LocalWords:  stuttgart rdist TRANS hostnames mango jukeboxes ESS userland PD
-# LocalWords:  hardlinked NAMETRANS env mtab fstab umount nologin runlevel gid
-# LocalWords:  adm Nodename hostname uname Kernelname bootp nmi DI OV StegFS
-# LocalWords:  KERNNAME kname ktype kernelname Kerneltype KERNTYPE Alt RX mdafb
-# LocalWords:  dataless kerneltype SYSNAME Comtrol Rocketport palmtop fbset EGS
-# LocalWords:  nvram SYSRQ SysRq PrintScreen sysrq NVRAMs NvRAM Shortwave RTTY
-# LocalWords:  Sitor Amtor Pactor GTOR hayes TX TMOUT JFdocs BIGMEM DAC IRQ's
-# LocalWords:  IDEPCI IDEDMA PDC pdc TRM trm raidtools luthien nuclecu BAGET VR
-# LocalWords:  unam mx miguel koobera uic EMUL solaris pp ieee lpsg co DMAs TOS
-# LocalWords:  BLDCONFIG preloading jumperless BOOTINIT modutils multipath GRE
-# LocalWords:  misconfigured autoconfiguration IPGRE ICMP tracert ipautofw PIM
-# LocalWords:  netis rlynch autofw ipportfw monmouth ipsubs portforwarding pimd
-# LocalWords:  portfw PIMSM netweb usc pim pf EUI aggregatable PB decapsulate
-# LocalWords:  ipddp Decapsulation DECAP bool HAMRADIO tcpdump af CDs tx FBCON
-# LocalWords:  ethertap multisession PPC MMIO GDT GDTH ICP gdth hamradio  bpp
-# LocalWords:  lmh weejock AIMSlab RadioTrack RTRACK HZP OptoSCC TRX rx TRXECHO
-# LocalWords:  DMASCC paccomm dmascc addr cfg oevsv oe kib picpar FDX baudrate
-# LocalWords:  baudrates fdx HDX hdx PSK kanren frforum QoS SCHED CBQ SCH sched
-# LocalWords:  sch cbq CSZ Shenker Zhang csz SFQ sfq TBF tbf PFIFO fifo PRIO RW
-# LocalWords:  prio Micom xIO dwmw rimi OMIRR omirr omirrd unicode ntfs cmu NIC
-# LocalWords:  Braam braam Schmidt's freiburg nls codepages codepage Romanian
-# LocalWords:  Slovak Slovenian Sorbian Nordic iso Catalan Faeroese Galician SZ
-# LocalWords:  Valencian Slovene Esperanto Estonian Latvian Belarusian KOI mt
-# LocalWords:  charset Inuit Greenlandic Sami Lappish koi Alexey Kuznetsov's sa
-# LocalWords:  Specialix specialix DTR RTS RTSCTS cycladesZ Exabyte ftape's inr
-# LocalWords:  Iomega's LBFM claus ZFTAPE VFS zftape zft William's lzrw DFLT kb
-# LocalWords:  MTSETBLK MTIOCTOP qft setblk zftape's tar's afio's setdrvbuffer
-# LocalWords:  Procfs Exabyte's THR FCD sysvinit init PSC pscwdt VMIDI Euro SAB
-# LocalWords:  Mostek Fastlane PowerMac PReP PMAC PowerPC Macintoshes Starmax
-# LocalWords:  PowerStack Starmaxes MCOMMON DEVICETREE ATY IMS IMSTT videodev
-# LocalWords:  BT Hauppauge STB bttv Quickcam BW BWQCAM bw qcam Mediavision PMS
-# LocalWords:  pms Avatar Freecom Imation Superdisk BPCK bpck COMM comm DSTR ru
-# LocalWords:  dstr EPAT EPEZ epat EPIA epia FreeCom FRPW frpw KingByte KBIC HW
-# LocalWords:  KingByte's kbic OnSpec ValuStore FASTROUTE fastroute FLOWCONTROL
-# LocalWords:  struct APIC realtime OSs LynxOS CNC tmp cvf HFS hfs ADFS Risc os
-# LocalWords:  adfs ncpmount namespace SUBDIR reexport NDS kcore FT SPX spx DAT
-# LocalWords:  interserver BLKSZ NUMBUFFERS apmd Tadpole ANA roestock QuickCam
-# LocalWords:  isapnptools Colour CQCAM colour Connectix QuickClip prive mentre
-# LocalWords:  KMOD kmod conformant utexas kharker UnixWare Mwave cgi cl ts ibm
-# LocalWords:  eXchange threepio oakland simtel pre ULTRAMCA EtherLink isa luik
-# LocalWords:  EtherLink OpenBSD pts DEVPTS devpts ptmx ttyp glibc readback SA
-# LocalWords:  mwave OLDCARD isdnloop linklevel loopctrl Eicon Diehl DIEHLDIVA
-# LocalWords:  ASUSCOM AsusCom TELEINT semiactiv Sedlbauer Sportster TA MIC ITH
-# LocalWords:  NETjet NetJet Niccy Neuhaus sparcs AOC AOCD AOCE Microlink SAA
-# LocalWords:  teletext WinTV saa iproute tc Quadra Performa PowerBook tor AUN
-# LocalWords:  setserial compsoc steve Econet econet AUNUDP psched TEQL TLE CLS
-# LocalWords:  teql FW Ingres TwistedPair MTRR MTRRs mtrr cfs crypto TD ktti KT
-# LocalWords:  PHd ICS ipchains adelaide rustcorp syslog Cumana steganography
-# LocalWords:  AcornSCSI EcoSCSI EESOX EESOXSCSI Powertec POWERTECSCSI dec SF
-# LocalWords:  RadioReveal gatekeeper aimslab aztech FMI sf fmi RTL rtl cesdis
-# LocalWords:  Yellowfin gsfc nasa gov yellowfin pcnet Mylex LNE lne EtherH hs
-# LocalWords:  EBSA chattr RiscOS Winmodem AGP Atomwide DUALSP pcsp robinson CT
-# LocalWords:  SGALAXY Waverider DSPxxx TRXPRO AudioTrix OSWF MOT CFB DSY kbps
-# LocalWords:  tuwien kkudielk LVD mega lun MAXTAGS Gbps arcnet Olicom SNA PAE
-# LocalWords:  SysKonnect tms sna etherboot ufs NetBEUI MultiSound MSNDCLAS GX
-# LocalWords:  MSNDINIT MSNDPERM MSNDPIN PNDSPINI PNDSPERM Ensoniq's RetinaZ SS
-# LocalWords:  AudioPCI lspci SonicVibes sonicvibes SPARCs roadrunner CLgen UPA
-# LocalWords:  swansea shtml Zoltrix zoltrix BINUTILS EGCS binutils VIDC DACs
-# LocalWords:  CyberVision Cirrus PowerBooks Topcat SBUS CGsix TurboGX BWtwo SS
-# LocalWords:  CGthree TCX unswappable vfb fbcon hicolor truecolor AFB ILBM SOC
-# LocalWords:  IPLAN gracilis Fibre SBus SparcSTORAGE SV jnewbigin swin QNX qnx
-# LocalWords:  PTY PTYS ptyxx ttyxx PTYs ssh sb Avance ALS pss pvv kerneli hd
-# LocalWords:  synth WaveFront MSND NONPNP AudioExcelDSP STRAM APUS CHRP MBX Nx
-# LocalWords:  PowerMac's BMAC radiotrack rtrack miropcm OFFBOARD HPT UDMA DVD
-# LocalWords:  hpt fokus gmd Cyrix DXL SLC DLC NexGen MediaGX GXm IDT WinChip
-# LocalWords:  MMX MII valkyrie mdacon vdolive VDOLive cuseeme CU hippi rrunner
-# LocalWords:  SeeMe ipmasqadm juanjox ipmarkfw markfw TNCs Microdyne rhine lib
-# LocalWords:  libc jsX gamepad gameport CHF FCS FPGaming MadCatz ASSASIN GrIP
-# LocalWords:  Assasin gamepads GamePad PDPI gamecards gamecard WingMan BSP WCS
-# LocalWords:  ThunderPad CyberMan SideWinder ThrustMaster DirectConnect NES XF
-# LocalWords:  Millenium SNES PSX Multisystem Nintendo PlayStation Amstrad CPC
-# LocalWords:  Sega TurboGraFX Steffen Schwenke Multiststem PDIF FIFOSIZE EPLUS
-# LocalWords:  PowerUP RoadRunner tahallah dos functionkey setterm imladris Woz
-# LocalWords:  PowerMacs Winbond Algorithmics ALGOR algor ECOFF IRIX SGI SGI's
-# LocalWords:  gfx virtualized Xpmac mklinux XFree FBDev Woodhouse mvhi Seeq fp
-# LocalWords:  SGISEEQ HIgh ADB ADBMOUSE crosscompiler CROSSCOMPILE FPE GDB gdb
-# LocalWords:  JOYPORT rp spoofing DawiControl NOGENSUPP EEPROM HSSI Alessandro
-# LocalWords:  singleprocessor tex MATHEMU FRIQ Maxell friq Alcor XLT AlphaBook
-# LocalWords:  AlphaPCI DP LX Miata Mikasa Noritake RPX UX BX Takara EV PRIMO
-# LocalWords:  TSC Matrox Productiva matroxfb matrox multihead ia linuxhq MFW
-# LocalWords:  mfw AAA MCS Initio XXU initio imm AutoDetect IZIP CTR usec HDLC
-# LocalWords:  COSA SRP muni cz kas cosa Alteon AceNIC acenic VTOC OSes GMT SAx
-# LocalWords:  Inspiron localtime INTS Thinkpads Ralf Brown's Flightstick NNN
-# LocalWords:  Xterminator Blackhawk NN mpu ioports DCA HPDCA HPLANCE DIO Corel
-# LocalWords:  GemTek gemtek CMDLINE IrDA PDA's irmanager irattach RR AVA DN rg
-# LocalWords:  uit dagb irda LSAP IrLMP RR's IrLAP IR alloc skb's kfree skb's
-# LocalWords:  GZIP IrLAN NetbeamIR ESI JetEye IrOBEX IrCOMM TTY's minicom dti
-# LocalWords:  ircomm ircomm pluto thiguchi IrTTY Linux's bps NetWinder MIR NSC
-# LocalWords:  ACTiSYS dongle dongles esi actisys IrMate tekram BVM MVME
-# LocalWords:  BVME BVME WRITETHROUGH copyback writethrough fwmark syncookie tu
-# LocalWords:  alphalinux GOBIOS csn chemnitz nat ACARD AMI MegaRAID megaraid
-# LocalWords:  QNXFS ISI isicom xterms Apollos VPN RCPCI rcpci sgi visws pcmcia
-# LocalWords:  IrLPT UIRCC Tecra Strebel jstrebel suse Eichwalder ke INI INIA
-# LocalWords:  FCP qlogicfc sym isapnp DTLK DoubleTalk rcsys dtlk DMAP SGIVW ar
-# LocalWords:  dmabuf EcoRadio MUTEFREQ GIrBIL girbil tepkom vol mha diplom PQS
-# LocalWords:  bmac Microgate SyncLink synclink hdlc excl ioaddr Tane tanep TCQ
-# LocalWords:  PDS SMALLDOS charsets bigfoot kernelfr mcs cls fw rsvp SKnet sk
-# LocalWords:  SKMC USB UHCI OHCI intel compaq usb ohci HCD Virt Compaq's hcd
-# LocalWords:  VROOTHUB KBD ARRs MCRs NWBUTTON nwbutton NUM WaveArtist APNE cpu
-# LocalWords:  apne blackhawke PlanB lu mlan planb NWFPE FPA nwfpe unbootable
-# LocalWords:  FPEmulator ds vmlinux initialization discardable pgtable PGT mdw
-# LocalWords:  quicklist pagetable arthur StrongARM podule podules Autodetect
-# LocalWords:  dodgy IrPORT irport Litelink litelink SuSE rtfm internet hda CY
-# LocalWords:  multmode DriveReady SeekComplete DriveStatusError miscompile AEC
-# LocalWords:  mainboard's Digital's alim FastTrak aec PIIXn piix Gayle Eyetech
-# LocalWords:  Catweasel IDEDOUBLER Powerbook Centris ICSIDE RapIDE OSM HDM IOP
-# LocalWords:  HDM's OSM's lan FibreChannel ECP autoprobe itg lbl ipmasq cjb IC
-# LocalWords:  bieringer Caulfield's dreamtime decnet SIOCFIGCONF SIOCGIFCONF
-# LocalWords:  rtnetlink Endnode Aironet Arlan Telxon ylenurme arlan ACB aeschi
-# LocalWords:  Sealevel sealevel Cyclom br wanconfig tarball conectiva cycsyn
-# LocalWords:  devel bazar cyclomx NetGear GA IBMOL Lanstreamer uhci eu efs CYZ
-# LocalWords:  olympic linuxtr usbcore acm EZUSB downloader EFS XFS INTR op IIC
-# LocalWords:  heine soundcore JavaStations JavaStation GemTeks TerraTec TODO
-# LocalWords:  ActiveRadio Standalone terratec Rolf Offermanns rolf offermanns
-# LocalWords:  Zoran ZR Buz LML CPQ DA cpqarray PPDEV deviceid vlp ppdev atyfb
-# LocalWords:  AcceleRAID eXtremeRAID NETFILTER Netfilter masqueraded netfilter
-# LocalWords:  kernelnotes Cardbus PCMCIA's CardBus clgenfb Permedia YAM MMAP
-# LocalWords:  mmapped ATM atm PVCs SVCs InARP ATMARP neighbour neighbours MPOA
-# LocalWords:  VCs ENI FPGA Tonga MMF MF UTP printks ZeitNet ZN ZATM uPD SAR PN
-# LocalWords:  approx NICStAR NICs ForeRunnerLE Madge Collage ATMizer Dxxxx VCI
-# LocalWords:  ServeRAID IPS ips ipslinux gzip BSDCOMP LZW RAYCS Interphase app
-# LocalWords:  Tachyon IPHASE Surfboard NextLevel SURFboard jacksonville Tigon
-# LocalWords:  fventuri adelphia siglercm linuxpower AceNICs Starfire starfire
-# LocalWords:  ISOC CPiA cpia uss ACPI UDF DirectCD udf CDRW's OSF Manx acpi DM
-# LocalWords:  Unixware cymru Computone IntelliPort Intelliport computone SI sx
-# LocalWords:  adbmouse DRI DRM dlabs GMX PLCs Applicom fieldbus applicom int
-# LocalWords:  VWSND eg ESSSOLO CFU CFNR scribed eiconctrl eicon hylafax KFPU
-# LocalWords:  EXTRAPREC fpu mainboards KHTTPD kHTTPd khttpd Xcelerator SBNI tw
-# LocalWords:  LOGIBUSMOUSE Granch granch sbni Raylink NOHIGHMEM Athlon SIM sim
-# LocalWords:  hpl Tourrilhes DuraLAN starfire Davicom davicom dmfe auk tms tr
-# LocalWords:  TokenExpress Belkin Peracom eTek DVDs infradead Cxxx Adlib AV ZX
-# LocalWords:  NeoMagic CPi CPt Celeron decapsulation Undeletion BFS bfs nVidia
-# LocalWords:  OnStream Irongate Riva phonedev QuickNet LineJack PhoneJack IXJ
-# LocalWords:  Quicknet PhoneJACK LineJACK ixj pnpdump Quicknet's Joandi SSID
-# LocalWords:  aironet quickconfig adhoc btw bap NONCS cardservices Xircom lin
-# LocalWords:  Netwave AirSurfer netwave HomePNA failover MVP iMacs ALi aktual
-# LocalWords:  Aladin HIDBP usbkbd KEYBDEV MOUSEDEV JOYDEV EVDEV UAB WhiteHEAT
-# LocalWords:  Handspring ov DABUSB URB URB's dabusb CRAMFS NFSv ELV IOAPIC WIP
-# LocalWords:  NLMv SMBus ALGOBIT algo PHILIPSPAR philips elv Velleman velleman
-# LocalWords:  ALGOPCF Elektor elektor CHARDEV dfx TDFX tdfx Extensa dof gravis
-# LocalWords:  assasin logitech Overdrive thrustmaster DWave Aureal magellan db
-# LocalWords:  SpaceTec SpaceOrb SpaceBall spaceorb FLX spaceball turbografx zr
-# LocalWords:  amiga ESS's WaveWatcher Maxi belkin RW's ata glx GART MPV Baget
-# LocalWords:  OpenGL Xserver agpgart HOTPLUG CyberPro Integraphics Netwinder
-# LocalWords:  aty FONTWIDTH eni zatm nicstar ForeRunner OC DECstations DEC's
-# LocalWords:  PHYsical SUNI reinsertion ChipSAR KVC PHY ClassID iphase iadbg
-# LocalWords:  DEVS FireWire PCILynx pcilynx LOCALRAM miro's DV RAWIO GRED Mk
-# LocalWords:  Diffserv DSMARK Ingress Qdisc TCINDEX TMSPCI tmspci Ringode JE
-# LocalWords:  MADGEMC madgemc TokenRing SMCTR TokenCard smctr Wacom Graphire
-# LocalWords:  mousedev ConnectTech HandSpring Xirlink IBMCAM ibmcam SN
-# LocalWords:  DEVICEFS yyy Cymraeg Dwave SIMM JSFLASH JavaStation's multilink
-# LocalWords:  nsc ircc DDB Vrc CMN TB PROMs Vino rivafb DDC Matroxes MGA TVO
-# LocalWords:  MAVEN fbdev crtc maven matroxset NTSC PCA SBA AAL SKFP DAS SAS
-# LocalWords:  skfp Intuos ADMtek's pegasus PLUSB plusb pointopoint mp rio Xeon
-# LocalWords:  DEVFS devfs dd bs EDSS german TELESPCI FRITZPCI HFC HFCS BDS HST
-# LocalWords:  ISURF ISAR Saphir HSTSAPHIR Telekom BKM Scitel Quadro SCT Gazel
-# LocalWords:  SP PRI Hypercope HYSDN Hypercope's hysdn IbssJoinNetTimeout FTDI
-# LocalWords:  ARCNet Keyspan PDA ADMtek sgalaxy sgbase opl mpuio mpuirq sbio
-# LocalWords:  sbirq sbdma gus uart mssio mssirq mssdma sscape maui mouirq iph
-# LocalWords:  CHDLC UPS's usbmouse wacom wmforce keybdev joydev fibre Trunking
-# LocalWords:  Etherchannel IOC Moxa Intellio moxa SmartIO mxser Mixcom EFI ir
-# LocalWords:  MIXCOMWD mixcomwd SENDCOMPLETE GMAC iBook gmac OAKNET oaknet PCG
-# LocalWords:  diffserv irlan irtty toshoboe IrCC Lifebook idex AUTODMA FIP Cxx
-# LocalWords:  Yenta Databook TCIC FMVJ fmvj NMCLAN LiveWire nmclan XIRC xirc
-# LocalWords:  loadkeys setfont shm SuperIO soc SOCAL socal FCAL fc fcal COMX
-# LocalWords:  MultiGate ITConsult comx CMX HiCOMX downloadable hw LoCOMX PROTO
-# LocalWords:  locomx MixCOM mixcom proto MyriCOM MYRI Sbus myri sbus IBMLS hme
-# LocalWords:  lanstreamer baseT HAPPYMEAL qfe sunhme SUNLANCE sunlance BigMAC
-# LocalWords:  SUNBMAC sunbmac QuadEthernet SUNQE qe FastEthernet sunqe DSB PTI
-# LocalWords:  DSBR dsbr procinfo QLOGICPTI qpti ptisp QLGC qlogicpti se LBA NF
-# LocalWords:  OPENPROMFS OpenPROM openpromfs OBP OpenBoot flashable Multiboard
-# LocalWords:  SPARCAUDIO SparcClassic Ultras DBRI Sparcbook sparcaudio SUNBPP
-# LocalWords:  UltraDMA WDC CRC CONNTRACK IPTABLES iptables nfmark interface's
-# LocalWords:  tdfxfb TNTx HGA hgafb VERBOSEDEBUG SunTrunking SunSoft XIRTULIP
-# LocalWords:  ethercards PNIC Macronix MXIC ASIX xircom Mustek MDC gphoto mdc
-# LocalWords:  CramFs Cramfs uid cramfs AVM's kernelcapi PCIV cdrdao Cdparanoia
-# LocalWords:  DMX Domex dmx wellington ftdi sio Accton Billington Corega FEter
-# LocalWords:  MELCO LUA PNA Linksys SNC chkdsk AWACS Webcam RAMFS Ramfs ramfs
-# LocalWords:  ramfiles MAKEDEV pty WDTPCI APA apa
-#
-# The following sets edit modes for GNU EMACS
-# Local Variables:
-# case-fold-search:nil
-# fill-prefix:"  "
-# adaptive-fill:nil
-# fill-column:70
-# End:
diff --git a/xenolinux-2.4.21-sparse/Makefile b/xenolinux-2.4.21-sparse/Makefile
deleted file mode 100644 (file)
index a6f720d..0000000
+++ /dev/null
@@ -1,579 +0,0 @@
-VERSION = 2
-PATCHLEVEL = 4
-SUBLEVEL = 21
-EXTRAVERSION = -xeno
-
-KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
-
-ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
-
-# Xeno hack XXX
-ARCH    := xeno
-SUBARCH := i386
-
-KERNELPATH=kernel-$(shell echo $(KERNELRELEASE) | sed -e "s/-//g")
-
-CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
-         else if [ -x /bin/bash ]; then echo /bin/bash; \
-         else echo sh; fi ; fi)
-TOPDIR := $(shell /bin/pwd)
-
-HPATH          = $(TOPDIR)/include
-FINDHPATH      = $(HPATH)/asm $(HPATH)/linux $(HPATH)/scsi $(HPATH)/net $(HPATH)/math-emu
-
-HOSTCC         = gcc
-HOSTCFLAGS     = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
-
-CROSS_COMPILE  =
-
-#
-# Include the make variables (CC, etc...)
-#
-
-AS             = $(CROSS_COMPILE)as
-LD             = $(CROSS_COMPILE)ld
-CC             = $(CROSS_COMPILE)gcc
-CPP            = $(CC) -E
-AR             = $(CROSS_COMPILE)ar
-NM             = $(CROSS_COMPILE)nm
-STRIP          = $(CROSS_COMPILE)strip
-OBJCOPY                = $(CROSS_COMPILE)objcopy
-OBJDUMP                = $(CROSS_COMPILE)objdump
-MAKEFILES      = $(TOPDIR)/.config
-GENKSYMS       = /sbin/genksyms
-DEPMOD         = /sbin/depmod
-MODFLAGS       = -DMODULE
-CFLAGS_KERNEL  =
-PERL           = perl
-
-export VERSION PATCHLEVEL SUBLEVEL EXTRAVERSION KERNELRELEASE ARCH \
-       CONFIG_SHELL TOPDIR HPATH HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC \
-       CPP AR NM STRIP OBJCOPY OBJDUMP MAKE MAKEFILES GENKSYMS MODFLAGS PERL
-
-all:   do-it-all
-
-#
-# Make "config" the default target if there is no configuration file or
-# "depend" the target if there is no top-level dependency information.
-#
-
-ifeq (.config,$(wildcard .config))
-include .config
-ifeq (.depend,$(wildcard .depend))
-include .depend
-do-it-all:     Version vmlinux
-else
-CONFIGURATION = depend
-do-it-all:     depend
-endif
-else
-CONFIGURATION = config
-do-it-all:     config
-endif
-
-#
-# INSTALL_PATH specifies where to place the updated kernel and system map
-# images.  Uncomment if you want to place them anywhere other than root.
-#
-
-#export        INSTALL_PATH=/boot
-
-#
-# INSTALL_MOD_PATH specifies a prefix to MODLIB for module directory
-# relocations required by build roots.  This is not defined in the
-# makefile but the arguement can be passed to make if needed.
-#
-
-MODLIB := $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)
-export MODLIB
-
-#
-# standard CFLAGS
-#
-
-CPPFLAGS := -D__KERNEL__ -I$(HPATH)
-
-CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes -Wno-trigraphs -O2 \
-         -fno-strict-aliasing -fno-common
-ifndef CONFIG_FRAME_POINTER
-CFLAGS += -fomit-frame-pointer
-endif
-AFLAGS := -D__ASSEMBLY__ $(CPPFLAGS)
-
-#
-# ROOT_DEV specifies the default root-device when making the image.
-# This can be either FLOPPY, CURRENT, /dev/xxxx or empty, in which case
-# the default of FLOPPY is used by 'build'.
-# This is i386 specific.
-#
-
-export ROOT_DEV = CURRENT
-
-#
-# If you want to preset the SVGA mode, uncomment the next line and
-# set SVGA_MODE to whatever number you want.
-# Set it to -DSVGA_MODE=NORMAL_VGA if you just want the EGA/VGA mode.
-# The number is the same as you would ordinarily press at bootup.
-# This is i386 specific.
-#
-
-export SVGA_MODE = -DSVGA_MODE=NORMAL_VGA
-
-#
-# If you want the RAM disk device, define this to be the size in blocks.
-# This is i386 specific.
-#
-
-#export RAMDISK = -DRAMDISK=512
-
-CORE_FILES     =kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o
-NETWORKS       =net/network.o
-
-LIBS           =$(TOPDIR)/lib/lib.a
-SUBDIRS                =kernel drivers mm fs net ipc lib
-
-DRIVERS-n :=
-DRIVERS-y :=
-DRIVERS-m :=
-DRIVERS-  :=
-
-DRIVERS-$(CONFIG_ACPI) += drivers/acpi/acpi.o
-DRIVERS-$(CONFIG_PARPORT) += drivers/parport/driver.o
-DRIVERS-y += drivers/char/char.o \
-       drivers/block/block.o \
-       drivers/misc/misc.o \
-       drivers/net/net.o
-DRIVERS-$(CONFIG_AGP) += drivers/char/agp/agp.o
-DRIVERS-$(CONFIG_DRM_NEW) += drivers/char/drm/drm.o
-DRIVERS-$(CONFIG_DRM_OLD) += drivers/char/drm-4.0/drm.o
-DRIVERS-$(CONFIG_NUBUS) += drivers/nubus/nubus.a
-DRIVERS-$(CONFIG_NET_FC) += drivers/net/fc/fc.o
-DRIVERS-$(CONFIG_DEV_APPLETALK) += drivers/net/appletalk/appletalk.o
-DRIVERS-$(CONFIG_TR) += drivers/net/tokenring/tr.o
-DRIVERS-$(CONFIG_WAN) += drivers/net/wan/wan.o
-DRIVERS-$(CONFIG_ARCNET) += drivers/net/arcnet/arcnetdrv.o
-DRIVERS-$(CONFIG_ATM) += drivers/atm/atm.o
-DRIVERS-$(CONFIG_IDE) += drivers/ide/idedriver.o
-DRIVERS-$(CONFIG_FC4) += drivers/fc4/fc4.a
-DRIVERS-$(CONFIG_SCSI) += drivers/scsi/scsidrv.o
-DRIVERS-$(CONFIG_FUSION_BOOT) += drivers/message/fusion/fusion.o
-DRIVERS-$(CONFIG_IEEE1394) += drivers/ieee1394/ieee1394drv.o
-
-ifneq ($(CONFIG_CD_NO_IDESCSI)$(CONFIG_BLK_DEV_IDECD)$(CONFIG_BLK_DEV_SR)$(CONFIG_PARIDE_PCD),)
-DRIVERS-y += drivers/cdrom/driver.o
-endif
-
-DRIVERS-$(CONFIG_SOUND) += drivers/sound/sounddrivers.o
-DRIVERS-$(CONFIG_PCI) += drivers/pci/driver.o
-DRIVERS-$(CONFIG_MTD) += drivers/mtd/mtdlink.o
-DRIVERS-$(CONFIG_PCMCIA) += drivers/pcmcia/pcmcia.o
-DRIVERS-$(CONFIG_NET_PCMCIA) += drivers/net/pcmcia/pcmcia_net.o
-DRIVERS-$(CONFIG_NET_WIRELESS) += drivers/net/wireless/wireless_net.o
-DRIVERS-$(CONFIG_PCMCIA_CHRDEV) += drivers/char/pcmcia/pcmcia_char.o
-DRIVERS-$(CONFIG_DIO) += drivers/dio/dio.a
-DRIVERS-$(CONFIG_SBUS) += drivers/sbus/sbus_all.o
-DRIVERS-$(CONFIG_ZORRO) += drivers/zorro/driver.o
-DRIVERS-$(CONFIG_FC4) += drivers/fc4/fc4.a
-DRIVERS-$(CONFIG_PPC32) += drivers/macintosh/macintosh.o
-DRIVERS-$(CONFIG_MAC) += drivers/macintosh/macintosh.o
-DRIVERS-$(CONFIG_ISAPNP) += drivers/pnp/pnp.o
-DRIVERS-$(CONFIG_SGI_IP22) += drivers/sgi/sgi.a
-DRIVERS-$(CONFIG_VT) += drivers/video/video.o
-DRIVERS-$(CONFIG_PARIDE) += drivers/block/paride/paride.a
-DRIVERS-$(CONFIG_HAMRADIO) += drivers/net/hamradio/hamradio.o
-DRIVERS-$(CONFIG_TC) += drivers/tc/tc.a
-DRIVERS-$(CONFIG_USB) += drivers/usb/usbdrv.o
-DRIVERS-y +=drivers/media/media.o
-DRIVERS-$(CONFIG_INPUT) += drivers/input/inputdrv.o
-DRIVERS-$(CONFIG_HIL) += drivers/hil/hil.o
-DRIVERS-$(CONFIG_I2O) += drivers/message/i2o/i2o.o
-DRIVERS-$(CONFIG_IRDA) += drivers/net/irda/irda.o
-DRIVERS-$(CONFIG_I2C) += drivers/i2c/i2c.o
-DRIVERS-$(CONFIG_PHONE) += drivers/telephony/telephony.o
-DRIVERS-$(CONFIG_MD) += drivers/md/mddev.o
-DRIVERS-$(CONFIG_GSC) += drivers/gsc/gscbus.o
-DRIVERS-$(CONFIG_BLUEZ) += drivers/bluetooth/bluetooth.o
-DRIVERS-$(CONFIG_HOTPLUG_PCI) += drivers/hotplug/vmlinux-obj.o
-DRIVERS-$(CONFIG_ISDN_BOOL) += drivers/isdn/vmlinux-obj.o
-
-DRIVERS := $(DRIVERS-y)
-
-
-# files removed with 'make clean'
-CLEAN_FILES = \
-       kernel/ksyms.lst include/linux/compile.h \
-       vmlinux System.map \
-       .tmp* \
-       drivers/char/consolemap_deftbl.c drivers/video/promcon_tbl.c \
-       drivers/char/conmakehash \
-       drivers/char/drm/*-mod.c \
-       drivers/pci/devlist.h drivers/pci/classlist.h drivers/pci/gen-devlist \
-       drivers/zorro/devlist.h drivers/zorro/gen-devlist \
-       drivers/sound/bin2hex drivers/sound/hex2hex \
-       drivers/atm/fore200e_mkfirm drivers/atm/{pca,sba}*{.bin,.bin1,.bin2} \
-       drivers/scsi/aic7xxx/aicasm/aicasm \
-       drivers/scsi/aic7xxx/aicasm/aicasm_gram.c \
-       drivers/scsi/aic7xxx/aicasm/aicasm_gram.h \
-       drivers/scsi/aic7xxx/aicasm/aicasm_macro_gram.c \
-       drivers/scsi/aic7xxx/aicasm/aicasm_macro_gram.h \
-       drivers/scsi/aic7xxx/aicasm/aicasm_macro_scan.c \
-       drivers/scsi/aic7xxx/aicasm/aicasm_scan.c \
-       drivers/scsi/aic7xxx/aicasm/aicdb.h \
-       drivers/scsi/aic7xxx/aicasm/y.tab.h \
-       drivers/scsi/53c700_d.h \
-       net/khttpd/make_times_h \
-       net/khttpd/times.h \
-       submenu*
-# directories removed with 'make clean'
-CLEAN_DIRS = \
-       modules
-
-# files removed with 'make mrproper'
-MRPROPER_FILES = \
-       include/linux/autoconf.h include/linux/version.h \
-       drivers/net/hamradio/soundmodem/sm_tbl_{afsk1200,afsk2666,fsk9600}.h \
-       drivers/net/hamradio/soundmodem/sm_tbl_{hapn4800,psk4800}.h \
-       drivers/net/hamradio/soundmodem/sm_tbl_{afsk2400_7,afsk2400_8}.h \
-       drivers/net/hamradio/soundmodem/gentbl \
-       drivers/sound/*_boot.h drivers/sound/.*.boot \
-       drivers/sound/msndinit.c \
-       drivers/sound/msndperm.c \
-       drivers/sound/pndsperm.c \
-       drivers/sound/pndspini.c \
-       drivers/atm/fore200e_*_fw.c drivers/atm/.fore200e_*.fw \
-       .version .config* config.in config.old \
-       scripts/tkparse scripts/kconfig.tk scripts/kconfig.tmp \
-       scripts/lxdialog/*.o scripts/lxdialog/lxdialog \
-       .menuconfig.log \
-       include/asm \
-       .hdepend scripts/mkdep scripts/split-include scripts/docproc \
-       $(TOPDIR)/include/linux/modversions.h \
-       kernel.spec
-
-# directories removed with 'make mrproper'
-MRPROPER_DIRS = \
-       include/config \
-       $(TOPDIR)/include/linux/modules
-
-
-include arch/$(ARCH)/Makefile
-
-# Extra cflags for kbuild 2.4.  The default is to forbid includes by kernel code
-# from user space headers.  Some UML code requires user space headers, in the
-# UML Makefiles add 'kbuild_2_4_nostdinc :=' before include Rules.make.  No
-# other kernel code should include user space headers, if you need
-# 'kbuild_2_4_nostdinc :=' or -I/usr/include for kernel code and you are not UML
-# then your code is broken!  KAO.
-
-kbuild_2_4_nostdinc    := -nostdinc -iwithprefix include
-export kbuild_2_4_nostdinc
-
-export CPPFLAGS CFLAGS CFLAGS_KERNEL AFLAGS AFLAGS_KERNEL
-
-export NETWORKS DRIVERS LIBS HEAD LDFLAGS LINKFLAGS MAKEBOOT ASFLAGS
-
-.S.s:
-       $(CPP) $(AFLAGS) $(AFLAGS_KERNEL) -traditional -o $*.s $<
-.S.o:
-       $(CC) $(AFLAGS) $(AFLAGS_KERNEL) -traditional -c -o $*.o $<
-
-Version: dummy
-       @rm -f include/linux/compile.h
-
-boot: vmlinux
-       @$(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" -C arch/$(ARCH)/boot
-
-vmlinux: include/linux/version.h $(CONFIGURATION) init/main.o init/version.o init/do_mounts.o linuxsubdirs
-       $(LD) $(LINKFLAGS) $(HEAD) init/main.o init/version.o init/do_mounts.o \
-               --start-group \
-               $(CORE_FILES) \
-               $(DRIVERS) \
-               $(NETWORKS) \
-               $(LIBS) \
-               --end-group \
-               -o vmlinux
-       $(NM) vmlinux | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map
-
-symlinks:
-       rm -f include/asm
-       ( cd include ; ln -sf asm-$(ARCH) asm)
-       @if [ ! -d include/linux/modules ]; then \
-               mkdir include/linux/modules; \
-       fi
-
-oldconfig: symlinks
-       $(CONFIG_SHELL) scripts/Configure -d arch/$(ARCH)/config.in
-
-xconfig: symlinks
-       $(MAKE) -C scripts kconfig.tk
-       wish -f scripts/kconfig.tk
-
-menuconfig: include/linux/version.h symlinks
-       $(MAKE) -C scripts/lxdialog all
-       $(CONFIG_SHELL) scripts/Menuconfig arch/$(ARCH)/config.in
-
-config: symlinks
-       $(CONFIG_SHELL) scripts/Configure arch/$(ARCH)/config.in
-
-include/config/MARKER: scripts/split-include include/linux/autoconf.h
-       scripts/split-include include/linux/autoconf.h include/config
-       @ touch include/config/MARKER
-
-linuxsubdirs: $(patsubst %, _dir_%, $(SUBDIRS))
-
-$(patsubst %, _dir_%, $(SUBDIRS)) : dummy include/linux/version.h include/config/MARKER
-       $(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" -C $(patsubst _dir_%, %, $@)
-
-$(TOPDIR)/include/linux/version.h: include/linux/version.h
-$(TOPDIR)/include/linux/compile.h: include/linux/compile.h
-
-newversion:
-       . scripts/mkversion > .tmpversion
-       @mv -f .tmpversion .version
-
-uts_len                := 64
-uts_truncate   := sed -e 's/\(.\{1,$(uts_len)\}\).*/\1/'
-
-include/linux/compile.h: $(CONFIGURATION) include/linux/version.h newversion
-       @echo -n \#`cat .version` > .ver1
-       @if [ -n "$(CONFIG_SMP)" ] ; then echo -n " SMP" >> .ver1; fi
-       @if [ -f .name ]; then  echo -n \-`cat .name` >> .ver1; fi
-       @LANG=C echo ' '`date` >> .ver1
-       @echo \#define UTS_VERSION \"`cat .ver1 | $(uts_truncate)`\" > .ver
-       @LANG=C echo \#define LINUX_COMPILE_TIME \"`date +%T`\" >> .ver
-       @echo \#define LINUX_COMPILE_BY \"`whoami`\" >> .ver
-       @echo \#define LINUX_COMPILE_HOST \"`hostname | $(uts_truncate)`\" >> .ver
-       @([ -x /bin/dnsdomainname ] && /bin/dnsdomainname > .ver1) || \
-        ([ -x /bin/domainname ] && /bin/domainname > .ver1) || \
-        echo > .ver1
-       @echo \#define LINUX_COMPILE_DOMAIN \"`cat .ver1 | $(uts_truncate)`\" >> .ver
-       @echo \#define LINUX_COMPILER \"`$(CC) $(CFLAGS) -v 2>&1 | tail -n 1`\" >> .ver
-       @mv -f .ver $@
-       @rm -f .ver1
-
-include/linux/version.h: ./Makefile
-       @expr length "$(KERNELRELEASE)" \<= $(uts_len) > /dev/null || \
-         (echo KERNELRELEASE \"$(KERNELRELEASE)\" exceeds $(uts_len) characters >&2; false)
-       @echo \#define UTS_RELEASE \"$(KERNELRELEASE)\" > .ver
-       @echo \#define LINUX_VERSION_CODE `expr $(VERSION) \\* 65536 + $(PATCHLEVEL) \\* 256 + $(SUBLEVEL)` >> .ver
-       @echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))' >>.ver
-       @mv -f .ver $@
-
-comma  := ,
-
-init/version.o: init/version.c include/linux/compile.h include/config/MARKER
-       $(CC) $(CFLAGS) $(CFLAGS_KERNEL) -DUTS_MACHINE='"$(SUBARCH)"' -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F))) -c -o init/version.o init/version.c
-
-init/main.o: init/main.c include/config/MARKER
-       $(CC) $(CFLAGS) $(CFLAGS_KERNEL) $(PROFILING) -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F))) -c -o $@ $<
-
-init/do_mounts.o: init/do_mounts.c include/config/MARKER
-       $(CC) $(CFLAGS) $(CFLAGS_KERNEL) $(PROFILING) -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F))) -c -o $@ $<
-
-fs lib mm ipc kernel drivers net: dummy
-       $(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" $(subst $@, _dir_$@, $@)
-
-TAGS: dummy
-       { find include/asm-${ARCH} -name '*.h' -print ; \
-       find include -type d \( -name "asm-*" -o -name config \) -prune -o -name '*.h' -print ; \
-       find $(SUBDIRS) init arch/${ARCH} -name '*.[chS]' ; } | grep -v SCCS | grep -v '\.svn' | etags -
-
-# Exuberant ctags works better with -I
-tags: dummy
-       CTAGSF=`ctags --version | grep -i exuberant >/dev/null && echo "-I __initdata,__exitdata,EXPORT_SYMBOL,EXPORT_SYMBOL_NOVERS"`; \
-       ctags $$CTAGSF `find include/asm-$(ARCH) -name '*.h'` && \
-       find include -type d \( -name "asm-*" -o -name config \) -prune -o -name '*.h' -print | xargs ctags $$CTAGSF -a && \
-       find $(SUBDIRS) init -name '*.[ch]' | xargs ctags $$CTAGSF -a
-
-ifdef CONFIG_MODULES
-ifdef CONFIG_MODVERSIONS
-MODFLAGS += -DMODVERSIONS -include $(HPATH)/linux/modversions.h
-endif
-
-.PHONY: modules
-modules: $(patsubst %, _mod_%, $(SUBDIRS))
-
-.PHONY: $(patsubst %, _mod_%, $(SUBDIRS))
-$(patsubst %, _mod_%, $(SUBDIRS)) : include/linux/version.h include/config/MARKER
-       $(MAKE) -C $(patsubst _mod_%, %, $@) CFLAGS="$(CFLAGS) $(MODFLAGS)" MAKING_MODULES=1 modules
-
-.PHONY: modules_install
-modules_install: _modinst_ $(patsubst %, _modinst_%, $(SUBDIRS)) _modinst_post
-
-.PHONY: _modinst_
-_modinst_:
-       @rm -rf $(MODLIB)/kernel
-       @rm -f $(MODLIB)/build
-       @mkdir -p $(MODLIB)/kernel
-       @ln -s $(TOPDIR) $(MODLIB)/build
-
-# If System.map exists, run depmod.  This deliberately does not have a
-# dependency on System.map since that would run the dependency tree on
-# vmlinux.  This depmod is only for convenience to give the initial
-# boot a modules.dep even before / is mounted read-write.  However the
-# boot script depmod is the master version.
-ifeq "$(strip $(INSTALL_MOD_PATH))" ""
-depmod_opts    :=
-else
-depmod_opts    := -b $(INSTALL_MOD_PATH) -r
-endif
-.PHONY: _modinst_post
-_modinst_post: _modinst_post_pcmcia
-#      if [ -r System.map ]; then $(DEPMOD) -ae -F System.map $(depmod_opts) $(KERNELRELEASE); fi
-
-# Backwards compatibilty symlinks for people still using old versions
-# of pcmcia-cs with hard coded pathnames on insmod.  Remove
-# _modinst_post_pcmcia for kernel 2.4.1.
-.PHONY: _modinst_post_pcmcia
-_modinst_post_pcmcia:
-       cd $(MODLIB); \
-       mkdir -p pcmcia; \
-       find kernel -path '*/pcmcia/*' -name '*.o' | xargs -i -r ln -sf ../{} pcmcia
-
-.PHONY: $(patsubst %, _modinst_%, $(SUBDIRS))
-$(patsubst %, _modinst_%, $(SUBDIRS)) :
-       $(MAKE) -C $(patsubst _modinst_%, %, $@) modules_install
-
-# modules disabled....
-
-else
-modules modules_install: dummy
-       @echo
-       @echo "The present kernel configuration has modules disabled."
-       @echo "Type 'make config' and enable loadable module support."
-       @echo "Then build a kernel with module support enabled."
-       @echo
-       @exit 1
-endif
-
-clean: archclean
-       find . \( -name '*.[oas]' -o -name core -o -name '.*.flags' \) -type f -print \
-               | grep -v lxdialog/ | xargs rm -f
-       rm -f $(CLEAN_FILES)
-       rm -rf $(CLEAN_DIRS)
-       $(MAKE) -C Documentation/DocBook clean
-
-mrproper: clean archmrproper
-       find . \( -size 0 -o -name .depend \) -type f -print | xargs rm -f
-       rm -f $(MRPROPER_FILES)
-       rm -rf $(MRPROPER_DIRS)
-       $(MAKE) -C Documentation/DocBook mrproper
-
-distclean: mrproper
-       rm -f core `find . \( -not -type d \) -and \
-               \( -name '*.orig' -o -name '*.rej' -o -name '*~' \
-               -o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
-               -o -name '.*.rej' -o -name '.SUMS' -o -size 0 \) -type f -print` TAGS tags
-
-backup: mrproper
-       cd .. && tar cf - linux/ | gzip -9 > backup.gz
-       sync
-
-sgmldocs: 
-       chmod 755 $(TOPDIR)/scripts/docgen
-       chmod 755 $(TOPDIR)/scripts/gen-all-syms
-       chmod 755 $(TOPDIR)/scripts/kernel-doc
-       $(MAKE) -C $(TOPDIR)/Documentation/DocBook books
-
-psdocs: sgmldocs
-       $(MAKE) -C Documentation/DocBook ps
-
-pdfdocs: sgmldocs
-       $(MAKE) -C Documentation/DocBook pdf
-
-htmldocs: sgmldocs
-       $(MAKE) -C Documentation/DocBook html
-
-mandocs:
-       chmod 755 $(TOPDIR)/scripts/kernel-doc
-       chmod 755 $(TOPDIR)/scripts/split-man
-       $(MAKE) -C Documentation/DocBook man
-
-sums:
-       find . -type f -print | sort | xargs sum > .SUMS
-
-dep-files: scripts/mkdep archdep include/linux/version.h
-       rm -f .depend .hdepend
-       $(MAKE) $(patsubst %,_sfdep_%,$(SUBDIRS)) _FASTDEP_ALL_SUB_DIRS="$(SUBDIRS)"
-ifdef CONFIG_MODVERSIONS
-       $(MAKE) update-modverfile
-endif
-       scripts/mkdep -- `find $(FINDHPATH) \( -name SCCS -o -name .svn \) -prune -o -follow -name \*.h ! -name modversions.h -print` > .hdepend
-       scripts/mkdep -- init/*.c > .depend
-
-ifdef CONFIG_MODVERSIONS
-MODVERFILE := $(TOPDIR)/include/linux/modversions.h
-else
-MODVERFILE :=
-endif
-export MODVERFILE
-
-depend dep: dep-files
-
-checkconfig:
-       find * -name '*.[hcS]' -type f -print | sort | xargs $(PERL) -w scripts/checkconfig.pl
-
-checkhelp:
-       find * -name [cC]onfig.in -print | sort | xargs $(PERL) -w scripts/checkhelp.pl
-
-checkincludes:
-       find * -name '*.[hcS]' -type f -print | sort | xargs $(PERL) -w scripts/checkincludes.pl
-
-ifdef CONFIGURATION
-..$(CONFIGURATION):
-       @echo
-       @echo "You have a bad or nonexistent" .$(CONFIGURATION) ": running 'make" $(CONFIGURATION)"'"
-       @echo
-       $(MAKE) $(CONFIGURATION)
-       @echo
-       @echo "Successful. Try re-making (ignore the error that follows)"
-       @echo
-       exit 1
-
-#dummy: ..$(CONFIGURATION)
-dummy:
-
-else
-
-dummy:
-
-endif
-
-include Rules.make
-
-#
-# This generates dependencies for the .h files.
-#
-
-scripts/mkdep: scripts/mkdep.c
-       $(HOSTCC) $(HOSTCFLAGS) -o scripts/mkdep scripts/mkdep.c
-
-scripts/split-include: scripts/split-include.c
-       $(HOSTCC) $(HOSTCFLAGS) -o scripts/split-include scripts/split-include.c
-
-#
-# RPM target
-#
-#      If you do a make spec before packing the tarball you can rpm -ta it
-#
-spec:
-       . scripts/mkspec >kernel.spec
-
-#
-#      Build a tar ball, generate an rpm from it and pack the result
-#      There arw two bits of magic here
-#      1) The use of /. to avoid tar packing just the symlink
-#      2) Removing the .dep files as they have source paths in them that
-#         will become invalid
-#
-rpm:   clean spec
-       find . \( -size 0 -o -name .depend -o -name .hdepend \) -type f -print | xargs rm -f
-       set -e; \
-       cd $(TOPDIR)/.. ; \
-       ln -sf $(TOPDIR) $(KERNELPATH) ; \
-       tar -cvz --exclude CVS -f $(KERNELPATH).tar.gz $(KERNELPATH)/. ; \
-       rm $(KERNELPATH) ; \
-       cd $(TOPDIR) ; \
-       . scripts/mkversion > .version ; \
-       rpm -ta $(TOPDIR)/../$(KERNELPATH).tar.gz ; \
-       rm $(TOPDIR)/../$(KERNELPATH).tar.gz
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/Makefile b/xenolinux-2.4.21-sparse/arch/xeno/Makefile
deleted file mode 100644 (file)
index 89777dc..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-#
-# xeno/Makefile
-#
-# This file is included by the global makefile so that you can add your own
-# architecture-specific flags and dependencies. Remember to do have actions
-# for "archclean" and "archdep" for cleaning up and making dependencies for
-# this architecture
-#
-# This file is subject to the terms and conditions of the GNU General Public
-# License.  See the file "COPYING" in the main directory of this archive
-# for more details.
-#
-# Copyright (C) 1994 by Linus Torvalds
-#
-# 19990713  Artur Skawina <skawina@geocities.com>
-#           Added '-march' and '-mpreferred-stack-boundary' support
-#
-
-LD=$(CROSS_COMPILE)ld -m elf_i386
-OBJCOPY=$(CROSS_COMPILE)objcopy -O binary -R .note -R .comment -S
-LDFLAGS=-e stext
-LINKFLAGS =-T $(TOPDIR)/arch/xeno/vmlinux.lds $(LDFLAGS)
-
-CFLAGS += -pipe
-
-check_gcc = $(shell if $(CC) $(1) -S -o /dev/null -xc /dev/null > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi)
-
-# prevent gcc from keeping the stack 16 byte aligned
-CFLAGS += $(call check_gcc,-mpreferred-stack-boundary=2,)
-
-ifdef CONFIG_M686
-CFLAGS += -march=i686
-endif
-
-ifdef CONFIG_MPENTIUMIII
-CFLAGS += -march=i686
-endif
-
-ifdef CONFIG_MPENTIUM4
-CFLAGS += -march=i686
-endif
-
-ifdef CONFIG_MK7
-CFLAGS += $(call check_gcc,-march=athlon,-march=i686 -malign-functions=4)
-endif
-
-HEAD := arch/xeno/kernel/head.o arch/xeno/kernel/init_task.o
-
-SUBDIRS += arch/xeno/kernel arch/xeno/mm arch/xeno/lib
-SUBDIRS += arch/xeno/drivers/console arch/xeno/drivers/network
-SUBDIRS += arch/xeno/drivers/block arch/xeno/drivers/balloon
-ifdef CONFIG_XENO_PRIV
-SUBDIRS += arch/xeno/drivers/dom0 
-endif
-
-CORE_FILES += arch/xeno/kernel/kernel.o arch/xeno/mm/mm.o
-CORE_FILES += arch/xeno/drivers/console/con.o
-CORE_FILES += arch/xeno/drivers/block/blk.o
-CORE_FILES += arch/xeno/drivers/network/net.o
-ifdef CONFIG_XENO_PRIV
-CORE_FILES += arch/xeno/drivers/dom0/dom0.o
-endif
-CORE_FILES += arch/xeno/drivers/balloon/balloon_driver.o
-LIBS := $(TOPDIR)/arch/xeno/lib/lib.a $(LIBS) $(TOPDIR)/arch/xeno/lib/lib.a
-
-arch/xeno/kernel: dummy
-       $(MAKE) linuxsubdirs SUBDIRS=arch/xeno/kernel
-
-arch/xeno/mm: dummy
-       $(MAKE) linuxsubdirs SUBDIRS=arch/xeno/mm
-
-arch/xeno/drivers/console: dummy
-       $(MAKE) linuxsubdirs SUBDIRS=arch/xeno/drivers/console
-
-arch/xeno/drivers/network: dummy
-       $(MAKE) linuxsubdirs SUBDIRS=arch/xeno/drivers/network
-
-arch/xeno/drivers/block: dummy
-       $(MAKE) linuxsubdirs SUBDIRS=arch/xeno/drivers/block
-
-arch/xeno/drivers/dom0: dummy
-       $(MAKE) linuxsubdirs SUBDIRS=arch/xeno/drivers/dom0
-
-arch/xeno/drivers/balloon: dummy
-       $(MAKE) linuxsubdirs SUBDIRS=arch/xeno/drivers/balloon
-
-MAKEBOOT = $(MAKE) -C arch/$(ARCH)/boot
-
-vmlinux: arch/xeno/vmlinux.lds
-
-FORCE: ;
-
-.PHONY: bzImage compressed clean archclean archmrproper archdep
-
-bzImage: vmlinux
-       @$(MAKEBOOT) image.gz
-
-install: bzImage
-       cp -a arch/$(ARCH)/boot/image.gz ../install/boot/xenolinux.gz
-
-archclean:
-       @$(MAKEBOOT) clean
-
-archmrproper:
-
-archdep:
-       @$(MAKEBOOT) dep
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/boot/Makefile b/xenolinux-2.4.21-sparse/arch/xeno/boot/Makefile
deleted file mode 100644 (file)
index 252daf5..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# arch/xeno/boot/Makefile
-#
-
-image.gz: image
-       gzip -f -9 < $< > $@
-
-image: $(TOPDIR)/vmlinux
-       # Guest OS header -- first 8 bytes are identifier 'XenoGues'.
-       echo -e -n 'XenoGues' >$@ 
-       # Guest OS header -- next 4 bytes are load address (0xC0000000).
-       echo -e -n '\000\000\000\300' >>$@
-       $(OBJCOPY) $< image.body
-       # Guest OS header is immediately followed by raw OS image.
-       # Start address must be at byte 0.
-       cat image.body >>$@
-       rm -f image.body
-
-dep:
-
-clean:
-       rm -f image image.gz
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/config.in b/xenolinux-2.4.21-sparse/arch/xeno/config.in
deleted file mode 100644 (file)
index a25e336..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see Documentation/kbuild/config-language.txt.
-#
-mainmenu_name "Linux Kernel Configuration"
-
-define_bool CONFIG_XENO y
-
-define_bool CONFIG_X86 y
-define_bool CONFIG_ISA y
-define_bool CONFIG_SBUS n
-
-define_bool CONFIG_UID16 y
-
-mainmenu_option next_comment
-comment 'Privileged guest OS'
-bool 'Support for privileged operations (domain 0)' CONFIG_XENO_PRIV
-endmenu
-
-mainmenu_option next_comment
-comment 'Code maturity level options'
-bool 'Prompt for development and/or incomplete code/drivers' CONFIG_EXPERIMENTAL
-endmenu
-
-mainmenu_option next_comment
-comment 'Loadable module support'
-bool 'Enable loadable module support' CONFIG_MODULES
-if [ "$CONFIG_MODULES" = "y" ]; then
-   bool '  Set version information on all module symbols' CONFIG_MODVERSIONS
-   bool '  Kernel module loader' CONFIG_KMOD
-fi
-endmenu
-
-mainmenu_option next_comment
-comment 'Processor type and features'
-choice 'Processor family' \
-       "Pentium-Pro/Celeron/Pentium-II         CONFIG_M686 \
-        Pentium-III/Celeron(Coppermine)        CONFIG_MPENTIUMIII \
-        Pentium-4                              CONFIG_MPENTIUM4 \
-        Athlon/Duron/K7                        CONFIG_MK7" Pentium-Pro
-
-   define_bool CONFIG_X86_WP_WORKS_OK y
-   define_bool CONFIG_X86_INVLPG y
-   define_bool CONFIG_X86_CMPXCHG y
-   define_bool CONFIG_X86_XADD y
-   define_bool CONFIG_X86_BSWAP y
-   define_bool CONFIG_X86_POPAD_OK y
-   define_bool CONFIG_RWSEM_GENERIC_SPINLOCK n
-   define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM y
-
-   define_bool CONFIG_X86_GOOD_APIC y
-   define_bool CONFIG_X86_PGE y
-   define_bool CONFIG_X86_USE_PPRO_CHECKSUM y
-   define_bool CONFIG_X86_TSC y
-
-if [ "$CONFIG_M686" = "y" ]; then
-   define_int  CONFIG_X86_L1_CACHE_SHIFT 5
-fi
-if [ "$CONFIG_MPENTIUMIII" = "y" ]; then
-   define_int  CONFIG_X86_L1_CACHE_SHIFT 5
-fi
-if [ "$CONFIG_MPENTIUM4" = "y" ]; then
-   define_int  CONFIG_X86_L1_CACHE_SHIFT 7
-fi
-if [ "$CONFIG_MK7" = "y" ]; then
-   define_int  CONFIG_X86_L1_CACHE_SHIFT 6
-   define_bool CONFIG_X86_USE_3DNOW y
-fi
-
-choice 'High Memory Support' \
-       "off    CONFIG_NOHIGHMEM \
-        4GB    CONFIG_HIGHMEM4G \
-        64GB   CONFIG_HIGHMEM64G" off
-if [ "$CONFIG_HIGHMEM4G" = "y" ]; then
-   define_bool CONFIG_HIGHMEM y
-fi
-if [ "$CONFIG_HIGHMEM64G" = "y" ]; then
-   define_bool CONFIG_HIGHMEM y
-   define_bool CONFIG_X86_PAE y
-fi
-
-#bool 'Symmetric multi-processing support' CONFIG_SMP
-#if [ "$CONFIG_SMP" = "y" -a "$CONFIG_X86_CMPXCHG" = "y" ]; then
-#   define_bool CONFIG_HAVE_DEC_LOCK y
-#fi
-endmenu
-
-mainmenu_option next_comment
-comment 'General setup'
-
-bool 'Networking support' CONFIG_NET
-
-bool 'System V IPC' CONFIG_SYSVIPC
-bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT
-bool 'Sysctl support' CONFIG_SYSCTL
-if [ "$CONFIG_PROC_FS" = "y" ]; then
-   choice 'Kernel core (/proc/kcore) format' \
-       "ELF            CONFIG_KCORE_ELF        \
-        A.OUT          CONFIG_KCORE_AOUT" ELF
-fi
-tristate 'Kernel support for a.out binaries' CONFIG_BINFMT_AOUT
-tristate 'Kernel support for ELF binaries' CONFIG_BINFMT_ELF
-tristate 'Kernel support for MISC binaries' CONFIG_BINFMT_MISC
-
-endmenu
-
-if [ "$CONFIG_NET" = "y" ]; then
-   source net/Config.in
-fi
-
-
-#
-# Block device driver configuration
-#
-mainmenu_option next_comment
-comment 'Block devices'
-tristate 'Loopback device support' CONFIG_BLK_DEV_LOOP
-dep_tristate 'Network block device support' CONFIG_BLK_DEV_NBD $CONFIG_NET
-tristate 'RAM disk support' CONFIG_BLK_DEV_RAM
-if [ "$CONFIG_BLK_DEV_RAM" = "y" -o "$CONFIG_BLK_DEV_RAM" = "m" ]; then
-   int '  Default RAM disk size' CONFIG_BLK_DEV_RAM_SIZE 4096
-fi
-dep_bool '  Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD $CONFIG_BLK_DEV_RAM
-bool 'Per partition statistics in /proc/partitions' CONFIG_BLK_STATS
-bool 'XenoLinux virtual block device support' CONFIG_XENOLINUX_BLOCK
-endmenu
-define_bool CONFIG_BLK_DEV_IDE_MODES n
-define_bool CONFIG_BLK_DEV_HD n
-
-
-mainmenu_option next_comment
-comment 'Character devices'
-
-bool 'Xen console support' CONFIG_XEN_CONSOLE
-comment 'The options below are alpha-stage and will probably not work'
-bool 'Virtual terminal' CONFIG_VT
-if [ "$CONFIG_VT" = "y" ]; then
-   bool '  Support for console on virtual terminal' CONFIG_VT_CONSOLE
-   bool '  Support for VGA Video' CONFIG_VGA_CONSOLE
-   bool '  Support for Dummy Video (for testing)' CONFIG_DUMMY_CONSOLE
-   bool '  PS/2 mouse (aka "auxiliary device") support' CONFIG_PSMOUSE
-fi
-
-bool 'Unix98 PTY support' CONFIG_UNIX98_PTYS
-if [ "$CONFIG_UNIX98_PTYS" = "y" ]; then
-   int 'Maximum number of Unix98 PTYs in use (0-2048)' CONFIG_UNIX98_PTY_COUNT 256
-fi
-
-endmenu
-
-source fs/Config.in
-
-mainmenu_option next_comment
-comment 'Kernel hacking'
-
-bool 'Kernel debugging' CONFIG_DEBUG_KERNEL
-if [ "$CONFIG_DEBUG_KERNEL" != "n" ]; then
-   bool '  Debug high memory support' CONFIG_DEBUG_HIGHMEM
-   bool '  Debug memory allocations' CONFIG_DEBUG_SLAB
-   bool '  Memory mapped I/O debugging' CONFIG_DEBUG_IOVIRT
-   bool '  Magic SysRq key' CONFIG_MAGIC_SYSRQ
-   bool '  Spinlock debugging' CONFIG_DEBUG_SPINLOCK
-   bool '  Verbose BUG() reporting (adds 70K)' CONFIG_DEBUG_BUGVERBOSE
-   bool '  Load all symbols for debugging' CONFIG_KALLSYMS
-   bool '  Compile the kernel with frame pointers' CONFIG_FRAME_POINTER
-fi
-
-endmenu
-
-source lib/Config.in
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/defconfig b/xenolinux-2.4.21-sparse/arch/xeno/defconfig
deleted file mode 100644 (file)
index 5e5ee7b..0000000
+++ /dev/null
@@ -1,319 +0,0 @@
-#
-# Automatically generated make config: don't edit
-#
-CONFIG_XENO=y
-CONFIG_X86=y
-CONFIG_ISA=y
-# CONFIG_SBUS is not set
-CONFIG_UID16=y
-
-#
-# Privileged guest OS
-#
-CONFIG_XENO_PRIV=y
-
-#
-# Code maturity level options
-#
-# CONFIG_EXPERIMENTAL is not set
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODVERSIONS=y
-CONFIG_KMOD=y
-
-#
-# Processor type and features
-#
-CONFIG_M686=y
-# CONFIG_MPENTIUMIII is not set
-# CONFIG_MPENTIUM4 is not set
-# CONFIG_MK7 is not set
-CONFIG_X86_WP_WORKS_OK=y
-CONFIG_X86_INVLPG=y
-CONFIG_X86_CMPXCHG=y
-CONFIG_X86_XADD=y
-CONFIG_X86_BSWAP=y
-CONFIG_X86_POPAD_OK=y
-# CONFIG_RWSEM_GENERIC_SPINLOCK is not set
-CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-CONFIG_X86_GOOD_APIC=y
-CONFIG_X86_PGE=y
-CONFIG_X86_USE_PPRO_CHECKSUM=y
-CONFIG_X86_TSC=y
-CONFIG_X86_L1_CACHE_SHIFT=5
-CONFIG_NOHIGHMEM=y
-# CONFIG_HIGHMEM4G is not set
-# CONFIG_HIGHMEM64G is not set
-
-#
-# General setup
-#
-CONFIG_NET=y
-CONFIG_SYSVIPC=y
-# CONFIG_BSD_PROCESS_ACCT is not set
-CONFIG_SYSCTL=y
-CONFIG_KCORE_ELF=y
-# CONFIG_KCORE_AOUT is not set
-CONFIG_BINFMT_AOUT=y
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_MISC is not set
-
-#
-# Networking options
-#
-CONFIG_PACKET=y
-CONFIG_PACKET_MMAP=y
-# CONFIG_NETLINK_DEV is not set
-# CONFIG_NETFILTER is not set
-CONFIG_FILTER=y
-CONFIG_UNIX=y
-CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
-# CONFIG_IP_ADVANCED_ROUTER is not set
-CONFIG_IP_PNP=y
-# CONFIG_IP_PNP_DHCP is not set
-# CONFIG_IP_PNP_BOOTP is not set
-# CONFIG_IP_PNP_RARP is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE is not set
-# CONFIG_INET_ECN is not set
-# CONFIG_SYN_COOKIES is not set
-# CONFIG_VLAN_8021Q is not set
-
-#
-#  
-#
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-
-#
-# Appletalk devices
-#
-# CONFIG_DEV_APPLETALK is not set
-# CONFIG_DECNET is not set
-# CONFIG_BRIDGE is not set
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-
-#
-# Block devices
-#
-# CONFIG_BLK_DEV_FD is not set
-# CONFIG_BLK_DEV_XD is not set
-# CONFIG_PARIDE is not set
-# CONFIG_BLK_CPQ_DA is not set
-# CONFIG_BLK_CPQ_CISS_DA is not set
-# CONFIG_CISS_SCSI_TAPE is not set
-# CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_UMEM is not set
-CONFIG_BLK_DEV_LOOP=y
-CONFIG_BLK_DEV_NBD=y
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_SIZE=4096
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_BLK_STATS is not set
-CONFIG_XENOLINUX_BLOCK=y
-# CONFIG_BLK_DEV_IDE_MODES is not set
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# Console drivers
-#
-CONFIG_VGA_CONSOLE=y
-# CONFIG_VIDEO_SELECT is not set
-CONFIG_DUMMY_CONSOLE=y
-
-
-#
-# Character devices
-#
-CONFIG_XEN_CONSOLE=y
-CONFIG_VT=y
-CONFIG_VT_CONSOLE=y
-# CONFIG_UNIX98_PTYS is not set
-
-#
-# Mice
-#
-# CONFIG_BUSMOUSE is not set
-CONFIG_MOUSE=y
-CONFIG_PSMOUSE=y
-# CONFIG_82C710_MOUSE is not set
-# CONFIG_PC110_PAD is not set
-# CONFIG_MK712_MOUSE is not set
-
-
-#
-# File systems
-#
-# CONFIG_QUOTA is not set
-CONFIG_AUTOFS_FS=y
-CONFIG_AUTOFS4_FS=y
-# CONFIG_REISERFS_FS is not set
-# CONFIG_REISERFS_CHECK is not set
-# CONFIG_REISERFS_PROC_INFO is not set
-# CONFIG_ADFS_FS is not set
-# CONFIG_ADFS_FS_RW is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BEFS_DEBUG is not set
-# CONFIG_BFS_FS is not set
-CONFIG_EXT3_FS=y
-CONFIG_JBD=y
-# CONFIG_JBD_DEBUG is not set
-# CONFIG_FAT_FS is not set
-# CONFIG_MSDOS_FS is not set
-# CONFIG_UMSDOS_FS is not set
-# CONFIG_VFAT_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
-# CONFIG_JFFS2_FS is not set
-# CONFIG_CRAMFS is not set
-CONFIG_TMPFS=y
-CONFIG_RAMFS=y
-CONFIG_ISO9660_FS=y
-CONFIG_JOLIET=y
-CONFIG_ZISOFS=y
-# CONFIG_JFS_FS is not set
-# CONFIG_JFS_DEBUG is not set
-# CONFIG_JFS_STATISTICS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_NTFS_FS is not set
-# CONFIG_NTFS_RW is not set
-# CONFIG_HPFS_FS is not set
-CONFIG_PROC_FS=y
-# CONFIG_DEVFS_FS is not set
-# CONFIG_DEVFS_MOUNT is not set
-# CONFIG_DEVFS_DEBUG is not set
-# CONFIG_DEVPTS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_QNX4FS_RW is not set
-# CONFIG_ROMFS_FS is not set
-CONFIG_EXT2_FS=y
-# CONFIG_SYSV_FS is not set
-# CONFIG_UDF_FS is not set
-# CONFIG_UDF_RW is not set
-# CONFIG_UFS_FS is not set
-# CONFIG_UFS_FS_WRITE is not set
-
-#
-# Network File Systems
-#
-# CONFIG_CODA_FS is not set
-# CONFIG_INTERMEZZO_FS is not set
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-CONFIG_ROOT_NFS=y
-CONFIG_NFSD=y
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_TCP is not set
-CONFIG_SUNRPC=y
-CONFIG_LOCKD=y
-CONFIG_LOCKD_V4=y
-# CONFIG_SMB_FS is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_NCPFS_PACKET_SIGNING is not set
-# CONFIG_NCPFS_IOCTL_LOCKING is not set
-# CONFIG_NCPFS_STRONG is not set
-# CONFIG_NCPFS_NFS_NS is not set
-# CONFIG_NCPFS_OS2_NS is not set
-# CONFIG_NCPFS_SMALLDOS is not set
-# CONFIG_NCPFS_NLS is not set
-# CONFIG_NCPFS_EXTRAS is not set
-CONFIG_ZISOFS_FS=y
-
-#
-# Partition Types
-#
-CONFIG_PARTITION_ADVANCED=y
-# CONFIG_ACORN_PARTITION is not set
-# CONFIG_OSF_PARTITION is not set
-# CONFIG_AMIGA_PARTITION is not set
-# CONFIG_ATARI_PARTITION is not set
-# CONFIG_MAC_PARTITION is not set
-CONFIG_XENO_PARTITION=y
-CONFIG_MSDOS_PARTITION=y
-# CONFIG_BSD_DISKLABEL is not set
-# CONFIG_MINIX_SUBPARTITION is not set
-# CONFIG_SOLARIS_X86_PARTITION is not set
-# CONFIG_UNIXWARE_DISKLABEL is not set
-# CONFIG_SGI_PARTITION is not set
-# CONFIG_ULTRIX_PARTITION is not set
-# CONFIG_SUN_PARTITION is not set
-# CONFIG_EFI_PARTITION is not set
-# CONFIG_SMB_NLS is not set
-CONFIG_NLS=y
-
-#
-# Native Language Support
-#
-CONFIG_NLS_DEFAULT="iso8559-1"
-# CONFIG_NLS_CODEPAGE_437 is not set
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-CONFIG_NLS_ISO8859_1=y
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-
-#
-# Kernel hacking
-#
-CONFIG_DEBUG_KERNEL=y
-# CONFIG_DEBUG_HIGHMEM is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_IOVIRT is not set
-# CONFIG_MAGIC_SYSRQ is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_BUGVERBOSE is not set
-CONFIG_KALLSYMS=y
-# CONFIG_FRAME_POINTER is not set
-
-#
-# Library routines
-#
-CONFIG_ZLIB_INFLATE=y
-# CONFIG_ZLIB_DEFLATE is not set
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/drivers/balloon/Makefile b/xenolinux-2.4.21-sparse/arch/xeno/drivers/balloon/Makefile
deleted file mode 100644 (file)
index f780a51..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-O_TARGET := balloon_driver.o
-obj-y := balloon.o
-include $(TOPDIR)/Rules.make
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/drivers/balloon/balloon.c b/xenolinux-2.4.21-sparse/arch/xeno/drivers/balloon/balloon.c
deleted file mode 100644 (file)
index e1a6d30..0000000
+++ /dev/null
@@ -1,282 +0,0 @@
-/******************************************************************************
- * balloon.c
- *
- * Xeno balloon driver - enables returning/claiming memory to/from xen
- *
- * Copyright (c) 2003, B Dragovic
- */
-
-#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/errno.h>
-#include <linux/proc_fs.h>
-
-#include <linux/mm.h>
-#include <linux/mman.h>
-#include <linux/smp_lock.h>
-#include <linux/pagemap.h>
-
-#include <asm/hypervisor.h>
-#include <asm/pgalloc.h>
-#include <asm/pgtable.h>
-#include <asm/uaccess.h>
-#include <asm/tlb.h>
-
-#include "dom_mem_ops.h"
-
-/* USER DEFINES -- THESE SHOULD BE COPIED TO USER-SPACE TOOLS */
-#define USER_INFLATE_BALLOON  1   /* return mem to hypervisor */
-#define USER_DEFLATE_BALLOON  2   /* claim mem from hypervisor */
-typedef struct user_balloon_op {
-    unsigned int  op;
-    unsigned long size;
-} user_balloon_op_t;
-/* END OF USER DEFINE */
-
-/* Dead entry written into ballon-owned entries in the PMT. */
-#define DEAD 0xdeadbeef
-
-#define BALLOON_ENTRY    "balloon"
-extern struct proc_dir_entry *xeno_base;
-
-static struct proc_dir_entry *balloon_pde;
-unsigned long credit;
-
-static inline unsigned long get_ppte(unsigned long addr)
-{
-    unsigned long ppte;
-    pgd_t *pgd; pmd_t *pmd; pte_t *ptep;
-    pgd = pgd_offset_k(addr);
-
-    if ( pgd_none(*pgd) || pgd_bad(*pgd) ) BUG();
-
-    pmd = pmd_offset(pgd, addr);
-    if ( pmd_none(*pmd) || pmd_bad(*pmd) ) BUG();
-
-    ptep = pte_offset(pmd, addr);
-    ppte = (unsigned long)__pa(ptep);
-
-    return ppte;
-}
-
-/* main function for relinquishing bit of memory */
-static unsigned long inflate_balloon(unsigned long num_pages)
-{
-    dom_mem_op_t dom_mem_op;
-    unsigned long *parray;
-    unsigned long *currp;
-    unsigned long curraddr;
-    unsigned long ret = 0;
-    unsigned long vaddr;
-    unsigned long i, j;
-
-    parray = (unsigned long *)kmalloc(num_pages *
-                                      sizeof(unsigned long), GFP_KERNEL);
-    currp = parray;
-
-    for ( i = 0; i < num_pages; i++ )
-    {
-        /* try to obtain a free page, has to be done with GFP_ATOMIC
-         * as we do not want to sleep indefinately.
-         */
-        vaddr = __get_free_page(GFP_ATOMIC);
-
-        /* if allocation fails, free all reserved pages */
-        if(!vaddr){
-            printk("Unable to inflate balloon by %ld, only %ld pages free.",
-                   num_pages, i);
-            currp = parray;
-            for(j = 0; j < i; j++){
-                free_page(*currp++);
-            }
-            goto cleanup;
-        }
-
-        *currp++ = vaddr;
-    }
-
-
-    currp = parray;
-    for ( i = 0; i < num_pages; i++ )
-    {
-        curraddr = *currp;
-        *currp = virt_to_machine(*currp) >> PAGE_SHIFT;
-        queue_l1_entry_update(get_ppte(curraddr) | PGREQ_NORMAL, 0);
-        phys_to_machine_mapping[__pa(curraddr) >> PAGE_SHIFT] = DEAD;
-        currp++;
-    }
-
-    XENO_flush_page_update_queue();
-
-    dom_mem_op.op = BALLOON_INFLATE_OP;
-    dom_mem_op.u.balloon_inflate.size  = num_pages;
-    dom_mem_op.u.balloon_inflate.pages = parray;
-    if ( (ret = HYPERVISOR_dom_mem_op(&dom_mem_op)) != num_pages )
-    {
-        printk("Unable to inflate balloon, error %lx\n", ret);
-        goto cleanup;
-    }
-
-    credit += num_pages;
-    ret = num_pages;
-
- cleanup:
-    kfree(parray);
-
-    return ret;
-}
-
-/* install new mem pages obtained by deflate_balloon. function walks 
- * phys->machine mapping table looking for DEAD entries and populates
- * them.
- */
-static unsigned long process_new_pages(unsigned long * parray, 
-                                       unsigned long num)
-{
-    /* currently, this function is rather simplistic as 
-     * it is assumed that domain reclaims only number of 
-     * pages previously released. this is to change soon
-     * and the code to extend page tables etc. will be 
-     * incorporated here.
-     */
-     
-    unsigned long tot_pages = start_info.nr_pages;   
-    unsigned long * curr = parray;
-    unsigned long num_installed;
-    unsigned long i;
-
-    num_installed = 0;
-    for ( i = 0; (i < tot_pages) && (num_installed < num); i++ )
-    {
-        if ( phys_to_machine_mapping[i] == DEAD )
-        {
-            printk(KERN_ALERT "bd240 debug: proc_new_pages: i %lx, mpt %lx, %lx\n", i, i << PAGE_SHIFT, get_ppte((unsigned long)__va(i << PAGE_SHIFT)) | PGREQ_NORMAL);
-            phys_to_machine_mapping[i] = *curr;
-            queue_l1_entry_update((i << PAGE_SHIFT) | PGREQ_MPT_UPDATE, i);
-            queue_l1_entry_update(
-                get_ppte((unsigned long)__va(i << PAGE_SHIFT)) | PGREQ_NORMAL, 
-                ((*curr) << PAGE_SHIFT) | L1_PROT);
-
-            *curr = (unsigned long)__va(i << PAGE_SHIFT);
-            curr++;
-            num_installed++;
-        }
-    }
-
-    /* now, this is tricky (and will also change for machine addrs that 
-      * are mapped to not previously released addresses). we free pages
-      * that were allocated by get_free_page (the mappings are different 
-      * now, of course).
-      */
-    curr = parray;
-    for ( i = 0; i < num_installed; i++ )
-    {
-        free_page(*curr);
-        curr++;
-    }
-
-    return num_installed;
-}
-
-unsigned long deflate_balloon(unsigned long num_pages)
-{
-    dom_mem_op_t dom_mem_op;
-    unsigned long ret;
-    unsigned long * parray;
-
-    printk(KERN_ALERT "bd240 debug: deflate balloon called for %lx pages\n", num_pages);
-
-    if ( num_pages > credit )
-    {
-        printk("Can not allocate more pages than previously released.\n");
-        return -EAGAIN;
-    }
-
-    parray = (unsigned long *)kmalloc(num_pages * sizeof(unsigned long), 
-                                      GFP_KERNEL);
-
-    dom_mem_op.op = BALLOON_DEFLATE_OP;
-    dom_mem_op.u.balloon_deflate.size = num_pages;
-    dom_mem_op.u.balloon_deflate.pages = parray;
-    if((ret = HYPERVISOR_dom_mem_op(&dom_mem_op)) != num_pages){
-        printk("Unable to deflate balloon, error %lx\n", ret);
-        goto cleanup;
-    }
-
-    if((ret = process_new_pages(parray, num_pages)) < num_pages){
-        printk("Unable to deflate balloon by specified %lx pages, only %lx.\n",
-               num_pages, ret);
-        goto cleanup;
-    }
-
-    ret = num_pages;
-    credit -= num_pages;
-
- cleanup:
-    kfree(parray);
-
-    return ret;
-}
-
-static int balloon_write(struct file *file, const char *buffer,
-                         u_long count, void *data)
-{
-    user_balloon_op_t bop;
-
-    /* Only admin can play with the balloon :) */
-    if ( !capable(CAP_SYS_ADMIN) )
-        return -EPERM;
-
-    if ( copy_from_user(&bop, buffer, sizeof(bop)) )
-        return -EFAULT;
-
-    switch ( bop.op )
-    {
-    case USER_INFLATE_BALLOON:
-        if ( inflate_balloon(bop.size) < bop.size )
-            return -EAGAIN;
-        break;
-        
-    case USER_DEFLATE_BALLOON:
-        deflate_balloon(bop.size);
-        break;
-
-    default:
-        printk("Unknown command to balloon driver.");
-        return -EFAULT;
-    }
-
-    return sizeof(bop);
-}
-
-/*
- * main balloon driver initialization function.
- */
-static int __init init_module(void)
-{
-    printk(KERN_ALERT "Starting Xeno Balloon driver\n");
-
-    credit = 0;
-
-    balloon_pde = create_proc_entry(BALLOON_ENTRY, 0600, xeno_base);
-    if ( balloon_pde == NULL )
-    {
-        printk(KERN_ALERT "Unable to create balloon driver proc entry!");
-        return -1;
-    }
-
-    balloon_pde->write_proc = balloon_write;
-
-    return 0;
-}
-
-static void __exit cleanup_module(void)
-{
-}
-
-module_init(init_module);
-module_exit(cleanup_module);
-
-
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/drivers/balloon/dom_mem_ops.h b/xenolinux-2.4.21-sparse/arch/xeno/drivers/balloon/dom_mem_ops.h
deleted file mode 100644 (file)
index c473f19..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/******************************************************************************
- * dom_mem_ops.h
- *
- * Header file supporting domain related memory operations. N.B. keep in sync
- * with xen version. 
- *
- * Copyright (c) 2003, B Dragovic
- */
-
-#define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_USER|_PAGE_ACCESSED)
-#define BALLOON_DEFLATE_OP   0
-#define BALLOON_INFLATE_OP   1
-
-typedef struct balloon_deflate_op {
-    unsigned long   size;
-    unsigned long   * pages;
-} balloon_def_op_t;
-
-typedef struct balloon_inflate_op {
-    unsigned long   size;
-    unsigned long   * pages;
-} balloon_inf_op_t;
-
-typedef struct dom_mem_ops
-{
-    unsigned int op;
-    union
-    {
-        balloon_def_op_t balloon_deflate;
-        balloon_inf_op_t balloon_inflate;
-    }u;
-} dom_mem_op_t;
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/drivers/block/Makefile b/xenolinux-2.4.21-sparse/arch/xeno/drivers/block/Makefile
deleted file mode 100644 (file)
index 6423104..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-O_TARGET := blk.o
-obj-y := xl_block.o xl_ide.o xl_scsi.o xl_segment.o xl_segment_proc.o
-include $(TOPDIR)/Rules.make
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_block.c b/xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_block.c
deleted file mode 100644 (file)
index 743ecd9..0000000
+++ /dev/null
@@ -1,616 +0,0 @@
-/******************************************************************************
- * xl_block.c
- * 
- * Xenolinux virtual block-device driver.
- * 
- */
-
-#include "xl_block.h"
-#include <linux/blk.h>
-#include <linux/cdrom.h>
-
-typedef unsigned char byte; /* from linux/ide.h */
-
-#define XLBLK_RESPONSE_IRQ _EVENT_BLKDEV
-#define DEBUG_IRQ          _EVENT_DEBUG 
-
-static blk_ring_t *blk_ring;
-static unsigned int resp_cons; /* Response consumer for comms ring. */
-static unsigned int req_prod;  /* Private request producer.         */
-static xen_disk_info_t xlblk_disk_info;
-static int xlblk_control_msg_pending;
-
-#define RING_FULL (BLK_RING_INC(req_prod) == resp_cons)
-
-/*
- * Request queues with outstanding work, but ring is currently full.
- * We need no special lock here, as we always access this with the
- * io_request_lock held. We only need a small maximum list.
- */
-#define MAX_PENDING 8
-static request_queue_t *pending_queues[MAX_PENDING];
-static int nr_pending;
-
-static kdev_t        sg_dev;
-static int           sg_operation = -1;
-static unsigned long sg_next_sect;
-#define DISABLE_SCATTERGATHER() (sg_operation = -1)
-
-static inline void signal_requests_to_xen(void)
-{
-    DISABLE_SCATTERGATHER();
-    blk_ring->req_prod = req_prod;
-    HYPERVISOR_block_io_op();
-}
-
-
-inline kdev_t physdev_to_xldev(unsigned short physdev)
-{
-    switch (physdev & XENDEV_TYPE_MASK) {
-    case XENDEV_IDE:
-        if ( (physdev & XENDEV_IDX_MASK) < XLIDE_DEVS_PER_MAJOR) {
-           return MKDEV(XLIDE_MAJOR_0,
-                        (physdev & XENDEV_IDX_MASK) << XLIDE_PARTN_SHIFT);
-       } else if ( (physdev & XENDEV_IDX_MASK) < (XLIDE_DEVS_PER_MAJOR * 2)) {
-           return MKDEV(XLIDE_MAJOR_1,
-                        (physdev & XENDEV_IDX_MASK) << XLIDE_PARTN_SHIFT);
-       }
-       break;
-    case XENDEV_SCSI:
-       return MKDEV(XLSCSI_MAJOR,
-                    (physdev & XENDEV_IDX_MASK) << XLSCSI_PARTN_SHIFT);
-    case XENDEV_VIRTUAL:
-       return MKDEV(XLVIRT_MAJOR,
-                    (physdev & XENDEV_IDX_MASK) << XLVIRT_PARTN_SHIFT);
-    }
-
-    return 0;
-}
-
-
-/* Convert from a XenoLinux major device to the Xen-level 'physical' device */
-inline unsigned short xldev_to_physdev(kdev_t xldev) 
-{
-    unsigned short physdev = 0;
-
-    switch ( MAJOR(xldev) ) 
-    { 
-    case XLIDE_MAJOR_0: 
-        physdev = XENDEV_IDE + (0*XLIDE_DEVS_PER_MAJOR) +
-            (MINOR(xldev) >> XLIDE_PARTN_SHIFT);
-       break; 
-
-    case XLIDE_MAJOR_1:
-       physdev = XENDEV_IDE + (1*XLIDE_DEVS_PER_MAJOR) +
-            (MINOR(xldev) >> XLIDE_PARTN_SHIFT);
-        break;
-
-    case XLSCSI_MAJOR: 
-        physdev = XENDEV_SCSI + (MINOR(xldev) >> XLSCSI_PARTN_SHIFT);
-       break; 
-
-    case XLVIRT_MAJOR:
-        physdev = XENDEV_VIRTUAL + (MINOR(xldev) >> XLVIRT_PARTN_SHIFT);
-        break;
-    } 
-
-    return physdev;
-}
-
-
-static inline struct gendisk *xldev_to_gendisk(kdev_t xldev) 
-{
-    struct gendisk *gd = NULL;
-
-    switch ( MAJOR(xldev) ) 
-    { 
-    case XLIDE_MAJOR_0: 
-        gd = xlide_gendisk[0];
-       break; 
-       
-    case XLIDE_MAJOR_1: 
-        gd = xlide_gendisk[1];
-       break; 
-       
-    case XLSCSI_MAJOR: 
-        gd = xlscsi_gendisk;
-       break; 
-
-    case XLVIRT_MAJOR:
-        gd = xlsegment_gendisk;
-        break;
-    }
-
-    if ( gd == NULL ) BUG();
-
-    return gd;
-}
-
-
-static inline xl_disk_t *xldev_to_xldisk(kdev_t xldev)
-{
-    struct gendisk *gd = xldev_to_gendisk(xldev);
-    return (xl_disk_t *)gd->real_devices + 
-        (MINOR(xldev) >> PARTN_SHIFT(xldev));
-}
-
-
-int xenolinux_block_open(struct inode *inode, struct file *filep)
-{
-    xl_disk_t *disk = xldev_to_xldisk(inode->i_rdev);
-    disk->usage++;
-    DPRINTK("xenolinux_block_open\n");
-    return 0;
-}
-
-
-int xenolinux_block_release(struct inode *inode, struct file *filep)
-{
-    xl_disk_t *disk = xldev_to_xldisk(inode->i_rdev);
-    disk->usage--;
-    DPRINTK("xenolinux_block_release\n");
-    return 0;
-}
-
-/*
- * handle ioctl calls
- *
- * individual ioctls are defined in /usr/include/linux/fs.h
- */
-
-int xenolinux_block_ioctl(struct inode *inode, struct file *filep,
-                         unsigned command, unsigned long argument)
-{
-    kdev_t dev = inode->i_rdev;
-    struct hd_geometry *geo = (struct hd_geometry *)argument;
-    struct gendisk *gd;     
-    struct hd_struct *part; 
-    
-    DPRINTK("xenolinux_block_ioctl\n"); 
-
-    /* check permissions */
-    if (!capable(CAP_SYS_ADMIN)) return -EPERM;
-    if (!inode)                  return -EINVAL;
-
-    DPRINTK_IOCTL("command: 0x%x, argument: 0x%lx, dev: 0x%04x\n",
-                  command, (long) argument, dev); 
-  
-    gd = xldev_to_gendisk(dev);
-    part = &gd->part[MINOR(dev)]; 
-
-    switch ( command )
-    {
-    case BLKGETSIZE:
-        DPRINTK_IOCTL("   BLKGETSIZE: %x %lx\n", BLKGETSIZE, part->nr_sects); 
-       return put_user(part->nr_sects, (unsigned long *) argument);
-
-    case BLKRRPART:                               /* re-read partition table */
-        DPRINTK_IOCTL("   BLKRRPART: %x\n", BLKRRPART); 
-        return xenolinux_block_revalidate(dev);
-
-    case BLKSSZGET:
-       switch ( MAJOR(dev) )
-        {
-       case XLIDE_MAJOR_0: 
-           DPRINTK_IOCTL("   BLKSSZGET: %x 0x%x\n", BLKSSZGET, 
-                         xlide_hwsect(MINOR(dev)));
-           return xlide_hwsect(MINOR(dev)); 
-
-       case XLSCSI_MAJOR: 
-           DPRINTK_IOCTL("   BLKSSZGET: %x 0x%x\n", BLKSSZGET,
-                         xlscsi_hwsect(MINOR(dev)));
-           return xlscsi_hwsect(MINOR(dev)); 
-
-        case XLVIRT_MAJOR:
-           DPRINTK_IOCTL("   BLKSSZGET: %x 0x%x\n", BLKSSZGET, 
-                         xlsegment_hwsect(MINOR(dev)));
-           return xlsegment_hwsect(MINOR(dev)); 
-
-       default: 
-           printk(KERN_ALERT "BLKSSZGET ioctl() on bogus disk!\n"); 
-            return 0;
-       }
-
-    case BLKBSZGET:                                        /* get block size */
-        DPRINTK_IOCTL("   BLKBSZGET: %x\n", BLKBSZGET);
-        break;
-
-    case BLKBSZSET:                                        /* set block size */
-        DPRINTK_IOCTL("   BLKBSZSET: %x\n", BLKBSZSET);
-       break;
-
-    case BLKRASET:                                         /* set read-ahead */
-        DPRINTK_IOCTL("   BLKRASET: %x\n", BLKRASET);
-       break;
-
-    case BLKRAGET:                                         /* get read-ahead */
-        DPRINTK_IOCTL("   BLKRAFET: %x\n", BLKRAGET);
-       break;
-
-    case HDIO_GETGEO:
-        /* note: these values are complete garbage */
-        DPRINTK_IOCTL("   HDIO_GETGEO: %x\n", HDIO_GETGEO);
-       if (!argument) return -EINVAL;
-       if (put_user(0x00,  (unsigned long *) &geo->start)) return -EFAULT;
-       if (put_user(0xff,  (byte *)&geo->heads)) return -EFAULT;
-       if (put_user(0x3f,  (byte *)&geo->sectors)) return -EFAULT;
-       if (put_user(0x106, (unsigned short *)&geo->cylinders)) return -EFAULT;
-       return 0;
-
-    case HDIO_GETGEO_BIG: 
-        /* note: these values are complete garbage */
-        DPRINTK_IOCTL("   HDIO_GETGEO_BIG: %x\n", HDIO_GETGEO_BIG);
-       if (!argument) return -EINVAL;
-       if (put_user(0x00,  (unsigned long *) &geo->start))  return -EFAULT;
-       if (put_user(0xff,  (byte *)&geo->heads))   return -EFAULT;
-       if (put_user(0x3f,  (byte *)&geo->sectors)) return -EFAULT;
-       if (put_user(0x106, (unsigned int *) &geo->cylinders)) return -EFAULT;
-       return 0;
-
-    case CDROMMULTISESSION:
-        printk("FIXME: support multisession CDs later\n");
-        memset((struct cdrom_multisession *)argument, 0, 
-               sizeof(struct cdrom_multisession));
-        return 0;
-
-    default:
-        printk("ioctl %08x not supported by xl_block\n", command);
-       return -ENOSYS;
-    }
-    
-    return 0;
-}
-
-int xenolinux_block_check(kdev_t dev)
-{
-    DPRINTK("xenolinux_block_check\n");
-    return 0;
-}
-
-int xenolinux_block_revalidate(kdev_t dev)
-{
-    struct gendisk *gd = xldev_to_gendisk(dev);
-    xl_disk_t *disk = xldev_to_xldisk(dev);
-    unsigned long flags;
-    int i, partn_shift = PARTN_SHIFT(dev);
-    int xdev = dev & XENDEV_IDX_MASK;
-    
-    DPRINTK("xenolinux_block_revalidate: %d %d %d\n", 
-           dev, xdev, XENDEV_IDX_MASK);
-
-    spin_lock_irqsave(&io_request_lock, flags);
-    if ( disk->usage > 1 )
-    {
-        spin_unlock_irqrestore(&io_request_lock, flags);
-        return -EBUSY;
-    }
-    spin_unlock_irqrestore(&io_request_lock, flags);
-
-    for ( i = 0; i < (1 << partn_shift); i++ )
-    {
-        invalidate_device(xdev + i, 1);
-        gd->part[xdev + i].start_sect = 0;
-        gd->part[xdev + i].nr_sects = 0;
-    }
-
-    grok_partitions(gd, MINOR(dev) >> partn_shift,
-                    1 << partn_shift, disk->capacity);
-
-    return 0;
-}
-
-
-/*
- * hypervisor_request
- *
- * request block io 
- * 
- * id: for guest use only.
- * operation: XEN_BLOCK_{READ,WRITE,PROBE*,SEG*}
- * buffer: buffer to read/write into. this should be a
- *   virtual address in the guest os.
- */
-static int hypervisor_request(unsigned long   id,
-                              int             operation,
-                              char *          buffer,
-                              unsigned long   sector_number,
-                              unsigned short  nr_sectors,
-                              kdev_t          device)
-{
-    unsigned long buffer_ma = phys_to_machine(virt_to_phys(buffer)); 
-    kdev_t phys_device = (kdev_t) 0;
-    struct gendisk *gd;
-    blk_ring_req_entry_t *req;
-    struct buffer_head *bh;
-
-    if ( nr_sectors >= (1<<9) ) BUG();
-    if ( (buffer_ma & ((1<<9)-1)) != 0 ) BUG();
-
-    switch ( operation )
-    {
-    case XEN_BLOCK_SEG_CREATE:
-    case XEN_BLOCK_SEG_DELETE:
-    case XEN_BLOCK_PHYSDEV_GRANT:
-    case XEN_BLOCK_PHYSDEV_PROBE:
-    case XEN_BLOCK_PROBE_BLK:
-    case XEN_BLOCK_PROBE_SEG:
-    case XEN_BLOCK_PROBE_SEG_ALL:
-        if ( RING_FULL ) return 1;
-       phys_device = (kdev_t) 0;
-       sector_number = 0;
-        DISABLE_SCATTERGATHER();
-        break;
-
-    case XEN_BLOCK_READ:
-    case XEN_BLOCK_WRITE:
-        phys_device = xldev_to_physdev(device);
-       gd = xldev_to_gendisk(device); 
-
-       sector_number += gd->part[MINOR(device)].start_sect;
-        if ( (sg_operation == operation) &&
-             (sg_dev == phys_device) &&
-             (sg_next_sect == sector_number) )
-        {
-            req = &blk_ring->ring[(req_prod-1)&(BLK_RING_SIZE-1)].req;
-            bh = (struct buffer_head *)id;
-            bh->b_reqnext = (struct buffer_head *)req->id;
-            req->id = id;
-            req->buffer_and_sects[req->nr_segments] = buffer_ma | nr_sectors;
-            if ( ++req->nr_segments < MAX_BLK_SEGS )
-                sg_next_sect += nr_sectors;
-            else
-                DISABLE_SCATTERGATHER();
-            return 0;
-        }
-        else if ( RING_FULL )
-        {
-            return 1;
-        }
-        else
-        {
-            sg_operation = operation;
-            sg_dev       = phys_device;
-            sg_next_sect = sector_number + nr_sectors;
-        }
-        break;
-
-    default:
-        panic("unknown op %d\n", operation);
-    }
-
-    /* Fill out a communications ring structure. */
-    req = &blk_ring->ring[req_prod].req;
-    req->id            = id;
-    req->operation     = operation;
-    req->sector_number = sector_number;
-    req->device        = phys_device;
-    req->nr_segments   = 1;
-    req->buffer_and_sects[0] = buffer_ma | nr_sectors;
-    req_prod = BLK_RING_INC(req_prod);
-
-    return 0;
-}
-
-
-/*
- * do_xlblk_request
- *  read a block; request is in a request queue
- */
-void do_xlblk_request(request_queue_t *rq)
-{
-    struct request *req;
-    struct buffer_head *bh, *next_bh;
-    int rw, nsect, full, queued = 0;
-    
-    DPRINTK("xlblk.c::do_xlblk_request for '%s'\n", DEVICE_NAME); 
-
-    while ( !rq->plugged && !list_empty(&rq->queue_head))
-    {
-       if ( (req = blkdev_entry_next_request(&rq->queue_head)) == NULL ) 
-           goto out;
-               
-        DPRINTK("do_xlblk_request %p: cmd %i, sec %lx, (%li/%li) bh:%p\n",
-                req, req->cmd, req->sector,
-                req->current_nr_sectors, req->nr_sectors, req->bh);
-
-        rw = req->cmd;
-        if ( rw == READA ) rw = READ;
-        if ((rw != READ) && (rw != WRITE))
-            panic("XenoLinux Virtual Block Device: bad cmd: %d\n", rw);
-
-       req->errors = 0;
-
-        bh = req->bh;
-        while ( bh != NULL )
-       {
-            next_bh = bh->b_reqnext;
-            bh->b_reqnext = NULL;
-
-            full = hypervisor_request(
-                (unsigned long)bh,
-                (rw == READ) ? XEN_BLOCK_READ : XEN_BLOCK_WRITE, 
-                bh->b_data, bh->b_rsector, bh->b_size>>9, bh->b_rdev);
-
-            if ( full )
-            {
-                bh->b_reqnext = next_bh;
-                pending_queues[nr_pending++] = rq;
-                if ( nr_pending >= MAX_PENDING ) BUG();
-                goto out;
-            }
-
-            queued++;
-
-            /* Dequeue the buffer head from the request. */
-            nsect = bh->b_size >> 9;
-            bh = req->bh = next_bh;
-            
-            if ( bh != NULL )
-            {
-                /* There's another buffer head to do. Update the request. */
-                req->hard_sector += nsect;
-                req->hard_nr_sectors -= nsect;
-                req->sector = req->hard_sector;
-                req->nr_sectors = req->hard_nr_sectors;
-                req->current_nr_sectors = bh->b_size >> 9;
-                req->buffer = bh->b_data;
-            }
-            else
-            {
-                /* That was the last buffer head. Finalise the request. */
-                if ( end_that_request_first(req, 1, "XenBlk") ) BUG();
-                blkdev_dequeue_request(req);
-                end_that_request_last(req);
-            }
-        }
-    }
-
- out:
-    if ( queued != 0 ) signal_requests_to_xen();
-}
-
-
-static void xlblk_response_int(int irq, void *dev_id, struct pt_regs *ptregs)
-{
-    int i; 
-    unsigned long flags; 
-    struct buffer_head *bh, *next_bh;
-    
-    spin_lock_irqsave(&io_request_lock, flags);            
-
-    for ( i  = resp_cons;
-         i != blk_ring->resp_prod;
-         i  = BLK_RING_INC(i) )
-    {
-       blk_ring_resp_entry_t *bret = &blk_ring->ring[i].resp;
-       switch (bret->operation)
-       {
-        case XEN_BLOCK_READ:
-        case XEN_BLOCK_WRITE:
-            if ( bret->status )
-                DPRINTK("Bad return from blkdev data request: %lx\n",
-                        bret->status);
-            for ( bh = (struct buffer_head *)bret->id; 
-                  bh != NULL; 
-                  bh = next_bh )
-            {
-                next_bh = bh->b_reqnext;
-                bh->b_reqnext = NULL;
-                bh->b_end_io(bh, !bret->status);
-            }
-           break;
-           
-        case XEN_BLOCK_SEG_CREATE:
-        case XEN_BLOCK_SEG_DELETE:
-        case XEN_BLOCK_PROBE_SEG:
-       case XEN_BLOCK_PROBE_SEG_ALL:
-        case XEN_BLOCK_PROBE_BLK:
-       case XEN_BLOCK_PHYSDEV_GRANT:
-       case XEN_BLOCK_PHYSDEV_PROBE:
-            xlblk_control_msg_pending = bret->status;
-            break;
-         
-        default:
-            BUG();
-       }
-    }
-    
-    resp_cons = i;
-
-    /* We kick pending request queues if the ring is reasonably empty. */
-    if ( (nr_pending != 0) && 
-         (((req_prod - resp_cons) & (BLK_RING_SIZE - 1)) < 
-          (BLK_RING_SIZE >> 1)) )
-    {
-        /* Attempt to drain the queue, but bail if the ring becomes full. */
-        while ( nr_pending != 0 )
-        {
-            do_xlblk_request(pending_queues[--nr_pending]);
-            if ( RING_FULL ) break;
-        }
-    }
-
-    spin_unlock_irqrestore(&io_request_lock, flags);
-}
-
-
-/* Send a synchronous message to Xen. */
-int xenolinux_control_msg(int operation, char *buffer, int size)
-{
-    unsigned long flags;
-    char *aligned_buf;
-
-    /* We copy from an aligned buffer, as interface needs sector alignment. */
-    aligned_buf = (char *)get_free_page(GFP_KERNEL);
-    if ( aligned_buf == NULL ) BUG();
-    memcpy(aligned_buf, buffer, size);
-
-    xlblk_control_msg_pending = 2;
-    spin_lock_irqsave(&io_request_lock, flags);
-    /* Note that size gets rounded up to a sector-sized boundary. */
-    if ( hypervisor_request(0, operation, aligned_buf, 0, (size+511)/512, 0) )
-        return -EAGAIN;
-    signal_requests_to_xen();
-    spin_unlock_irqrestore(&io_request_lock, flags);
-    while ( xlblk_control_msg_pending == 2 ) barrier();
-
-    memcpy(buffer, aligned_buf, size);
-    free_page((unsigned long)aligned_buf);
-    
-    return xlblk_control_msg_pending ? -EINVAL : 0;
-}
-
-
-int __init xlblk_init(void)
-{
-    int error;
-
-    xlblk_control_msg_pending = 0;
-    nr_pending = 0;
-
-    /* This mapping was created early at boot time. */
-    blk_ring = (blk_ring_t *)fix_to_virt(FIX_BLKRING_BASE);
-    blk_ring->req_prod = blk_ring->resp_prod = resp_cons = req_prod = 0;
-    
-    error = request_irq(XLBLK_RESPONSE_IRQ, xlblk_response_int, 
-                        SA_SAMPLE_RANDOM, "blkdev", NULL);
-    if ( error )
-    {
-       printk(KERN_ALERT "Could not allocate receive interrupt\n");
-       goto fail;
-    }
-
-    /* Probe for disk information. */
-    memset(&xlblk_disk_info, 0, sizeof(xlblk_disk_info));
-    error = xenolinux_control_msg(XEN_BLOCK_PROBE_BLK, 
-                                  (char *)&xlblk_disk_info,
-                                  sizeof(xen_disk_info_t));
-    if ( error )
-    {
-        printk(KERN_ALERT "Could not probe disks (%d)\n", error);
-        free_irq(XLBLK_RESPONSE_IRQ, NULL);
-        goto fail;
-    }
-
-    /* Pass the information to our fake IDE and SCSI susbystems. */
-    xlide_init(&xlblk_disk_info);
-    xlscsi_init(&xlblk_disk_info);
-
-    return 0;
-
- fail:
-    return error;
-}
-
-static void __exit xlblk_cleanup(void)
-{
-    xlide_cleanup();
-    xlscsi_cleanup();
-    free_irq(XLBLK_RESPONSE_IRQ, NULL);
-}
-
-
-#ifdef MODULE
-module_init(xlblk_init);
-module_exit(xlblk_cleanup);
-#endif
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_block.h b/xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_block.h
deleted file mode 100644 (file)
index 00056bf..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-/******************************************************************************
- * xl_block.h
- * 
- * Shared definitions between all levels of XenoLinux Virtual block devices.
- */
-
-#ifndef __XL_BLOCK_H__
-#define __XL_BLOCK_H__
-
-#include <linux/config.h>
-#include <linux/module.h>
-
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/slab.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-
-#include <linux/fs.h>
-#include <linux/hdreg.h>
-#include <linux/blkdev.h>
-#include <linux/major.h>
-
-#include <asm/hypervisor-ifs/block.h>
-#include <asm/hypervisor-ifs/hypervisor-if.h>
-#include <asm/io.h>
-#include <asm/atomic.h>
-#include <asm/uaccess.h>
-
-#if 0
-#define DPRINTK(_f, _a...) printk ( KERN_ALERT _f , ## _a )
-#else
-#define DPRINTK(_f, _a...) ((void)0)
-#endif
-
-#if 0
-#define DPRINTK_IOCTL(_f, _a...) printk ( KERN_ALERT _f , ## _a )
-#else
-#define DPRINTK_IOCTL(_f, _a...) ((void)0)
-#endif
-
-/* XL IDE and SCSI use same major/minor numbers as normal Linux devices. */
-#define XLIDE_MAJOR_0 IDE0_MAJOR
-#define XLIDE_MAJOR_1 IDE1_MAJOR
-#define XLSCSI_MAJOR SCSI_DISK0_MAJOR
-
-#define XLIDE_PARTN_SHIFT  6
-#define XLSCSI_PARTN_SHIFT 4
-#define XLVIRT_PARTN_SHIFT 4
-
-static inline int PARTN_SHIFT(kdev_t dev)
-{
-    switch ( MAJOR(dev) )
-    {
-    case XLIDE_MAJOR_0:
-    case XLIDE_MAJOR_1:
-        return XLIDE_PARTN_SHIFT;
-    case XLSCSI_MAJOR:
-        return XLSCSI_PARTN_SHIFT;
-    case XLVIRT_MAJOR:
-        return XLVIRT_PARTN_SHIFT;
-    default:
-        BUG();
-    }
-}
-
-#define XLIDE_DEVS_PER_MAJOR   2
-#define XLSCSI_DEVS_PER_MAJOR 16
-#define XLVIRT_DEVS_PER_MAJOR 16
-
-/*
- * We have one of these per XL-IDE, XL-SCSI, and XL-VIRT device.
- * They hang in an array off the gendisk structure. We may end up putting
- * all kinds of interesting stuff here :-)
- */
-typedef struct xl_disk {
-    int usage;
-    unsigned long capacity;
-} xl_disk_t;
-
-/* Generic layer. */
-extern int xenolinux_control_msg(int operration, char *buffer, int size);
-extern int xenolinux_block_open(struct inode *inode, struct file *filep);
-extern int xenolinux_block_release(struct inode *inode, struct file *filep);
-extern int xenolinux_block_ioctl(struct inode *inode, struct file *filep,
-                                unsigned command, unsigned long argument);
-extern int xenolinux_block_check(kdev_t dev);
-extern int xenolinux_block_revalidate(kdev_t dev);
-extern void do_xlblk_request (request_queue_t *rq); 
-
-/* Fake IDE subsystem. */
-extern int  xlide_init(xen_disk_info_t *xdi);
-extern int  xlide_hwsect(int minor); 
-extern void xlide_cleanup(void); 
-extern struct gendisk *xlide_gendisk[];
-
-/* Fake SCSI subsystem. */
-extern int  xlscsi_init(xen_disk_info_t *xdi);
-extern int  xlscsi_hwsect(int minor); 
-extern void xlscsi_cleanup(void); 
-extern struct gendisk *xlscsi_gendisk;
-
-/* Virtual block-device subsystem. */
-extern int  xlsegment_hwsect(int minor); 
-extern struct gendisk *xlsegment_gendisk;
-
-extern unsigned short xldev_to_physdev(kdev_t xldev);
-extern kdev_t physdev_to_xldev(unsigned short physdev);
-
-#endif /* __XL_BLOCK_H__ */
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_ide.c b/xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_ide.c
deleted file mode 100644 (file)
index 714c6bf..0000000
+++ /dev/null
@@ -1,204 +0,0 @@
-/******************************************************************************
- * xl_ide.c
- * 
- * Xenolinux virtual IDE block-device driver.
- */
-
-#include "xl_block.h"
-#include <linux/blk.h>
-
-#define XLIDE_MAX         256
-#define XLIDE_MAJOR_NAME "hd"
-static int xlide_blksize_size[XLIDE_MAX];
-static int xlide_hardsect_size[XLIDE_MAX];
-static int xlide_max_sectors[XLIDE_MAX];
-
-#define XLIDE_NR_MAJORS     2
-
-struct gendisk *xlide_gendisk[XLIDE_NR_MAJORS] = { NULL };
-
-static struct block_device_operations xlide_block_fops = 
-{
-    open:               xenolinux_block_open,
-    release:            xenolinux_block_release,
-    ioctl:              xenolinux_block_ioctl,
-    check_media_change: xenolinux_block_check,
-    revalidate:         xenolinux_block_revalidate,
-};
-
-int xlide_hwsect(int minor) 
-{
-    return xlide_hardsect_size[minor]; 
-} 
-
-static int get_major(int major)
-{
-    int r = register_blkdev(major, XLIDE_MAJOR_NAME, &xlide_block_fops);
-    if ( r < 0 )
-        printk (KERN_ALERT "XL IDE: can't get major %d\n", XLIDE_MAJOR_0);
-    return r;
-}
-
-static void setup_major(struct gendisk **pgd, 
-                        xen_disk_info_t *xdi, int base, int major)
-{
-    int i, minors, disk, units = XLIDE_DEVS_PER_MAJOR;
-    unsigned short minor; 
-    unsigned char buf[64];
-    struct gendisk *gd;
-
-    blk_size[major]      = NULL;
-    blksize_size[major]  = xlide_blksize_size + base*(1<<XLIDE_PARTN_SHIFT);
-    hardsect_size[major] = xlide_hardsect_size + base*(1<<XLIDE_PARTN_SHIFT);
-    max_sectors[major]   = xlide_max_sectors + base*(1<<XLIDE_PARTN_SHIFT);
-    read_ahead[major]    = 8;
-
-    blk_init_queue(BLK_DEFAULT_QUEUE(major), do_xlblk_request);
-
-    /*
-     * Turn off barking 'headactive' mode. We dequeue buffer heads as soon as 
-     * we pass them down to Xen.
-     */
-    blk_queue_headactive(BLK_DEFAULT_QUEUE(major), 0);
-
-    /* Construct an appropriate gendisk structure. */
-    minors    = units * (1<<XLIDE_PARTN_SHIFT);
-    gd        = kmalloc(sizeof(struct gendisk), GFP_KERNEL);
-    gd->sizes = kmalloc(minors * sizeof(int), GFP_KERNEL);
-    gd->part  = kmalloc(minors * sizeof(struct hd_struct), GFP_KERNEL);
-    gd->major        = major;
-    gd->major_name   = XLIDE_MAJOR_NAME;
-    gd->minor_shift  = XLIDE_PARTN_SHIFT; 
-    gd->max_p       = 1<<XLIDE_PARTN_SHIFT;
-    gd->nr_real             = units;           
-    gd->real_devices = kmalloc(units * sizeof(xl_disk_t), GFP_KERNEL);
-    gd->next        = NULL;            
-    gd->fops         = &xlide_block_fops;
-    gd->de_arr       = kmalloc(sizeof(*gd->de_arr) * units, GFP_KERNEL);
-    gd->flags       = kmalloc(sizeof(*gd->flags) * units, GFP_KERNEL);
-    memset(gd->sizes, 0, minors * sizeof(int));
-    memset(gd->part,  0, minors * sizeof(struct hd_struct));
-    memset(gd->de_arr, 0, sizeof(*gd->de_arr) * units);
-    memset(gd->flags, 0, sizeof(*gd->flags) * units);
-    memset(gd->real_devices, 0, sizeof(xl_disk_t) * units);
-    *pgd = gd;
-    add_gendisk(gd);
-    
-    /* Now register each disk in turn. */
-    for ( i = 0; i < xdi->count; i++ )
-    {
-        disk  = xdi->disks[i].device & XENDEV_IDX_MASK;
-        minor = (disk-base) << XLIDE_PARTN_SHIFT; 
-
-        if ( !IS_IDE_XENDEV(xdi->disks[i].device) ||
-             (disk < base) || (disk >= (base + XLIDE_DEVS_PER_MAJOR)) ) 
-            continue;
-
-        ((xl_disk_t *)gd->real_devices)[disk].capacity =
-            xdi->disks[i].capacity;
-
-        switch (xdi->disks[i].type) 
-        { 
-        case XD_TYPE_CDROM:
-            set_device_ro(MKDEV(major, minor), 1); 
-
-        case XD_TYPE_FLOPPY: 
-        case XD_TYPE_TAPE:
-            gd->flags[disk] = GENHD_FL_REMOVABLE; 
-            printk(KERN_ALERT "Skipping partition check on %s /dev/%s\n", 
-                   xdi->disks[i].type==XD_TYPE_CDROM ? "cdrom" : 
-                   (xdi->disks[i].type==XD_TYPE_TAPE ? "tape" : "floppy"), 
-                   disk_name(gd, minor, buf)); 
-            break; 
-
-        case XD_TYPE_DISK: 
-            register_disk(gd, 
-                          MKDEV(major, minor), 
-                          1<<XLIDE_PARTN_SHIFT, 
-                          &xlide_block_fops, xdi->disks[i].capacity);
-            break; 
-
-        default: 
-            printk(KERN_ALERT "XenoLinux: unknown ide device type %d\n", 
-                   xdi->disks[i].type); 
-            break; 
-        }
-    }
-
-    return;
-}
-
-
-int xlide_init(xen_disk_info_t *xdi) 
-{
-    int i, units;
-
-    /* If we don't have any usable IDE devices we may as well bail now. */
-    units = 0;
-    for ( i = 0; i < xdi->count; i++ )
-        if ( IS_IDE_XENDEV(xdi->disks[i].device) &&
-             ((xdi->disks[i].device & XENDEV_IDX_MASK) <
-              (XLIDE_NR_MAJORS*XLIDE_DEVS_PER_MAJOR)) ) 
-            units++;
-    if ( units == 0 ) return 0;
-
-    SET_MODULE_OWNER(&xlide_block_fops);
-    
-    if ( get_major(XLIDE_MAJOR_0) < 0 )
-        return 0;
-    if ( get_major(XLIDE_MAJOR_1) < 0 )
-    {
-        (void)unregister_blkdev(XLIDE_MAJOR_0, XLIDE_MAJOR_NAME);
-        return 0;
-    }
-
-    /* Initialize global arrays. */
-    for ( i = 0; i < XLIDE_MAX; i++ )
-    {
-        xlide_blksize_size[i]  = 512;
-        xlide_hardsect_size[i] = 512;
-        xlide_max_sectors[i]   = 128;
-    }
-
-    setup_major(&xlide_gendisk[0], xdi, 0*XLIDE_DEVS_PER_MAJOR, XLIDE_MAJOR_0);
-    setup_major(&xlide_gendisk[1], xdi, 1*XLIDE_DEVS_PER_MAJOR, XLIDE_MAJOR_1);
-
-    return 0;
-}
-
-
-static void cleanup_major(int major)
-{
-    blk_cleanup_queue(BLK_DEFAULT_QUEUE(major));
-
-    read_ahead[major] = 0;
-
-    if ( blksize_size[major] != NULL )
-    { 
-       kfree(blksize_size[major]);
-        blksize_size[major] = NULL;
-    }
-
-    if ( hardsect_size[major] != NULL )
-    { 
-       kfree(hardsect_size[major]);
-        hardsect_size[major] = NULL;
-    }
-    
-    if ( max_sectors[major] != NULL )
-    { 
-       kfree(max_sectors[major]);
-        max_sectors[major] = NULL;
-    }
-    
-    (void)unregister_blkdev(major, XLIDE_MAJOR_NAME);
-}
-
-void xlide_cleanup(void)
-{
-    if ( xlide_gendisk[0] == NULL ) return;
-    xlide_gendisk[0] = NULL;
-    cleanup_major(XLIDE_MAJOR_0);
-    cleanup_major(XLIDE_MAJOR_1);
-}
-
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_scsi.c b/xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_scsi.c
deleted file mode 100644 (file)
index c0f389f..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-/******************************************************************************
- * xl_scsi.c
- * 
- * Xenolinux virtual SCSI block-device driver.
- */
-
-#include "xl_block.h"
-
-#define MAJOR_NR XLSCSI_MAJOR
-#include <linux/blk.h>
-
-#define XLSCSI_MAX        256
-#define XLSCSI_MAJOR_NAME "sd"
-static int xlscsi_blksize_size[XLSCSI_MAX];
-static int xlscsi_hardsect_size[XLSCSI_MAX];
-static int xlscsi_max_sectors[XLSCSI_MAX];
-
-struct gendisk *xlscsi_gendisk = NULL;
-
-static struct block_device_operations xlscsi_block_fops = 
-{
-    open:               xenolinux_block_open,
-    release:            xenolinux_block_release,
-    ioctl:              xenolinux_block_ioctl,
-    check_media_change: xenolinux_block_check,
-    revalidate:         xenolinux_block_revalidate,
-};
-
-
-/* tiny inteface fn */
-int xlscsi_hwsect(int minor) 
-{
-    return xlscsi_hardsect_size[minor]; 
-} 
-
-
-int xlscsi_init(xen_disk_info_t *xdi) 
-{
-    int i, result, units, minors, disk;
-    struct gendisk *gd;
-
-    /* If we don't have any usable SCSI devices we may as well bail now. */
-    units = 0;
-    for ( i = 0; i < xdi->count; i++ )
-        if ( IS_SCSI_XENDEV(xdi->disks[i].device) &&
-             ((xdi->disks[i].device & XENDEV_IDX_MASK) <
-              XLSCSI_DEVS_PER_MAJOR) ) 
-            units++;
-    if ( units == 0 ) return 0;
-
-    SET_MODULE_OWNER(&xlscsi_block_fops);
-
-    result = register_blkdev(XLSCSI_MAJOR, XLSCSI_MAJOR_NAME, 
-                             &xlscsi_block_fops);
-    if ( result < 0 )
-    {
-       printk (KERN_ALERT "XL SCSI: can't get major %d\n", XLSCSI_MAJOR);
-       return result;
-    }
-
-    /* Initialize global arrays. */
-    for ( i = 0; i < XLSCSI_MAX; i++ )
-    {
-       xlscsi_blksize_size[i]  = 1024; //XXX 512;
-       xlscsi_hardsect_size[i] = 512;
-       xlscsi_max_sectors[i]   = 128*8; //XXX 128
-    }
-
-    blk_size[XLSCSI_MAJOR]      = NULL;
-    blksize_size[XLSCSI_MAJOR]  = xlscsi_blksize_size;
-    hardsect_size[XLSCSI_MAJOR] = xlscsi_hardsect_size;
-    max_sectors[XLSCSI_MAJOR]   = xlscsi_max_sectors;
-    read_ahead[XLSCSI_MAJOR]    = 0; //XXX8;
-
-    blk_init_queue(BLK_DEFAULT_QUEUE(XLSCSI_MAJOR), do_xlblk_request);
-
-    /*
-     * Turn off barking 'headactive' mode. We dequeue buffer heads as
-     * soon as we pass them down to Xen.
-     */
-    blk_queue_headactive(BLK_DEFAULT_QUEUE(XLSCSI_MAJOR), 0);
-
-    units = XLSCSI_MAX >> XLSCSI_PARTN_SHIFT;
-
-    /* Construct an appropriate gendisk structure. */
-    minors    = units * (1<<XLSCSI_PARTN_SHIFT);
-    gd        = kmalloc(sizeof(struct gendisk), GFP_KERNEL);
-    gd->sizes = kmalloc(minors * sizeof(int), GFP_KERNEL);
-    gd->part  = kmalloc(minors * sizeof(struct hd_struct), GFP_KERNEL);
-    gd->major        = XLSCSI_MAJOR;
-    gd->major_name   = XLSCSI_MAJOR_NAME;
-    gd->minor_shift  = XLSCSI_PARTN_SHIFT; 
-    gd->max_p       = 1<<XLSCSI_PARTN_SHIFT;
-    gd->nr_real             = units;           
-    gd->real_devices = kmalloc(units * sizeof(xl_disk_t), GFP_KERNEL);
-    gd->next        = NULL;            
-    gd->fops         = &xlscsi_block_fops;
-    gd->de_arr       = kmalloc(sizeof(*gd->de_arr) * units, GFP_KERNEL);
-    gd->flags       = kmalloc(sizeof(*gd->flags) * units, GFP_KERNEL);
-    memset(gd->sizes, 0, minors * sizeof(int));
-    memset(gd->part,  0, minors * sizeof(struct hd_struct));
-    memset(gd->de_arr, 0, sizeof(*gd->de_arr) * units);
-    memset(gd->flags, 0, sizeof(*gd->flags) * units);
-    memset(gd->real_devices, 0, sizeof(xl_disk_t) * units);
-    xlscsi_gendisk = gd;
-    add_gendisk(gd);
-
-    /* Now register each disk in turn. */
-    for ( i = 0; i < xdi->count; i++ )
-    {
-        disk = xdi->disks[i].device & XENDEV_IDX_MASK;
-
-        if ( !IS_SCSI_XENDEV(xdi->disks[i].device) || 
-             (disk >= XLSCSI_DEVS_PER_MAJOR) )
-            continue;
-
-        ((xl_disk_t *)gd->real_devices)[disk].capacity =
-            xdi->disks[i].capacity;
-        register_disk(gd,
-                      MKDEV(XLSCSI_MAJOR, disk<<XLSCSI_PARTN_SHIFT), 
-                      1<<XLSCSI_PARTN_SHIFT, 
-                      &xlscsi_block_fops, 
-                      xdi->disks[i].capacity);
-    }
-   
-    printk(KERN_ALERT 
-          "XenoLinux Virtual SCSI Device Driver installed [device: %d]\n",
-          XLSCSI_MAJOR);
-
-    return 0;
-}
-
-
-void xlscsi_cleanup(void)
-{
-    if ( xlscsi_gendisk == NULL ) return;
-
-    blk_cleanup_queue(BLK_DEFAULT_QUEUE(XLSCSI_MAJOR));
-
-    xlscsi_gendisk = NULL;
-
-    read_ahead[XLSCSI_MAJOR] = 0;
-
-    if ( blksize_size[XLSCSI_MAJOR] != NULL )
-    { 
-       kfree(blksize_size[XLSCSI_MAJOR]);
-        blksize_size[XLSCSI_MAJOR] = NULL;
-    }
-
-    if ( hardsect_size[XLSCSI_MAJOR] != NULL )
-    { 
-       kfree(hardsect_size[XLSCSI_MAJOR]);
-        hardsect_size[XLSCSI_MAJOR] = NULL;
-    }
-    
-    if ( max_sectors[XLSCSI_MAJOR] != NULL )
-    { 
-       kfree(max_sectors[XLSCSI_MAJOR]);
-        max_sectors[XLSCSI_MAJOR] = NULL;
-    }
-    
-    if ( unregister_blkdev(XLSCSI_MAJOR, XLSCSI_MAJOR_NAME) != 0 )
-    {
-       printk(KERN_ALERT
-              "XenoLinux Virtual SCSI Device Driver uninstalled w/ errs\n");
-    }
-}
-
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_segment.c b/xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_segment.c
deleted file mode 100644 (file)
index e746e2d..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-/******************************************************************************
- * xl_segment.c
- * 
- * Xenolinux virtual block-device driver (xvd).
- * 
- */
-
-#include "xl_block.h"
-
-#define MAJOR_NR XLVIRT_MAJOR
-#include <linux/blk.h>
-
-/* Copied from linux/ide.h */
-typedef unsigned char byte; 
-
-#define XLVIRT_MAX        256
-#define XLVIRT_MAJOR_NAME "xvd"
-static int xlseg_blksize_size[XLVIRT_MAX];
-static int xlseg_hardsect_size[XLVIRT_MAX];
-static int xlseg_max_sectors[XLVIRT_MAX];
-
-struct gendisk *xlsegment_gendisk = NULL;
-
-static xen_disk_info_t xlseg_disk_info;
-
-static struct block_device_operations xlsegment_block_fops = 
-{
-    open:               xenolinux_block_open,
-    release:            xenolinux_block_release,
-    ioctl:              xenolinux_block_ioctl,
-    check_media_change: xenolinux_block_check,
-    revalidate:         xenolinux_block_revalidate,
-};
-
-
-int xlsegment_hwsect(int minor) 
-{
-    return xlseg_hardsect_size[minor]; 
-} 
-
-
-int __init xlseg_init(void)
-{
-    int i, result, units, minors, disk;
-    xen_disk_info_t *xdi = &xlseg_disk_info;
-    struct gendisk *gd;
-
-    SET_MODULE_OWNER(&xlsegment_block_fops);
-
-    /* Probe for disk information. */
-    memset(xdi, 0, sizeof(*xdi));
-    xenolinux_control_msg(XEN_BLOCK_PROBE_SEG, (char *)xdi, sizeof(*xdi));
-
-    DPRINTK("xvd block device probe:\n");
-    for ( i = 0; i < xdi->count; i++ )
-    { 
-       DPRINTK("  %2d: device: %d, capacity: %ld\n",
-               i, xdi->disks[i].device, xdi->disks[i].capacity);
-    }
-
-    result = register_blkdev(XLVIRT_MAJOR, XLVIRT_MAJOR_NAME,
-                             &xlsegment_block_fops);
-    if ( result < 0 )
-    {
-       printk(KERN_ALERT "XL Segment: can't get major %d\n", XLVIRT_MAJOR);
-       return result;
-    }
-
-    /* Initialize global arrays. */
-    for (i = 0; i < XLVIRT_MAX; i++) 
-    {
-        xlseg_blksize_size[i]  = 512;
-        xlseg_hardsect_size[i] = 512;
-        xlseg_max_sectors[i]   = 128;
-    }
-
-    blk_size[XLVIRT_MAJOR]      = NULL;
-    blksize_size[XLVIRT_MAJOR]  = xlseg_blksize_size;
-    hardsect_size[XLVIRT_MAJOR] = xlseg_hardsect_size;
-    max_sectors[XLVIRT_MAJOR]   = xlseg_max_sectors;
-    read_ahead[XLVIRT_MAJOR]    = 8;
-
-    blk_init_queue(BLK_DEFAULT_QUEUE(XLVIRT_MAJOR), do_xlblk_request);
-
-    /*
-     * Turn off barking 'headactive' mode. We dequeue buffer heads as
-     * soon as we pass them down to Xen.
-     */
-    blk_queue_headactive(BLK_DEFAULT_QUEUE(XLVIRT_MAJOR), 0);
-
-    units = XLVIRT_MAX >> XLVIRT_PARTN_SHIFT;
-
-    /* Construct an appropriate gendisk structure. */
-    minors    = units * (1<<XLVIRT_PARTN_SHIFT);
-    gd        = kmalloc(sizeof(struct gendisk), GFP_KERNEL);
-    gd->sizes = kmalloc(minors * sizeof(int), GFP_KERNEL);
-    gd->part  = kmalloc(minors * sizeof(struct hd_struct), GFP_KERNEL);
-    gd->major        = XLVIRT_MAJOR;
-    gd->major_name   = XLVIRT_MAJOR_NAME;
-    gd->minor_shift  = XLVIRT_PARTN_SHIFT; 
-    gd->max_p       = 1<<XLVIRT_PARTN_SHIFT;
-    gd->nr_real             = units;           
-    gd->real_devices = kmalloc(units * sizeof(xl_disk_t), GFP_KERNEL);
-    gd->next        = NULL;            
-    gd->fops         = &xlsegment_block_fops;
-    gd->de_arr       = kmalloc(sizeof(*gd->de_arr) * units, GFP_KERNEL);
-    gd->flags       = kmalloc(sizeof(*gd->flags) * units, GFP_KERNEL);
-    memset(gd->sizes, 0, minors * sizeof(int));
-    memset(gd->part,  0, minors * sizeof(struct hd_struct));
-    memset(gd->de_arr, 0, sizeof(*gd->de_arr) * units);
-    memset(gd->flags, 0, sizeof(*gd->flags) * units);
-    memset(gd->real_devices, 0, sizeof(xl_disk_t) * units);
-    xlsegment_gendisk = gd;
-    add_gendisk(gd);
-
-    /* Now register each disk in turn. */
-    for ( i = 0; i < xdi->count; i++ )
-    {
-        disk = xdi->disks[i].device & XENDEV_IDX_MASK;
-
-        if ( !IS_VIRTUAL_XENDEV(xdi->disks[i].device) || 
-             (disk >= XLVIRT_DEVS_PER_MAJOR) )
-            continue;
-
-        ((xl_disk_t *)gd->real_devices)[disk].capacity =
-            xdi->disks[i].capacity;
-        register_disk(gd, 
-                      MKDEV(XLVIRT_MAJOR, disk<<XLVIRT_PARTN_SHIFT), 
-                      1<<XLVIRT_PARTN_SHIFT, 
-                      &xlsegment_block_fops, 
-                      xdi->disks[i].capacity);
-    }
-
-    printk(KERN_ALERT 
-          "XenoLinux Virtual Segment Device Driver installed [device: %d]\n",
-          XLVIRT_MAJOR);
-
-    return 0;
-}
-
-
-static void __exit xlseg_cleanup(void)
-{
-    if ( xlsegment_gendisk == NULL ) return;
-
-    blk_cleanup_queue(BLK_DEFAULT_QUEUE(XLVIRT_MAJOR));
-
-    xlsegment_gendisk = NULL;
-
-    read_ahead[XLVIRT_MAJOR] = 0;
-
-    if ( blksize_size[XLVIRT_MAJOR] != NULL )
-    { 
-       kfree(blksize_size[XLVIRT_MAJOR]);
-        blksize_size[XLVIRT_MAJOR] = NULL;
-    }
-
-    if ( hardsect_size[XLVIRT_MAJOR] != NULL )
-    { 
-       kfree(hardsect_size[XLVIRT_MAJOR]);
-        hardsect_size[XLVIRT_MAJOR] = NULL;
-    }
-    
-    if ( max_sectors[XLVIRT_MAJOR] != NULL )
-    { 
-       kfree(max_sectors[XLVIRT_MAJOR]);
-        max_sectors[XLVIRT_MAJOR] = NULL;
-    }
-    
-    if ( unregister_blkdev(XLVIRT_MAJOR, XLVIRT_MAJOR_NAME) != 0 )
-    {
-       printk(KERN_ALERT
-              "XenoLinux Virtual Segment Device Driver"
-               " uninstalled w/ errs\n");
-    }
-}
-
-
-#ifdef MODULE
-module_init(xlseg_init);
-module_exit(xlseg_cleanup);
-#endif
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_segment_proc.c b/xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_segment_proc.c
deleted file mode 100644 (file)
index 4647073..0000000
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- * xl_segment_proc.c
- * 
- * XenoLinux virtual disk proc interface .
- */
-
-#include "xl_block.h"
-#include <linux/proc_fs.h>
-#include <linux/delay.h>
-#include <linux/seq_file.h>
-#include <asm/hypervisor-ifs/segment.h>
-
-static struct proc_dir_entry *vhd;
-
-static void *proc_vhd_next(struct seq_file *s, void *v, loff_t *pos)
-{
-    xen_segment_info_t *data;
-
-    if ( pos != NULL )
-        ++(*pos); 
-
-    data = v;
-    return data->count-- ? NULL : v;
-}
-
-static void *proc_vhd_start(struct seq_file *s, loff_t *ppos)
-{
-    loff_t pos = *ppos;
-    xen_segment_info_t *data;
-
-    data = kmalloc(sizeof(*data), GFP_KERNEL);
-    xenolinux_control_msg(XEN_BLOCK_PROBE_SEG_ALL, (char *)data, sizeof(*data));
-    data->count -= pos;
-
-    if (data->count > 0)
-       return data;
-
-    kfree(data);
-    return NULL;
-}
-
-static int proc_vhd_show(struct seq_file *s, void *v)
-{ 
-    xen_segment_info_t *data = v;
-
-    seq_printf (s,
-               "%x %x %10.10s %x\n",
-               data->segments[data->count - 1].domain,
-               data->segments[data->count - 1].seg_nr,
-               data->segments[data->count - 1].key,
-               data->segments[data->count - 1].mode);
-
-    return 0;
-}
-
-static void proc_vhd_stop(struct seq_file *s, void *v)
-{
-  kfree(v);
-}
-
-static struct seq_operations proc_vhd_op = {
-    .start         = proc_vhd_start,
-    .next          = proc_vhd_next,
-    .show          = proc_vhd_show,
-    .stop          = proc_vhd_stop
-};
-
-static int proc_open_vhd(struct inode *inode, struct file *file)
-{
-    return seq_open(file, &proc_vhd_op);
-}
-
-
-#define isdelim(c) \
-  (c==' '||c==','||c=='\n'||c=='\r'||c=='\t'||c==':'||c=='('||c==')' ? 1 : 0)
-
-char *get_string(char *string)                          /* a bit like strtok */
-{
-    static char *temp;
-    int loop = 0;
-
-    if (string != NULL)        
-        temp = string;
-    else
-        string = temp;
-
- try_again:
-
-    while (!isdelim(string[loop]))
-    {
-        if (string[loop] == '\0')
-            return NULL;
-        loop++;
-    }
-
-    string[loop] = '\0';       
-    temp = (string + loop + 1);
-
-    if (loop == 0)
-    {
-        string = temp;
-        goto try_again;
-    }
-
-    return string;
-}
-
-
-#define isdigit(c) (c >= '0' && c <= '9' ? 1 : 0)
-unsigned long to_number(char *string)                                /* atoi */
-{
-    unsigned long value = 0;
-
-    if (string == NULL) return 0;
-
-    while (!isdigit(*string) && *string != '\0') string++;
-
-    while (isdigit(*string))
-    {
-        value = value * 10 + (*string - '0');
-        string++;
-    }
-
-    return value;
-}
-
-static int proc_write_vhd(struct file *file, const char *buffer,
-                         size_t count, loff_t *offp)
-{
-    char *local = kmalloc((count + 1) * sizeof(char), GFP_KERNEL);
-    char *string;
-    int loop;
-    xv_disk_t xvd;
-    int res;
-
-    if (!local)
-      return -ENOMEM;
-
-    memset (&xvd, 0, sizeof(xvd));
-
-    if (copy_from_user(local, buffer, count))
-    {
-       res = -EFAULT;
-       goto out;
-    }
-    local[count] = '\0';
-
-    res = count;
-    string = get_string(local); /* domain specifier */
-    if (string == NULL)
-    {
-       goto out;
-    }
-    if (*string != 'd' && *string != 'D')
-    {
-        printk (KERN_ALERT 
-                "error: domain specifier missing [%s]. should be \"domain\".\n",
-                string);
-       goto out;
-    }
-
-    string = get_string(NULL); /* domain number */
-    if (string == NULL)
-    {
-        printk (KERN_ALERT "error: domain number missing\n");
-       goto out;
-    }
-    xvd.domain = (int) to_number(string);
-
-    string = get_string(NULL);
-    if (string && (strcmp(string, "RO") == 0 || strcmp(string, "ro") == 0))
-    {
-        xvd.mode = XEN_DISK_READ_ONLY;
-    }
-    else if (string && (strcmp(string, "RW") == 0 || strcmp(string, "rw") == 0))
-    {
-        xvd.mode = XEN_DISK_READ_WRITE;
-    }
-    else
-    {
-        printk (KERN_ALERT 
-                "error: bad mode [%s]. should be \"rw\" or \"ro\".\n",
-                string);
-       goto out;
-    }
-
-    string = get_string(NULL);                           /* look for Segment */
-    if (string == NULL || (*string != 's' && *string != 'S'))
-    {
-        printk (KERN_ALERT 
-                "error: segment specifier missing [%s]. should be \"segment\".\n",
-                string);
-       goto out;
-    }
-
-    string = get_string(NULL);                             /* segment number */
-    if (string == NULL)
-    {
-        printk (KERN_ALERT "error: segment number missing\n");
-       goto out;
-    }
-    xvd.segment = (int) to_number(string);
-
-    string = get_string(NULL);                           /* look for key */
-    if (string == NULL || (*string != 'k' && *string != 'K'))
-    {
-        printk (KERN_ALERT 
-                "error: key specifier missing [%s]. should be \"key\".\n",
-                string);
-       goto out;
-    }
-    string = get_string(NULL);
-    if (string == NULL || strlen(string) != XEN_SEGMENT_KEYSIZE)
-    {
-       printk (KERN_ALERT "error: key missing\n");
-       goto out;
-    }
-    memcpy(xvd.key, string, XEN_SEGMENT_KEYSIZE);
-
-    string = get_string(NULL);                           /* look for Extents */
-    if (string == NULL || (*string != 'e' && *string != 'E'))
-    {
-        printk (KERN_ALERT 
-                "error: extents specifier missing [%s]. should be \"extents\".\n",
-                string);
-       goto out;
-    }
-
-    string = get_string(NULL);                          /* number of extents */
-    if (string == NULL)
-    {
-        printk (KERN_ALERT "error: number of extents missing\n");
-       goto out;
-    }
-    xvd.ext_count = (int) to_number(string);
-
-    /* ignore parenthesis */
-
-    for (loop = 0; loop < xvd.ext_count; loop++)
-    {
-        string = get_string(NULL);                          /* look for Disk */
-        if (string == NULL || (*string != 'd' && *string != 'D'))
-        {
-            printk (KERN_ALERT 
-                    "hmm, extent disk specifier missing [%s]. should be \"disk\".\n",
-                    string);
-           goto out;
-        }
-        string = get_string(NULL);                            /* disk number */
-        if (string == NULL)
-        {
-            printk (KERN_ALERT "error: disk number missing\n");
-           goto out;
-        }
-        xvd.extents[loop].disk = xldev_to_physdev((int) to_number(string));
-
-        string = get_string(NULL);                        /* look for Offset */
-        if (string == NULL || (*string != 'o' && *string != 'O'))
-        {
-            printk (KERN_ALERT 
-                    "error: disk offset missing [%s]. should be \"offset\".\n",
-                    string);
-           goto out;
-        }
-        string = get_string(NULL);                                 /* offset */
-        if (string == NULL)
-        {
-            printk (KERN_ALERT "error: offset missing\n");
-           goto out;
-        }
-        xvd.extents[loop].offset =  to_number(string);
-
-        string = get_string(NULL);                          /* look for Size */
-        if (string == NULL || (*string != 's' && *string != 'S'))
-        {
-            printk (KERN_ALERT 
-                    "error: extent size missing [%s]. should be \"size\".\n",
-                    string);
-           goto out;
-        }
-        string = get_string(NULL);                                   /* size */
-        if (string == NULL)
-        {
-            printk (KERN_ALERT "error: extent size missing\n");
-           goto out;
-        }
-        xvd.extents[loop].size =  to_number(string);
-    }
-
-    xenolinux_control_msg(XEN_BLOCK_SEG_CREATE, (char *)&xvd, sizeof(xvd));
-
- out:
-    kfree(local);
-
-    return res;
-}
-
-static struct file_operations proc_vhd_operations = {
-    open:         proc_open_vhd,
-    read:         seq_read,
-    llseek:       seq_lseek,
-    release:      seq_release,
-    write:        proc_write_vhd
-};
-
-/******************************************************************/
-
-int __init xlseg_proc_init(void)
-{
-    if ( !(start_info.flags & SIF_PRIVILEGED) )
-        return 0;
-
-    vhd = create_proc_entry("xeno/vhd", 0600, NULL);
-    if ( vhd == NULL )
-        panic ("xlseg_init: unable to create vhd proc entry\n");
-
-    vhd->data       = NULL;
-    vhd->proc_fops  = &proc_vhd_operations;
-    vhd->owner      = THIS_MODULE;
-
-    printk(KERN_ALERT "XenoLinux Virtual Disk Device Monitor installed\n");
-    return 0;
-}
-
-static void __exit xlseg_proc_cleanup(void)
-{
-    printk(KERN_ALERT "XenoLinux Virtual Disk Device Monitor uninstalled\n");
-}
-
-#ifdef MODULE
-module_init(xlseg_proc_init);
-module_exit(xlseg_proc_cleanup);
-#endif
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/drivers/console/Makefile b/xenolinux-2.4.21-sparse/arch/xeno/drivers/console/Makefile
deleted file mode 100644 (file)
index 546180a..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-O_TARGET := con.o
-obj-$(CONFIG_XEN_CONSOLE) := console.o
-include $(TOPDIR)/Rules.make
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/drivers/console/console.c b/xenolinux-2.4.21-sparse/arch/xeno/drivers/console/console.c
deleted file mode 100644 (file)
index e69cd24..0000000
+++ /dev/null
@@ -1,229 +0,0 @@
-/******************************************************************************
- * console.c
- */
-
-#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/errno.h>
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/tty.h>
-#include <linux/tty_flip.h>
-#include <linux/serial.h>
-#include <linux/major.h>
-#include <linux/ptrace.h>
-#include <linux/ioport.h>
-#include <linux/mm.h>
-#include <linux/slab.h>
-#include <linux/init.h>
-#include <linux/console.h>
-
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <asm/uaccess.h>
-#include <asm/hypervisor.h>
-
-#define XENO_TTY_MINOR 123
-
-/*** useful function for console debugging -- goes straight to Xen ****/
-
-asmlinkage int xprintk(const char *fmt, ...)
-{
-        va_list args;
-        unsigned long flags;
-        int printed_len;
-        static char printk_buf[1024];
-
-        /* Emit the output into the temporary buffer */
-        va_start(args, fmt);
-        printed_len = vsnprintf(printk_buf, sizeof(printk_buf), fmt, args);
-        va_end(args);
-
-        // Useful Hack if things are going wrong very early in the day
-        (void)HYPERVISOR_console_write(printk_buf, sizeof(printk_buf));
-}
-
-
-
-/******************** Kernel console driver ********************************/
-
-static void xen_console_write(struct console *co, const char *s, unsigned count)
-{
-#define STRLEN 256
-    static char str[STRLEN];
-    static int pos = 0;
-    int len;
-    
-    /* We buffer output until we see a newline, or until the buffer is full. */
-    while ( count != 0 )
-    {
-        len = ((STRLEN - pos) > count) ? count : STRLEN - pos;
-        memcpy(str + pos, s, len);
-        pos   += len;
-        s     += len;
-        count -= len;
-        if ( (pos == STRLEN) || (str[pos-1] == '\n') )
-        {
-            (void)HYPERVISOR_console_write(str, pos);
-            pos = 0;
-        }
-    }
-}
-
-static kdev_t xen_console_device(struct console *c)
-{
-    /*
-     * This is the magic that binds our "struct console" to our
-     * "tty_struct", defined below.
-     */
-    return MKDEV(TTY_MAJOR, XENO_TTY_MINOR);
-}
-
-static struct console xen_console_info = {
-    name:              "xencons", /* Used to be xen_console, but we're only
-                                     actually allowed 8 charcters including
-                                     the terminator... */
-    write:             xen_console_write,
-    device:             xen_console_device,
-    flags:             CON_PRINTBUFFER,
-    index:             -1,
-};
-
-void xen_console_init(void)
-{
-  xprintk("xen_console_init\n");
-  register_console(&xen_console_info);
-}
-
-
-/******************** Initial /dev/console *********************************/
-
-
-static struct tty_driver xeno_console_driver;
-static int xeno_console_refcount;
-static struct tty_struct *xeno_console_table[1];
-static struct termios *xeno_console_termios[1];
-static struct termios *xeno_console_termios_locked[1];
-
-static int xeno_console_write_room(struct tty_struct *tty)
-{
-    return INT_MAX;
-}
-
-static int xeno_console_chars_in_buffer(struct tty_struct *tty)
-{
-    return 0;
-}
-
-static inline int xeno_console_xmit(int ch)
-{
-    char _ch = ch;
-    xen_console_write(NULL, &_ch, 1);
-    return 1;
-}
-
-static int xeno_console_write(struct tty_struct *tty, int from_user,
-                       const u_char * buf, int count)
-{
-    int i;
-
-    if ( from_user && verify_area(VERIFY_READ, buf, count) )
-    {
-        return -EINVAL;
-    }
-
-    for ( i = 0; i < count; i++ )
-    {
-        char ch;
-        if ( from_user )
-        {
-            __get_user(ch, buf + i);
-        }
-        else
-        {
-            ch = buf[i];
-        }
-        xeno_console_xmit(ch);
-    }
-    return i;
-}
-
-static void xeno_console_put_char(struct tty_struct *tty, u_char ch)
-{
-    xeno_console_xmit(ch);
-}
-
-static int xeno_console_open(struct tty_struct *tty, struct file *filp)
-{
-    int line;
-
-    MOD_INC_USE_COUNT;
-    line = MINOR(tty->device) - tty->driver.minor_start;
-    if ( line )
-    {
-        MOD_DEC_USE_COUNT;
-        return -ENODEV;
-    }
-
-    tty->driver_data = NULL;
-
-    return 0;
-}
-
-static void xeno_console_close(struct tty_struct *tty, struct file *filp)
-{
-    MOD_DEC_USE_COUNT;
-}
-
-int __init xeno_con_init(void)
-{
-    memset(&xeno_console_driver, 0, sizeof(struct tty_driver));
-    xeno_console_driver.magic           = TTY_DRIVER_MAGIC;
-    xeno_console_driver.driver_name     = "xeno_console";
-    xeno_console_driver.name            = "xencon";
-    xeno_console_driver.major           = TTY_MAJOR;
-    xeno_console_driver.minor_start     = XENO_TTY_MINOR;
-    xeno_console_driver.num             = 1;
-    xeno_console_driver.type            = TTY_DRIVER_TYPE_SERIAL;
-    xeno_console_driver.subtype         = SERIAL_TYPE_NORMAL;
-    xeno_console_driver.init_termios    = tty_std_termios;
-    xeno_console_driver.flags           = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS;
-    xeno_console_driver.refcount        = &xeno_console_refcount;
-    xeno_console_driver.table           = xeno_console_table;
-    xeno_console_driver.termios         = xeno_console_termios;
-    xeno_console_driver.termios_locked  = xeno_console_termios_locked;
-    /* Functions */
-    xeno_console_driver.open            = xeno_console_open;
-    xeno_console_driver.close           = xeno_console_close;
-    xeno_console_driver.write           = xeno_console_write;
-    xeno_console_driver.write_room      = xeno_console_write_room;
-    xeno_console_driver.put_char        = xeno_console_put_char;
-    xeno_console_driver.chars_in_buffer = xeno_console_chars_in_buffer;
-
-    if ( tty_register_driver(&xeno_console_driver) )
-    {
-        printk(KERN_ERR "Couldn't register Xeno console driver\n");
-    }
-    else
-    {
-        printk("Xeno console successfully installed\n");
-    }
-
-    return 0;
-}
-
-void __exit xeno_con_fini(void)
-{
-    int ret;
-
-    ret = tty_unregister_driver(&xeno_console_driver);
-    if ( ret != 0 )
-    {
-        printk(KERN_ERR "Unable to unregister Xeno console driver: %d\n", ret);
-    }
-}
-
-module_init(xeno_con_init);
-module_exit(xeno_con_fini);
-
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/Makefile b/xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/Makefile
deleted file mode 100644 (file)
index 9030801..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-O_TARGET := dom0.o
-obj-y := dom0_core.o vfr.o
-include $(TOPDIR)/Rules.make
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/dom0_core.c b/xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/dom0_core.c
deleted file mode 100644 (file)
index 20db18a..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-/******************************************************************************
- * dom0_core.c
- * 
- * Interface to privileged domain-0 commands.
- * 
- * Copyright (c) 2002-2003, K A Fraser, B Dragovic
- */
-
-#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/slab.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/proc_fs.h>
-#include <linux/mm.h>
-#include <linux/mman.h>
-#include <linux/swap.h>
-#include <linux/smp_lock.h>
-#include <linux/swapctl.h>
-#include <linux/iobuf.h>
-#include <linux/highmem.h>
-#include <linux/pagemap.h>
-#include <linux/seq_file.h>
-
-#include <asm/pgalloc.h>
-#include <asm/pgtable.h>
-#include <asm/uaccess.h>
-#include <asm/tlb.h>
-#include <asm/proc_cmd.h>
-#include <asm/hypervisor-ifs/dom0_ops.h>
-
-#include "../block/xl_block.h"
-
-struct proc_dir_entry *xeno_base;
-static struct proc_dir_entry *privcmd_intf;
-
-
-static int privcmd_ioctl(struct inode *inode, struct file *file,
-                         unsigned int cmd, unsigned long data)
-{
-    int ret = 0;
-
-    switch ( cmd )
-    {
-    case IOCTL_PRIVCMD_HYPERCALL:
-    {
-        privcmd_hypercall_t hypercall;
-  
-        if ( copy_from_user(&hypercall, (void *)data, sizeof(hypercall)) )
-            return -EFAULT;
-
-        __asm__ __volatile__ (
-            "pushl %%ebx; pushl %%ecx; pushl %%edx; pushl %%esi; pushl %%edi; "
-            "movl  4(%%eax),%%ebx ;"
-            "movl  8(%%eax),%%ecx ;"
-            "movl 12(%%eax),%%edx ;"
-            "movl 16(%%eax),%%esi ;"
-            "movl 20(%%eax),%%edi ;"
-            "movl   (%%eax),%%eax ;"
-            TRAP_INSTR "; "
-            "popl %%edi; popl %%esi; popl %%edx; popl %%ecx; popl %%ebx"
-            : "=a" (ret) : "0" (&hypercall) : "memory" );
-    }
-    break;
-
-    case IOCTL_PRIVCMD_BLKMSG:
-    {
-        privcmd_blkmsg_t blkmsg;
-        char            *kbuf;
-        int              ret;
-  
-        if ( copy_from_user(&blkmsg, (void *)data, sizeof(blkmsg)) )
-            return -EFAULT;
-  
-        if ( blkmsg.buf_size > PAGE_SIZE )
-            return -EINVAL;
-  
-        if ( (kbuf = kmalloc(blkmsg.buf_size, GFP_KERNEL)) == NULL )
-            return -ENOMEM;
-  
-        if ( copy_from_user(kbuf, blkmsg.buf, blkmsg.buf_size) ) {
-            kfree(kbuf);
-            return -EFAULT;
-        }
-  
-        ret = xenolinux_control_msg((int)blkmsg.op, kbuf, blkmsg.buf_size);
-        if ( ret != 0 ) {
-            kfree(kbuf);
-            return ret;
-        }
-  
-        if ( copy_to_user(blkmsg.buf, kbuf, blkmsg.buf_size) ) {
-            kfree(kbuf);
-            return -EFAULT;
-        }
-  
-        kfree(kbuf);
-    }
-    break;
-    
-    case IOCTL_PRIVCMD_LINDEV_TO_XENDEV:
-    {
-        ret = (int)xldev_to_physdev((kdev_t)data);
-    }
-    break;
-
-    case IOCTL_PRIVCMD_XENDEV_TO_LINDEV:
-    {
-        ret = (int)physdev_to_xldev((unsigned short)data);
-    }
-    break;
-
-    default:
-    {
-        ret = -EINVAL;
-    }
-    break;
-    }
-
-    return ret;
-}
-
-
-static struct file_operations privcmd_file_ops = {
-  ioctl : privcmd_ioctl
-};
-
-
-static int __init init_module(void)
-{
-    if ( !(start_info.flags & SIF_PRIVILEGED) )
-        return 0;
-
-    /* xeno proc root setup */
-    xeno_base = proc_mkdir("xeno", &proc_root); 
-
-    /* xeno control interface */
-    privcmd_intf = create_proc_entry("privcmd", 0400, xeno_base);
-    if ( privcmd_intf != NULL )
-    {
-        privcmd_intf->owner      = THIS_MODULE;
-        privcmd_intf->nlink      = 1;
-       privcmd_intf->proc_fops  = &privcmd_file_ops;
-    }
-
-    return 0;
-}
-
-
-static void __exit cleanup_module(void)
-{
-    if ( privcmd_intf == NULL ) return;
-    remove_proc_entry("xeno", &proc_root);
-    privcmd_intf = NULL;
-}
-
-
-module_init(init_module);
-module_exit(cleanup_module);
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/vfr.c b/xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/vfr.c
deleted file mode 100644 (file)
index 8c9f653..0000000
+++ /dev/null
@@ -1,323 +0,0 @@
-/******************************************************************************
- * vfr.c
- *
- * Interface to the virtual firewall/router.
- *
- */
-
-#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/slab.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/proc_fs.h>
-
-#include <asm/hypervisor-ifs/network.h>
-
-static struct proc_dir_entry *proc_vfr;
-
-static unsigned char readbuf[1024];
-
-extern struct proc_dir_entry *xeno_base;
-
-/* Helpers, implemented at the bottom. */
-u32 getipaddr(const char *buff, unsigned int len);
-u16 antous(const char *buff, int len);
-int anton(const char *buff, int len);
-
-static int vfr_read_proc(char *page, char **start, off_t off,
-                         int count, int *eof, void *data)
-{   
-    strcpy(page, readbuf);
-    *readbuf = '\0';
-    *eof = 1;
-    *start = page;
-    return strlen(page);
-}
-
-/* The format for the vfr interface is as follows:
- *
- *  COMMAND <field>=<val> [<field>=<val> [...]]
- *
- *  where:
- *
- *  COMMAND = { ACCEPT | COUNT }
- *
- *  field=val pairs are as follows:
- *
- *  field = { srcaddr | dstaddr }
- *      val is a dot seperated, numeric IP address.
- *
- *  field = { srcport | dstport }
- *      val is a (16-bit) unsigned int
- *
- *  field = { proto }
- *      val = { IP | TCP | UDP | ARP }
- *
- */
-
-#define isspace(_x) ( ((_x)==' ')  || ((_x)=='\t') || ((_x)=='\v') || \
-                     ((_x)=='\f') || ((_x)=='\r') || ((_x)=='\n') )
-
-static int vfr_write_proc(struct file *file, const char *buffer,
-                          u_long count, void *data)
-{
-    network_op_t op;
-    int ret, len;
-    int ts, te, tl; // token start, end, and length
-    int fs, fe, fl; // field.
-
-    len = count;
-    ts = te = 0;
-
-    memset(&op, 0, sizeof(network_op_t));
-
-    // get the command:
-    while ( count && isspace(buffer[ts]) ) { ts++; count--; } // skip spaces.
-    te = ts;
-    while ( count && !isspace(buffer[te]) ) { te++; count--; } // command end
-    if ( te <= ts ) goto bad;
-    tl = te - ts;
-  
-    if ( strncmp(&buffer[ts], "ADD", tl) == 0 )
-    {
-        op.cmd = NETWORK_OP_ADDRULE;
-    }
-    else if ( strncmp(&buffer[ts], "DELETE", tl) == 0 )
-    {
-        op.cmd = NETWORK_OP_DELETERULE;
-    }
-    else if ( strncmp(&buffer[ts], "PRINT", tl) == 0 )
-    {
-        op.cmd = NETWORK_OP_GETRULELIST;
-        goto doneparsing;
-    }
-        
-    ts = te;
-  
-    // get the action
-    while ( count && (buffer[ts] == ' ') ) { ts++; count--; } // skip spaces.
-    te = ts;
-    while ( count && (buffer[te] != ' ') ) { te++; count--; } // command end
-    if ( te <= ts ) goto bad;
-    tl = te - ts;
-
-    if ( strncmp(&buffer[ts], "ACCEPT", tl) == 0 ) 
-    {
-        op.u.net_rule.action = NETWORK_ACTION_ACCEPT;
-        goto keyval;
-    }
-    if ( strncmp(&buffer[ts], "COUNT", tl) == 0 ) 
-    {
-        op.u.net_rule.action = NETWORK_ACTION_COUNT;
-        goto keyval;
-    }
-   
-    // default case;
-    return (len);
-  
-
-    // get the key=val pairs.
- keyval:
-    while (count)
-    {
-        //get field
-        ts = te; while ( count && isspace(buffer[ts]) ) { ts++; count--; }
-        te = ts;
-        while ( count && !isspace(buffer[te]) && (buffer[te] != '=') ) 
-        { te++; count--; }
-        if ( te <= ts )
-            goto doneparsing;
-        tl = te - ts;
-        fs = ts; fe = te; fl = tl; // save the field markers.
-        // skip "   =   " (ignores extra equals.)
-        while ( count && (isspace(buffer[te]) || (buffer[te] == '=')) ) 
-        { te++; count--; }
-        ts = te;
-        while ( count && !isspace(buffer[te]) ) { te++; count--; }
-        tl = te - ts;
-
-        if ( (fl <= 0) || (tl <= 0) ) goto bad;
-
-        /* NB. Prefix matches must go first! */
-        if (strncmp(&buffer[fs], "src", fl) == 0)
-        {
-            op.u.net_rule.src_vif = VIF_ANY_INTERFACE;
-        }
-        else if (strncmp(&buffer[fs], "dst", fl) == 0)
-        {
-            op.u.net_rule.dst_vif = VIF_PHYSICAL_INTERFACE;
-        }
-        else if (strncmp(&buffer[fs], "srcaddr", fl) == 0) 
-        {  
-            op.u.net_rule.src_addr = getipaddr(&buffer[ts], tl);
-        }
-        else if (strncmp(&buffer[fs], "dstaddr", fl) == 0)
-        {    
-            op.u.net_rule.dst_addr = getipaddr(&buffer[ts], tl);
-        }
-        else if (strncmp(&buffer[fs], "srcaddrmask", fl) == 0) 
-        {
-            op.u.net_rule.src_addr_mask = getipaddr(&buffer[ts], tl);
-        }
-        else if (strncmp(&buffer[fs], "dstaddrmask", fl) == 0)
-        {
-            op.u.net_rule.dst_addr_mask = getipaddr(&buffer[ts], tl);
-        }
-        else if (strncmp(&buffer[fs], "srcport", fl) == 0)
-        {
-            op.u.net_rule.src_port = antous(&buffer[ts], tl);
-        }
-        else if (strncmp(&buffer[fs], "dstport", fl) == 0)
-        {
-            op.u.net_rule.dst_port = antous(&buffer[ts], tl);
-        }
-        else if (strncmp(&buffer[fs], "srcportmask", fl) == 0)
-        {
-            op.u.net_rule.src_port_mask = antous(&buffer[ts], tl);
-        }
-        else if (strncmp(&buffer[fs], "dstportmask", fl) == 0)
-        {
-            op.u.net_rule.dst_port_mask = antous(&buffer[ts], tl);
-        }
-        else if (strncmp(&buffer[fs], "srcdom", fl) == 0)
-        {
-            op.u.net_rule.src_vif |= anton(&buffer[ts], tl)<<VIF_DOMAIN_SHIFT;
-        }
-        else if (strncmp(&buffer[fs], "srcidx", fl) == 0)
-        {
-            op.u.net_rule.src_vif |= anton(&buffer[ts], tl);
-        }
-        else if (strncmp(&buffer[fs], "dstdom", fl) == 0)
-        {
-            op.u.net_rule.dst_vif |= anton(&buffer[ts], tl)<<VIF_DOMAIN_SHIFT;
-        }
-        else if (strncmp(&buffer[fs], "dstidx", fl) == 0)
-        {
-            op.u.net_rule.dst_vif |= anton(&buffer[ts], tl);
-        }
-        else if ( (strncmp(&buffer[fs], "proto", fl) == 0))
-        {      
-            if (strncmp(&buffer[ts], "any", tl) == 0) 
-                op.u.net_rule.proto = NETWORK_PROTO_ANY; 
-            if (strncmp(&buffer[ts], "ip", tl) == 0)
-                op.u.net_rule.proto = NETWORK_PROTO_IP;
-            if (strncmp(&buffer[ts], "tcp", tl) == 0) 
-                op.u.net_rule.proto = NETWORK_PROTO_TCP;
-            if (strncmp(&buffer[ts], "udp", tl) == 0)
-                op.u.net_rule.proto = NETWORK_PROTO_UDP;
-            if (strncmp(&buffer[ts], "arp", tl) == 0)
-                op.u.net_rule.proto = NETWORK_PROTO_ARP;
-        }
-    }
-
- doneparsing:  
-    ret = HYPERVISOR_network_op(&op);
-    return(len);
-
- bad:
-    return(len);
-    
-    
-}
-
-static int __init init_module(void)
-{
-    *readbuf = '\0';
-    proc_vfr = create_proc_entry ("vfr", 0600, xeno_base);
-    if ( proc_vfr != NULL )
-    {
-        proc_vfr->owner      = THIS_MODULE;
-        proc_vfr->nlink      = 1;
-        proc_vfr->read_proc  = vfr_read_proc;
-        proc_vfr->write_proc = vfr_write_proc;
-        printk("Successfully installed virtual firewall/router interface\n");
-    }
-    return 0;
-}
-
-static void __exit cleanup_module(void)
-{
-    if ( proc_vfr == NULL ) return;
-    remove_proc_entry("vfr", xeno_base);
-    proc_vfr = NULL;
-}
-
-module_init(init_module);
-module_exit(cleanup_module);
-
-/* Helper functions start here: */
-
-int anton(const char *buff, int len)
-{
-    int ret;
-    char c;
-    int sign = 1;
-    
-    ret = 0;
-
-    if (len == 0) return 0;
-    if (*buff == '-') { sign = -1; buff++; len--; }
-
-    while ( (len) && ((c = *buff) >= '0') && (c <= '9') )
-    {
-        ret *= 10;
-        ret += c - '0';
-        buff++; len--;
-    }
-
-    ret *= sign;
-    return ret;
-}
-    
-u16 antous(const char *buff, int len)
-{
-    u16 ret;
-    char c;
-
-    ret = 0;
-
-    while ( (len) && ((c = *buff) >= '0') && (c <= '9') )
-    {
-        ret *= 10;
-        ret += c - '0';
-        buff++; len--;
-    }
-
-    return ret;
-}
-
-u32 getipaddr(const char *buff, unsigned int len)
-{
-    char c;
-    u32 ret, val;
-
-    ret = 0; val = 0;
-
-    while ( len )
-    {
-        if (!((((c = *buff) >= '0') && ( c <= '9')) || ( c == '.' ) ) ) 
-        {
-            return(0); // malformed.
-        }
-
-        if ( c == '.' ) {
-            if (val > 255) return (0); //malformed.
-            ret = ret << 8; 
-            ret += val;
-            val = 0;
-            len--; buff++;
-            continue;
-        }
-        val *= 10;
-        val += c - '0';
-        buff++; len--;
-    }
-    ret = ret << 8;
-    ret += val;
-
-    return (ret);
-}
-
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/drivers/network/Makefile b/xenolinux-2.4.21-sparse/arch/xeno/drivers/network/Makefile
deleted file mode 100644 (file)
index b44a288..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-O_TARGET := net.o
-obj-y := network.o
-include $(TOPDIR)/Rules.make
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/drivers/network/network.c b/xenolinux-2.4.21-sparse/arch/xeno/drivers/network/network.c
deleted file mode 100644 (file)
index 3d12699..0000000
+++ /dev/null
@@ -1,582 +0,0 @@
-/******************************************************************************
- * network.c
- * 
- * Virtual network driver for XenoLinux.
- * 
- * Copyright (c) 2002-2003, K A Fraser
- */
-
-#include <linux/config.h>
-#include <linux/module.h>
-
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/slab.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-
-#include <linux/netdevice.h>
-#include <linux/inetdevice.h>
-#include <linux/etherdevice.h>
-#include <linux/skbuff.h>
-#include <linux/init.h>
-
-#include <asm/io.h>
-#include <net/sock.h>
-#include <net/pkt_sched.h>
-
-#define NET_IRQ _EVENT_NET
-
-#define TX_MAX_ENTRIES (TX_RING_SIZE - 2)
-#define RX_MAX_ENTRIES (RX_RING_SIZE - 2)
-
-#define TX_RING_INC(_i)    (((_i)+1) & (TX_RING_SIZE-1))
-#define RX_RING_INC(_i)    (((_i)+1) & (RX_RING_SIZE-1))
-#define TX_RING_ADD(_i,_j) (((_i)+(_j)) & (TX_RING_SIZE-1))
-#define RX_RING_ADD(_i,_j) (((_i)+(_j)) & (RX_RING_SIZE-1))
-
-#define RX_BUF_SIZE ((PAGE_SIZE/2)+1) /* Fool the slab allocator :-) */
-
-static void network_interrupt(int irq, void *dev_id, struct pt_regs *ptregs);
-static void network_tx_buf_gc(struct net_device *dev);
-static void network_alloc_rx_buffers(struct net_device *dev);
-static void network_free_rx_buffers(struct net_device *dev);
-static void cleanup_module(void);
-
-static struct list_head dev_list;
-
-/*
- * Needed because network_close() is not properly implemented yet. So
- * an open after a close needs to do much less than the initial open.
- */
-static int opened_once_already = 0;
-
-struct net_private
-{
-    struct list_head list;
-    struct net_device *dev;
-
-    struct net_device_stats stats;
-    atomic_t tx_entries;
-    unsigned int rx_resp_cons, tx_resp_cons, tx_full;
-    net_ring_t *net_ring;
-    net_idx_t  *net_idx;
-    spinlock_t tx_lock;
-    unsigned int idx; /* Domain-specific index of this VIF. */
-
-    unsigned int rx_bufs_to_notify;
-
-    /*
-     * {tx,rx}_skbs store outstanding skbuffs. The first entry in each
-     * array is an index into a chain of free entries.
-     */
-    struct sk_buff *tx_skbs[TX_RING_SIZE];
-    struct sk_buff *rx_skbs[RX_RING_SIZE];
-};
-
-/* Access macros for acquiring freeing slots in {tx,rx}_skbs[]. */
-#define ADD_ID_TO_FREELIST(_list, _id)             \
-    (_list)[(_id)] = (_list)[0];                   \
-    (_list)[0]     = (void *)(unsigned long)(_id);
-#define GET_ID_FROM_FREELIST(_list)                \
- ({ unsigned long _id = (unsigned long)(_list)[0]; \
-    (_list)[0]  = (_list)[_id];                    \
-    _id; })
-
-
-static void dbg_network_int(int irq, void *dev_id, struct pt_regs *ptregs)
-{
-    struct net_device *dev = (struct net_device *)dev_id;
-    struct net_private *np = dev->priv;
-    printk(KERN_ALERT "tx_full = %d, tx_entries = %d, tx_resp_cons = %d,"
-           " tx_req_prod = %d, tx_resp_prod = %d, tx_event = %d, state=%d\n",
-           np->tx_full, atomic_read(&np->tx_entries), np->tx_resp_cons, 
-           np->net_idx->tx_req_prod, np->net_idx->tx_resp_prod, 
-           np->net_idx->tx_event,
-           test_bit(__LINK_STATE_XOFF, &dev->state));
-    printk(KERN_ALERT "rx_resp_cons = %d,"
-           " rx_req_prod = %d, rx_resp_prod = %d, rx_event = %d\n",
-           np->rx_resp_cons, np->net_idx->rx_req_prod,
-           np->net_idx->rx_resp_prod, np->net_idx->rx_event);
-}
-
-
-static int network_open(struct net_device *dev)
-{
-    struct net_private *np = dev->priv;
-    int i, error = 0;
-
-    if ( opened_once_already )
-    {
-        memset(&np->stats, 0, sizeof(np->stats));
-        netif_start_queue(dev);
-        return 0;
-    }
-
-    np->rx_bufs_to_notify = 0;
-    np->rx_resp_cons = np->tx_resp_cons = np->tx_full = 0;
-    memset(&np->stats, 0, sizeof(np->stats));
-    spin_lock_init(&np->tx_lock);
-    atomic_set(&np->tx_entries, 0);
-    memset(np->net_ring, 0, sizeof(*np->net_ring));
-    memset(np->net_idx, 0, sizeof(*np->net_idx));
-
-    /* Initialise {tx,rx}_skbs to be a free chain containing every entry. */
-    for ( i = 0; i < TX_RING_SIZE; i++ )
-        np->tx_skbs[i] = (void *)(i+1);
-    for ( i = 0; i < RX_RING_SIZE; i++ )
-        np->rx_skbs[i] = (void *)(i+1);
-
-    network_alloc_rx_buffers(dev);
-
-    error = request_irq(NET_IRQ, network_interrupt, 
-                        SA_SAMPLE_RANDOM, "network", dev);
-    if ( error )
-    {
-        printk(KERN_WARNING "%s: Could not allocate network interrupt\n",
-               dev->name);
-        network_free_rx_buffers(dev);
-        goto fail;
-    }
-
-    error = request_irq(_EVENT_DEBUG, dbg_network_int, SA_SHIRQ,
-                        "debug", dev);
-    if ( error )
-    {
-        printk(KERN_WARNING "%s: Non-fatal error -- no debug interrupt\n",
-               dev->name);
-    }
-
-    printk("XenoLinux Virtual Network Driver installed as %s\n", dev->name);
-
-    netif_start_queue(dev);
-
-    MOD_INC_USE_COUNT;
-
-    opened_once_already = 1;
-
-    return 0;
-
- fail:
-    kfree(np);
-    return error;
-}
-
-
-static void network_tx_buf_gc(struct net_device *dev)
-{
-    unsigned int i;
-    struct net_private *np = dev->priv;
-    struct sk_buff *skb;
-    unsigned int prod;
-    tx_entry_t *tx_ring = np->net_ring->tx_ring;
-
-    do {
-        prod = np->net_idx->tx_resp_prod;
-
-        for ( i = np->tx_resp_cons; i != prod; i = TX_RING_INC(i) )
-        {
-            skb = np->tx_skbs[tx_ring[i].resp.id];
-            ADD_ID_TO_FREELIST(np->tx_skbs, tx_ring[i].resp.id);
-            dev_kfree_skb_any(skb);
-            atomic_dec(&np->tx_entries);
-        }
-        
-        np->tx_resp_cons = prod;
-        
-        /* Set a new event, then check for race with update of tx_cons. */
-        np->net_idx->tx_event =
-            TX_RING_ADD(prod, (atomic_read(&np->tx_entries)>>1) + 1);
-        smp_mb();
-    }
-    while ( prod != np->net_idx->tx_resp_prod );
-
-    if ( np->tx_full && (atomic_read(&np->tx_entries) < TX_MAX_ENTRIES) )
-    {
-        np->tx_full = 0;
-        netif_wake_queue(dev);
-    }
-}
-
-
-static inline pte_t *get_ppte(void *addr)
-{
-    pgd_t *pgd; pmd_t *pmd; pte_t *pte;
-    pgd = pgd_offset_k(   (unsigned long)addr);
-    pmd = pmd_offset(pgd, (unsigned long)addr);
-    pte = pte_offset(pmd, (unsigned long)addr);
-    return pte;
-}
-
-
-static void network_alloc_rx_buffers(struct net_device *dev)
-{
-    unsigned int i, id;
-    struct net_private *np = dev->priv;
-    struct sk_buff *skb;
-    unsigned int end = RX_RING_ADD(np->rx_resp_cons, RX_MAX_ENTRIES);    
-
-    if ( (i = np->net_idx->rx_req_prod) == end )
-        return;
-
-    do {
-        skb = dev_alloc_skb(RX_BUF_SIZE);
-        if ( skb == NULL ) break;
-        skb->dev = dev;
-
-        id = GET_ID_FROM_FREELIST(np->rx_skbs);
-        np->rx_skbs[id] = skb;
-
-        np->net_ring->rx_ring[i].req.id   = (unsigned short)id;
-        np->net_ring->rx_ring[i].req.addr = 
-            virt_to_machine(get_ppte(skb->head));
-
-        np->rx_bufs_to_notify++;
-    }
-    while ( (i = RX_RING_INC(i)) != end );
-
-    /*
-     * We may have allocated buffers which have entries outstanding in the page
-     * update queue -- make sure we flush those first!
-     */
-    flush_page_update_queue();
-
-    np->net_idx->rx_req_prod = i;
-    np->net_idx->rx_event    = RX_RING_INC(np->rx_resp_cons);
-        
-    /* Batch Xen notifications. */
-    if ( np->rx_bufs_to_notify > (RX_MAX_ENTRIES/4) )
-    {
-        HYPERVISOR_net_update();
-        np->rx_bufs_to_notify = 0;
-    }
-}
-
-
-static void network_free_rx_buffers(struct net_device *dev)
-{
-    unsigned int i;
-    struct net_private *np = dev->priv;
-    struct sk_buff *skb;    
-
-    for ( i  = np->rx_resp_cons; 
-          i != np->net_idx->rx_req_prod; 
-          i  = RX_RING_INC(i) )
-    {
-        skb = np->rx_skbs[np->net_ring->rx_ring[i].req.id];
-        dev_kfree_skb_any(skb);
-    }
-}
-
-static int network_start_xmit(struct sk_buff *skb, struct net_device *dev)
-{
-    unsigned int i, id;
-    struct net_private *np = (struct net_private *)dev->priv;
-
-    if ( np->tx_full )
-    {
-        printk(KERN_ALERT "%s: full queue wasn't stopped!\n", dev->name);
-        netif_stop_queue(dev);
-        return -ENOBUFS;
-    }
-
-    if ( (((unsigned long)skb->data & ~PAGE_MASK) + skb->len) >= PAGE_SIZE )
-    {
-        struct sk_buff *new_skb = dev_alloc_skb(RX_BUF_SIZE);
-        if ( new_skb == NULL ) return 1;
-        skb_put(new_skb, skb->len);
-        memcpy(new_skb->data, skb->data, skb->len);
-        dev_kfree_skb(skb);
-        skb = new_skb;
-    }   
-    
-    spin_lock_irq(&np->tx_lock);
-
-    i = np->net_idx->tx_req_prod;
-
-    id = GET_ID_FROM_FREELIST(np->tx_skbs);
-    np->tx_skbs[id] = skb;
-
-    np->net_ring->tx_ring[i].req.id   = (unsigned short)id;
-    np->net_ring->tx_ring[i].req.addr =
-        phys_to_machine(virt_to_phys(skb->data));
-    np->net_ring->tx_ring[i].req.size = skb->len;
-    np->net_idx->tx_req_prod = TX_RING_INC(i);
-    atomic_inc(&np->tx_entries);
-
-    network_tx_buf_gc(dev);
-
-    if ( atomic_read(&np->tx_entries) >= TX_MAX_ENTRIES )
-    {
-        np->tx_full = 1;
-        netif_stop_queue(dev);
-    }
-
-    spin_unlock_irq(&np->tx_lock);
-
-    np->stats.tx_bytes += skb->len;
-    np->stats.tx_packets++;
-
-    /* Only notify Xen if there are no outstanding responses. */
-    smp_mb();
-    if ( np->net_idx->tx_resp_prod == i )
-        HYPERVISOR_net_update();
-
-    return 0;
-}
-
-
-static void network_interrupt(int irq, void *dev_id, struct pt_regs *ptregs)
-{
-    unsigned int i;
-    unsigned long flags;
-    struct net_device *dev = (struct net_device *)dev_id;
-    struct net_private *np = dev->priv;
-    struct sk_buff *skb;
-    rx_resp_entry_t *rx;
-    
-    spin_lock_irqsave(&np->tx_lock, flags);
-    network_tx_buf_gc(dev);
-    spin_unlock_irqrestore(&np->tx_lock, flags);
-
- again:
-    for ( i  = np->rx_resp_cons; 
-          i != np->net_idx->rx_resp_prod; 
-          i  = RX_RING_INC(i) )
-    {
-        rx  = &np->net_ring->rx_ring[i].resp;
-
-        skb = np->rx_skbs[rx->id];
-        ADD_ID_TO_FREELIST(np->rx_skbs, rx->id);
-
-        if ( rx->status != RING_STATUS_OK )
-        {
-            printk(KERN_ALERT "bad buffer on RX ring!(%d)\n", rx->status);
-            dev_kfree_skb_any(skb);
-            continue;
-        }
-
-        /*
-         * Set up shinfo -- from alloc_skb This was particularily nasty:  the
-         * shared info is hidden at the back of the data area (presumably so it
-         * can be shared), but on page flip it gets very spunked.
-         */
-        atomic_set(&(skb_shinfo(skb)->dataref), 1);
-        skb_shinfo(skb)->nr_frags = 0;
-        skb_shinfo(skb)->frag_list = NULL;
-                                
-        phys_to_machine_mapping[virt_to_phys(skb->head) >> PAGE_SHIFT] =
-            (*(unsigned long *)get_ppte(skb->head)) >> PAGE_SHIFT;
-
-        if ( rx->offset < 16 )
-        {
-            printk(KERN_ALERT "need pkt offset >= 16 (got %d)\n", rx->offset);
-            dev_kfree_skb_any(skb);
-            continue;
-        }
-        
-        skb_reserve(skb, rx->offset - 16);
-
-        skb_put(skb, rx->size);
-        skb->protocol = eth_type_trans(skb, dev);
-
-        np->stats.rx_packets++;
-
-        np->stats.rx_bytes += rx->size;
-        netif_rx(skb);
-        dev->last_rx = jiffies;
-    }
-
-    np->rx_resp_cons = i;
-
-    network_alloc_rx_buffers(dev);
-    
-    /* Deal with hypervisor racing our resetting of rx_event. */
-    smp_mb();
-    if ( np->net_idx->rx_resp_prod != i ) goto again;
-}
-
-
-int network_close(struct net_device *dev)
-{
-    netif_stop_queue(dev);
-
-    /*
-     * XXXX This cannot be done safely until be have a proper interface
-     * for setting up and tearing down virtual interfaces on the fly.
-     * Currently the receive buffers are locked down by Xen and we have
-     * no sensible way of retrieving them.
-     */
-#if 0
-    free_irq(NET_IRQ, dev);
-
-    network_free_rx_buffers(dev);
-    kfree(np->net_ring->rx_ring);
-    kfree(np->net_ring->tx_ring);
-
-    MOD_DEC_USE_COUNT;
-#endif
-
-    return 0;
-}
-
-
-static struct net_device_stats *network_get_stats(struct net_device *dev)
-{
-    struct net_private *np = (struct net_private *)dev->priv;
-    return &np->stats;
-}
-
-
-/*
- * This notifier is installed for domain 0 only.
- * All other domains have VFR rules installed on their behalf by domain 0
- * when they are created. For bootstrap, Xen creates wildcard rules for
- * domain 0 -- this notifier is used to detect when we find our proper
- * IP address, so we can poke down proper rules and remove the wildcards.
- */
-static int inetdev_notify(struct notifier_block *this, 
-                          unsigned long event, 
-                          void *ptr)
-{
-    struct in_ifaddr  *ifa  = (struct in_ifaddr *)ptr; 
-    struct net_device *dev = ifa->ifa_dev->dev;
-    struct list_head  *ent;
-    struct net_private *np;
-    int idx = -1;
-    network_op_t op;
-
-    list_for_each ( ent, &dev_list )
-    {
-        np = list_entry(dev_list.next, struct net_private, list);
-        if ( np->dev == dev )
-            idx = np->idx;
-    }
-
-    if ( idx == -1 )
-        goto out;
-    
-    memset(&op, 0, sizeof(op));
-    op.u.net_rule.proto         = NETWORK_PROTO_ANY;
-    op.u.net_rule.action        = NETWORK_ACTION_ACCEPT;
-
-    if ( event == NETDEV_UP )
-        op.cmd = NETWORK_OP_ADDRULE;
-    else if ( event == NETDEV_DOWN )
-        op.cmd = NETWORK_OP_DELETERULE;
-    else
-        goto out;
-
-    op.u.net_rule.src_vif       = idx;
-    op.u.net_rule.dst_vif       = VIF_PHYSICAL_INTERFACE;
-    op.u.net_rule.src_addr      = ntohl(ifa->ifa_address);
-    op.u.net_rule.src_addr_mask = ~0UL;
-    op.u.net_rule.dst_addr      = 0;
-    op.u.net_rule.dst_addr_mask = 0;
-    (void)HYPERVISOR_network_op(&op);
-    
-    op.u.net_rule.src_vif       = VIF_ANY_INTERFACE;
-    op.u.net_rule.dst_vif       = idx;
-    op.u.net_rule.src_addr      = 0;
-    op.u.net_rule.src_addr_mask = 0;    
-    op.u.net_rule.dst_addr      = ntohl(ifa->ifa_address);
-    op.u.net_rule.dst_addr_mask = ~0UL;
-    (void)HYPERVISOR_network_op(&op);
-    
- out:
-    return NOTIFY_DONE;
-}
-
-static struct notifier_block notifier_inetdev = {
-    .notifier_call  = inetdev_notify,
-    .next           = NULL,
-    .priority       = 0
-};
-
-
-int __init init_module(void)
-{
-    int i, fixmap_idx=-1, err;
-    struct net_device *dev;
-    struct net_private *np;
-
-    INIT_LIST_HEAD(&dev_list);
-
-    /*
-     * Domain 0 must poke its own network rules as it discovers its IP
-     * addresses. All other domains have a privileged "parent" to do this for
-     * them at start of day.
-     */
-    if ( start_info.dom_id == 0 )
-        (void)register_inetaddr_notifier(&notifier_inetdev);
-
-    for ( i = 0; i < MAX_DOMAIN_VIFS; i++ )
-    {
-        if ( start_info.net_rings[i] == 0 )
-            continue;
-
-        /* We actually only support up to 4 vifs right now. */
-        if ( ++fixmap_idx == 4 )
-            break;
-
-        dev = alloc_etherdev(sizeof(struct net_private));
-        if ( dev == NULL )
-        {
-            err = -ENOMEM;
-            goto fail;
-        }
-
-        set_fixmap(FIX_NETRING0_BASE+fixmap_idx, start_info.net_rings[i]);
-
-        np = dev->priv;
-        np->net_ring = (net_ring_t *)fix_to_virt(FIX_NETRING0_BASE+fixmap_idx);
-        np->net_idx  = &HYPERVISOR_shared_info->net_idx[i];
-        np->idx      = i;
-
-        SET_MODULE_OWNER(dev);
-        dev->open            = network_open;
-        dev->hard_start_xmit = network_start_xmit;
-        dev->stop            = network_close;
-        dev->get_stats       = network_get_stats;
-
-        memcpy(dev->dev_addr, start_info.net_vmac[i], ETH_ALEN);
-
-        if ( (err = register_netdev(dev)) != 0 )
-        {
-            kfree(dev);
-            goto fail;
-        }
-
-        np->dev = dev;
-        list_add(&np->list, &dev_list);
-    }
-
-    return 0;
-
- fail:
-    cleanup_module();
-    return err;
-}
-
-
-static void cleanup_module(void)
-{
-    struct net_private *np;
-    struct net_device *dev;
-
-    while ( !list_empty(&dev_list) )
-    {
-        np = list_entry(dev_list.next, struct net_private, list);
-        list_del(&np->list);
-        dev = np->dev;
-        unregister_netdev(dev);
-        kfree(dev);
-    }
-
-    if ( start_info.dom_id == 0 )
-        (void)unregister_inetaddr_notifier(&notifier_inetdev);
-}
-
-
-module_init(init_module);
-module_exit(cleanup_module);
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/kernel/Makefile b/xenolinux-2.4.21-sparse/arch/xeno/kernel/Makefile
deleted file mode 100644 (file)
index a43a615..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-
-.S.o:
-       $(CC) $(AFLAGS) -traditional -c $< -o $*.o
-
-all: kernel.o head.o init_task.o
-
-O_TARGET := kernel.o
-
-export-objs     := i386_ksyms.o 
-
-obj-y  := process.o semaphore.o signal.o entry.o traps.o irq.o  \
-               ptrace.o ioport.o ldt.o setup.o time.o sys_i386.o \
-               i386_ksyms.o i387.o hypervisor.o
-
-include $(TOPDIR)/Rules.make
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/kernel/entry.S b/xenolinux-2.4.21-sparse/arch/xeno/kernel/entry.S
deleted file mode 100644 (file)
index 9c909e3..0000000
+++ /dev/null
@@ -1,779 +0,0 @@
-/*
- *  linux/arch/i386/entry.S
- *
- *  Copyright (C) 1991, 1992  Linus Torvalds
- */
-
-/*
- * entry.S contains the system-call and fault low-level handling routines.
- * This also contains the timer-interrupt handler, as well as all interrupts
- * and faults that can result in a task-switch.
- *
- * NOTE: This code handles signal-recognition, which happens every time
- * after a timer-interrupt and after each system call.
- *
- * I changed all the .align's to 4 (16 byte alignment), as that's faster
- * on a 486.
- *
- * Stack layout in 'ret_from_system_call':
- *     ptrace needs to have all regs on the stack.
- *     if the order here is changed, it needs to be
- *     updated in fork.c:copy_process, signal.c:do_signal,
- *     ptrace.c and ptrace.h
- *
- *      0(%esp) - %ebx
- *      4(%esp) - %ecx
- *      8(%esp) - %edx
- *       C(%esp) - %esi
- *     10(%esp) - %edi
- *     14(%esp) - %ebp
- *     18(%esp) - %eax
- *     1C(%esp) - %ds
- *     20(%esp) - %es
- *     24(%esp) - orig_eax
- *     28(%esp) - %eip
- *     2C(%esp) - %cs
- *     30(%esp) - %eflags
- *     34(%esp) - %oldesp
- *     38(%esp) - %oldss
- *
- * "current" is in register %ebx during any slow entries.
- */
-
-#include <linux/config.h>
-#include <linux/sys.h>
-#include <linux/linkage.h>
-#include <asm/segment.h>
-#include <asm/smp.h>
-
-EBX            = 0x00
-ECX            = 0x04
-EDX            = 0x08
-ESI            = 0x0C
-EDI            = 0x10
-EBP            = 0x14
-EAX            = 0x18
-DS             = 0x1C
-ES             = 0x20
-ORIG_EAX       = 0x24
-EIP            = 0x28
-CS             = 0x2C
-EFLAGS         = 0x30
-OLDESP         = 0x34
-OLDSS          = 0x38
-
-CF_MASK                = 0x00000001
-TF_MASK                = 0x00000100
-IF_MASK                = 0x00000200
-DF_MASK                = 0x00000400
-NT_MASK                = 0x00004000
-
-/*
- * these are offsets into the task-struct.
- */
-state          =  0
-flags          =  4
-sigpending     =  8
-addr_limit     = 12
-exec_domain    = 16
-need_resched   = 20
-tsk_ptrace     = 24
-processor      = 52
-
-ENOSYS = 38
-
-
-#define SAVE_ALL \
-       cld; \
-       pushl %es; \
-       pushl %ds; \
-       pushl %eax; \
-       pushl %ebp; \
-       pushl %edi; \
-       pushl %esi; \
-       pushl %edx; \
-       pushl %ecx; \
-       pushl %ebx; \
-       movl $(__KERNEL_DS),%edx; \
-       movl %edx,%ds; \
-       movl %edx,%es;
-
-#define RESTORE_ALL    \
-       popl %ebx;      \
-       popl %ecx;      \
-       popl %edx;      \
-       popl %esi;      \
-       popl %edi;      \
-       popl %ebp;      \
-       popl %eax;      \
-1:     popl %ds;       \
-2:     popl %es;       \
-       addl $4,%esp;   \
-3:     iret;           \
-.section .fixup,"ax";  \
-4:     movl $0,(%esp); \
-       jmp 1b;         \
-5:     movl $0,(%esp); \
-       jmp 2b;         \
-6:     pushl %ss;      \
-       popl %ds;       \
-       pushl %ss;      \
-       popl %es;       \
-       pushl $11;      \
-       call do_exit;   \
-.previous;             \
-.section __ex_table,"a";\
-       .align 4;       \
-       .long 1b,4b;    \
-       .long 2b,5b;    \
-       .long 3b,6b;    \
-.previous
-
-#define GET_CURRENT(reg) \
-       movl $-8192, reg; \
-       andl %esp, reg
-
-ENTRY(lcall7)
-       pushfl                  # We get a different stack layout with call
-       pushl %eax              # gates, which has to be cleaned up later..
-       SAVE_ALL
-       movl EIP(%esp),%eax     # due to call gates, this is eflags, not eip..
-       movl CS(%esp),%edx      # this is eip..
-       movl EFLAGS(%esp),%ecx  # and this is cs..
-       movl %eax,EFLAGS(%esp)  #
-       andl $~(NT_MASK|TF_MASK|DF_MASK), %eax
-       pushl %eax
-       popfl
-       movl %edx,EIP(%esp)     # Now we move them to their "normal" places
-       movl %ecx,CS(%esp)      #
-       movl %esp,%ebx
-       pushl %ebx
-       andl $-8192,%ebx        # GET_CURRENT
-       movl exec_domain(%ebx),%edx     # Get the execution domain
-       movl 4(%edx),%edx       # Get the lcall7 handler for the domain
-       pushl $0x7
-       call *%edx
-       addl $4, %esp
-       popl %eax
-       jmp ret_from_sys_call
-
-ENTRY(lcall27)
-       pushfl                  # We get a different stack layout with call
-       pushl %eax              # gates, which has to be cleaned up later..
-       SAVE_ALL
-       movl EIP(%esp),%eax     # due to call gates, this is eflags, not eip..
-       movl CS(%esp),%edx      # this is eip..
-       movl EFLAGS(%esp),%ecx  # and this is cs..
-       movl %eax,EFLAGS(%esp)  #
-       andl $~(NT_MASK|TF_MASK|DF_MASK), %eax
-       pushl %eax
-       popfl
-       movl %edx,EIP(%esp)     # Now we move them to their "normal" places
-       movl %ecx,CS(%esp)      #
-       movl %esp,%ebx
-       pushl %ebx
-       andl $-8192,%ebx        # GET_CURRENT
-       movl exec_domain(%ebx),%edx     # Get the execution domain
-       movl 4(%edx),%edx       # Get the lcall7 handler for the domain
-       pushl $0x27
-       call *%edx
-       addl $4, %esp
-       popl %eax
-       jmp ret_from_sys_call
-
-        
-ENTRY(ret_from_fork)
-       pushl %ebx
-       call SYMBOL_NAME(schedule_tail)
-       addl $4, %esp
-       GET_CURRENT(%ebx)
-       testb $0x02,tsk_ptrace(%ebx)    # PT_TRACESYS
-       jne tracesys_exit
-       jmp     ret_from_sys_call
-
-/*
- * Return to user mode is not as complex as all this looks,
- * but we want the default path for a system call return to
- * go as quickly as possible which is why some of this is
- * less clear than it otherwise should be.
- */
-
-ENTRY(system_call)
-       pushl %eax                      # save orig_eax
-       SAVE_ALL
-       GET_CURRENT(%ebx)
-       testb $0x02,tsk_ptrace(%ebx)    # PT_TRACESYS
-       jne tracesys
-       cmpl $(NR_syscalls),%eax
-       jae badsys
-       call *SYMBOL_NAME(sys_call_table)(,%eax,4)
-       movl %eax,EAX(%esp)             # save the return value
-ENTRY(ret_from_sys_call)
-        movl SYMBOL_NAME(HYPERVISOR_shared_info),%esi
-        btrl $EVENTS_MASTER_ENABLE_BIT,4(%esi) # make tests atomic
-ret_syscall_tests:      
-       cmpl $0,need_resched(%ebx)
-       jne reschedule
-       cmpl $0,sigpending(%ebx)
-       je   safesti                    # ensure need_resched updates are seen
-signal_return:
-       btsl $EVENTS_MASTER_ENABLE_BIT,4(%esi) # reenable event callbacks
-       movl %esp,%eax
-       xorl %edx,%edx
-       call SYMBOL_NAME(do_signal)
-       jmp  ret_from_sys_call
-
-       ALIGN
-restore_all:
-       RESTORE_ALL
-
-       ALIGN
-tracesys:
-       movl $-ENOSYS,EAX(%esp)
-       call SYMBOL_NAME(syscall_trace)
-       movl ORIG_EAX(%esp),%eax
-       cmpl $(NR_syscalls),%eax
-       jae tracesys_exit
-       call *SYMBOL_NAME(sys_call_table)(,%eax,4)
-       movl %eax,EAX(%esp)             # save the return value
-tracesys_exit:
-       call SYMBOL_NAME(syscall_trace)
-       jmp ret_from_sys_call
-badsys:
-       movl $-ENOSYS,EAX(%esp)
-       jmp ret_from_sys_call
-
-       ALIGN
-ENTRY(ret_from_intr)
-       GET_CURRENT(%ebx)
-ret_from_exception:
-       movb CS(%esp),%al
-       testl $2,%eax
-       jne ret_from_sys_call
-       jmp restore_all
-
-       ALIGN
-reschedule:
-        btsl $EVENTS_MASTER_ENABLE_BIT,4(%esi) # reenable event callbacks
-       call SYMBOL_NAME(schedule)             # test
-       jmp ret_from_sys_call
-
-ENTRY(divide_error)
-       pushl $0                # no error code
-       pushl $ SYMBOL_NAME(do_divide_error)
-       ALIGN
-error_code:
-       pushl %ds
-       pushl %eax
-       xorl %eax,%eax
-       pushl %ebp
-       pushl %edi
-       pushl %esi
-       pushl %edx
-       decl %eax                       # eax = -1
-       pushl %ecx
-       pushl %ebx
-       GET_CURRENT(%ebx)
-       cld
-       movl %es,%ecx
-       movl ORIG_EAX(%esp), %esi       # get the error code
-       movl ES(%esp), %edi             # get the function address
-       movl %eax, ORIG_EAX(%esp)
-       movl %ecx, ES(%esp)
-       movl %esp,%edx
-       pushl %esi                      # push the error code
-       pushl %edx                      # push the pt_regs pointer
-       movl $(__KERNEL_DS),%edx
-       movl %edx,%ds
-       movl %edx,%es
-       call *%edi
-       addl $8,%esp
-       jmp ret_from_exception
-
-# A note on the "critical region" in our callback handler.
-# We want to avoid stacking callback handlers due to events occurring
-# during handling of the last event. To do this, we keep events disabled
-# until we've done all processing. HOWEVER, we must enable events before
-# popping the stack frame (can't be done atomically) and so it would still
-# be possible to get enough handler activations to overflow the stack.
-# Although unlikely, bugs of that kind are hard to track down, so we'd
-# like to avoid the possibility.
-# So, on entry to the handler we detect whether we interrupted an
-# existing activation in its critical region -- if so, we pop the current
-# activation and restart the handler using the previous one.
-ENTRY(hypervisor_callback)
-        pushl %eax
-        SAVE_ALL
-        GET_CURRENT(%ebx)
-        movl EIP(%esp),%eax
-        cmpl $scrit,%eax
-        jb   11f
-        cmpl $ecrit,%eax
-        jb   critical_region_fixup
-11:     push %esp
-        call do_hypervisor_callback
-        add  $4,%esp
-        movl SYMBOL_NAME(HYPERVISOR_shared_info),%esi
-        xorl %eax,%eax
-        movb CS(%esp),%cl
-       test $2,%cl          # slow return to ring 2 or 3
-       jne  ret_syscall_tests
-safesti:btsl $EVENTS_MASTER_ENABLE_BIT,4(%esi) # reenable event callbacks
-scrit:  /**** START OF CRITICAL REGION ****/
-        cmpl %eax,(%esi)
-        jne  14f              # process more events if necessary...
-        RESTORE_ALL
-14:     btrl $EVENTS_MASTER_ENABLE_BIT,4(%esi)
-        jmp  11b
-ecrit:  /**** END OF CRITICAL REGION ****/
-# [How we do the fixup]. We want to merge the current stack frame with the
-# just-interrupted frame. How we do this depends on where in the critical
-# region the interrupted handler was executing, and so how many saved
-# registers are in each frame. We do this quickly using the lookup table
-# 'critical_fixup_table'. For each byte offset in the critical region, it
-# provides the number of bytes which have already been popped from the
-# interrupted stack frame. 
-critical_region_fixup:
-        addl $critical_fixup_table-scrit,%eax
-        movzbl (%eax),%eax    # %eax contains num bytes popped
-        mov  %esp,%esi
-        add  %eax,%esi        # %esi points at end of src region
-        mov  %esp,%edi
-        add  $0x34,%edi       # %edi points at end of dst region
-        mov  %eax,%ecx
-        shr  $2,%ecx          # convert words to bytes
-        je   16f              # skip loop if nothing to copy
-15:     subl $4,%esi          # pre-decrementing copy loop
-        subl $4,%edi
-        movl (%esi),%eax
-        movl %eax,(%edi)
-        loop 15b
-16:     movl %edi,%esp        # final %edi is top of merged stack
-        jmp  11b
-        
-critical_fixup_table:        
-        .byte 0x00,0x00                       # cmpl %eax,(%esi)
-        .byte 0x00,0x00                       # jne  14f
-        .byte 0x00                            # pop  %ebx
-        .byte 0x04                            # pop  %ecx
-        .byte 0x08                            # pop  %edx
-        .byte 0x0c                            # pop  %esi
-        .byte 0x10                            # pop  %edi
-        .byte 0x14                            # pop  %ebp
-        .byte 0x18                            # pop  %eax
-        .byte 0x1c                            # pop  %ds
-        .byte 0x20                            # pop  %es
-        .byte 0x24,0x24,0x24                  # add  $4,%esp
-        .byte 0x28                            # iret
-        .byte 0x00,0x00,0x00,0x00,0x00        # btrl $31,4(%esi)
-        .byte 0x00,0x00                       # jmp  11b
-
-# Hypervisor uses this for application faults while it executes.
-ENTRY(failsafe_callback)
-1:      pop  %ds
-2:      pop  %es
-3:      pop  %fs
-4:      pop  %gs
-5:      iret
-.section .fixup,"ax";  \
-6:     movl $0,(%esp); \
-       jmp 1b;         \
-7:     movl $0,(%esp); \
-       jmp 2b;         \
-8:     movl $0,(%esp); \
-       jmp 3b;         \
-9:     movl $0,(%esp); \
-       jmp 4b;         \
-10:    pushl %ss;      \
-       popl %ds;       \
-       pushl %ss;      \
-       popl %es;       \
-       pushl $11;      \
-       call do_exit;   \
-.previous;             \
-.section __ex_table,"a";\
-       .align 4;       \
-       .long 1b,6b;    \
-       .long 2b,7b;    \
-       .long 3b,8b;    \
-       .long 4b,9b;    \
-       .long 5b,10b;   \
-.previous
-        
-ENTRY(coprocessor_error)
-       pushl $0
-       pushl $ SYMBOL_NAME(do_coprocessor_error)
-       jmp error_code
-
-ENTRY(simd_coprocessor_error)
-       pushl $0
-       pushl $ SYMBOL_NAME(do_simd_coprocessor_error)
-       jmp error_code
-
-ENTRY(device_not_available)
-       pushl $-1               # mark this as an int
-       SAVE_ALL
-       GET_CURRENT(%ebx)
-       call SYMBOL_NAME(math_state_restore)
-       jmp ret_from_exception
-
-ENTRY(debug)
-       pushl $0
-       pushl $ SYMBOL_NAME(do_debug)
-       jmp error_code
-
-ENTRY(int3)
-       pushl $0
-       pushl $ SYMBOL_NAME(do_int3)
-       jmp error_code
-
-ENTRY(overflow)
-       pushl $0
-       pushl $ SYMBOL_NAME(do_overflow)
-       jmp error_code
-
-ENTRY(bounds)
-       pushl $0
-       pushl $ SYMBOL_NAME(do_bounds)
-       jmp error_code
-
-ENTRY(invalid_op)
-       pushl $0
-       pushl $ SYMBOL_NAME(do_invalid_op)
-       jmp error_code
-
-ENTRY(coprocessor_segment_overrun)
-       pushl $0
-       pushl $ SYMBOL_NAME(do_coprocessor_segment_overrun)
-       jmp error_code
-
-ENTRY(double_fault)
-       pushl $ SYMBOL_NAME(do_double_fault)
-       jmp error_code
-
-ENTRY(invalid_TSS)
-       pushl $ SYMBOL_NAME(do_invalid_TSS)
-       jmp error_code
-
-ENTRY(segment_not_present)
-       pushl $ SYMBOL_NAME(do_segment_not_present)
-       jmp error_code
-
-ENTRY(stack_segment)
-       pushl $ SYMBOL_NAME(do_stack_segment)
-       jmp error_code
-
-ENTRY(general_protection)
-       pushl $ SYMBOL_NAME(do_general_protection)
-       jmp error_code
-
-ENTRY(alignment_check)
-       pushl $ SYMBOL_NAME(do_alignment_check)
-       jmp error_code
-
-# This handler is special, because it gets an extra value on its stack,
-# which is the linear faulting address.
-ENTRY(page_fault)
-       pushl %ds
-       pushl %eax
-       xorl %eax,%eax
-       pushl %ebp
-       pushl %edi
-       pushl %esi
-       pushl %edx
-       decl %eax                       # eax = -1
-       pushl %ecx
-       pushl %ebx
-       GET_CURRENT(%ebx)
-       cld
-       movl %es,%ecx
-       movl ORIG_EAX(%esp), %esi       # get the error code
-       movl ES(%esp), %edi             # get the faulting address
-       movl %eax, ORIG_EAX(%esp)
-       movl %ecx, ES(%esp)
-       movl %esp,%edx
-        pushl %edi                      # push the faulting address
-       pushl %esi                      # push the error code
-       pushl %edx                      # push the pt_regs pointer
-       movl $(__KERNEL_DS),%edx
-       movl %edx,%ds
-       movl %edx,%es
-       call SYMBOL_NAME(do_page_fault)
-       addl $12,%esp
-       jmp ret_from_exception
-
-ENTRY(machine_check)
-       pushl $0
-       pushl $ SYMBOL_NAME(do_machine_check)
-       jmp error_code
-
-ENTRY(spurious_interrupt_bug)
-       pushl $0
-       pushl $ SYMBOL_NAME(do_spurious_interrupt_bug)
-       jmp error_code
-
-.data
-ENTRY(sys_call_table)
-       .long SYMBOL_NAME(sys_ni_syscall)       /* 0  -  old "setup()" system call*/
-       .long SYMBOL_NAME(sys_exit)
-       .long SYMBOL_NAME(sys_fork)
-       .long SYMBOL_NAME(sys_read)
-       .long SYMBOL_NAME(sys_write)
-       .long SYMBOL_NAME(sys_open)             /* 5 */
-       .long SYMBOL_NAME(sys_close)
-       .long SYMBOL_NAME(sys_waitpid)
-       .long SYMBOL_NAME(sys_creat)
-       .long SYMBOL_NAME(sys_link)
-       .long SYMBOL_NAME(sys_unlink)           /* 10 */
-       .long SYMBOL_NAME(sys_execve)
-       .long SYMBOL_NAME(sys_chdir)
-       .long SYMBOL_NAME(sys_time)
-       .long SYMBOL_NAME(sys_mknod)
-       .long SYMBOL_NAME(sys_chmod)            /* 15 */
-       .long SYMBOL_NAME(sys_lchown16)
-       .long SYMBOL_NAME(sys_ni_syscall)                               /* old break syscall holder */
-       .long SYMBOL_NAME(sys_stat)
-       .long SYMBOL_NAME(sys_lseek)
-       .long SYMBOL_NAME(sys_getpid)           /* 20 */
-       .long SYMBOL_NAME(sys_mount)
-       .long SYMBOL_NAME(sys_oldumount)
-       .long SYMBOL_NAME(sys_setuid16)
-       .long SYMBOL_NAME(sys_getuid16)
-       .long SYMBOL_NAME(sys_stime)            /* 25 */
-       .long SYMBOL_NAME(sys_ptrace)
-       .long SYMBOL_NAME(sys_alarm)
-       .long SYMBOL_NAME(sys_fstat)
-       .long SYMBOL_NAME(sys_pause)
-       .long SYMBOL_NAME(sys_utime)            /* 30 */
-       .long SYMBOL_NAME(sys_ni_syscall)                               /* old stty syscall holder */
-       .long SYMBOL_NAME(sys_ni_syscall)                               /* old gtty syscall holder */
-       .long SYMBOL_NAME(sys_access)
-       .long SYMBOL_NAME(sys_nice)
-       .long SYMBOL_NAME(sys_ni_syscall)       /* 35 */                /* old ftime syscall holder */
-       .long SYMBOL_NAME(sys_sync)
-       .long SYMBOL_NAME(sys_kill)
-       .long SYMBOL_NAME(sys_rename)
-       .long SYMBOL_NAME(sys_mkdir)
-       .long SYMBOL_NAME(sys_rmdir)            /* 40 */
-       .long SYMBOL_NAME(sys_dup)
-       .long SYMBOL_NAME(sys_pipe)
-       .long SYMBOL_NAME(sys_times)
-       .long SYMBOL_NAME(sys_ni_syscall)                               /* old prof syscall holder */
-       .long SYMBOL_NAME(sys_brk)              /* 45 */
-       .long SYMBOL_NAME(sys_setgid16)
-       .long SYMBOL_NAME(sys_getgid16)
-       .long SYMBOL_NAME(sys_signal)
-       .long SYMBOL_NAME(sys_geteuid16)
-       .long SYMBOL_NAME(sys_getegid16)        /* 50 */
-       .long SYMBOL_NAME(sys_acct)
-       .long SYMBOL_NAME(sys_umount)                                   /* recycled never used phys() */
-       .long SYMBOL_NAME(sys_ni_syscall)                               /* old lock syscall holder */
-       .long SYMBOL_NAME(sys_ioctl)
-       .long SYMBOL_NAME(sys_fcntl)            /* 55 */
-       .long SYMBOL_NAME(sys_ni_syscall)                               /* old mpx syscall holder */
-       .long SYMBOL_NAME(sys_setpgid)
-       .long SYMBOL_NAME(sys_ni_syscall)                               /* old ulimit syscall holder */
-       .long SYMBOL_NAME(sys_olduname)
-       .long SYMBOL_NAME(sys_umask)            /* 60 */
-       .long SYMBOL_NAME(sys_chroot)
-       .long SYMBOL_NAME(sys_ustat)
-       .long SYMBOL_NAME(sys_dup2)
-       .long SYMBOL_NAME(sys_getppid)
-       .long SYMBOL_NAME(sys_getpgrp)          /* 65 */
-       .long SYMBOL_NAME(sys_setsid)
-       .long SYMBOL_NAME(sys_sigaction)
-       .long SYMBOL_NAME(sys_sgetmask)
-       .long SYMBOL_NAME(sys_ssetmask)
-       .long SYMBOL_NAME(sys_setreuid16)       /* 70 */
-       .long SYMBOL_NAME(sys_setregid16)
-       .long SYMBOL_NAME(sys_sigsuspend)
-       .long SYMBOL_NAME(sys_sigpending)
-       .long SYMBOL_NAME(sys_sethostname)
-       .long SYMBOL_NAME(sys_setrlimit)        /* 75 */
-       .long SYMBOL_NAME(sys_old_getrlimit)
-       .long SYMBOL_NAME(sys_getrusage)
-       .long SYMBOL_NAME(sys_gettimeofday)
-       .long SYMBOL_NAME(sys_settimeofday)
-       .long SYMBOL_NAME(sys_getgroups16)      /* 80 */
-       .long SYMBOL_NAME(sys_setgroups16)
-       .long SYMBOL_NAME(old_select)
-       .long SYMBOL_NAME(sys_symlink)
-       .long SYMBOL_NAME(sys_lstat)
-       .long SYMBOL_NAME(sys_readlink)         /* 85 */
-       .long SYMBOL_NAME(sys_uselib)
-       .long SYMBOL_NAME(sys_swapon)
-       .long SYMBOL_NAME(sys_reboot)
-       .long SYMBOL_NAME(old_readdir)
-       .long SYMBOL_NAME(old_mmap)             /* 90 */
-       .long SYMBOL_NAME(sys_munmap)
-       .long SYMBOL_NAME(sys_truncate)
-       .long SYMBOL_NAME(sys_ftruncate)
-       .long SYMBOL_NAME(sys_fchmod)
-       .long SYMBOL_NAME(sys_fchown16)         /* 95 */
-       .long SYMBOL_NAME(sys_getpriority)
-       .long SYMBOL_NAME(sys_setpriority)
-       .long SYMBOL_NAME(sys_ni_syscall)                               /* old profil syscall holder */
-       .long SYMBOL_NAME(sys_statfs)
-       .long SYMBOL_NAME(sys_fstatfs)          /* 100 */
-       .long SYMBOL_NAME(sys_ioperm)
-       .long SYMBOL_NAME(sys_socketcall)
-       .long SYMBOL_NAME(sys_syslog)
-       .long SYMBOL_NAME(sys_setitimer)
-       .long SYMBOL_NAME(sys_getitimer)        /* 105 */
-       .long SYMBOL_NAME(sys_newstat)
-       .long SYMBOL_NAME(sys_newlstat)
-       .long SYMBOL_NAME(sys_newfstat)
-       .long SYMBOL_NAME(sys_uname)
-       .long SYMBOL_NAME(sys_iopl)             /* 110 */
-       .long SYMBOL_NAME(sys_vhangup)
-       .long SYMBOL_NAME(sys_ni_syscall)       /* old "idle" system call */
-       .long SYMBOL_NAME(sys_ni_syscall) /* was VM86 */
-       .long SYMBOL_NAME(sys_wait4)
-       .long SYMBOL_NAME(sys_swapoff)          /* 115 */
-       .long SYMBOL_NAME(sys_sysinfo)
-       .long SYMBOL_NAME(sys_ipc)
-       .long SYMBOL_NAME(sys_fsync)
-       .long SYMBOL_NAME(sys_sigreturn)
-       .long SYMBOL_NAME(sys_clone)            /* 120 */
-       .long SYMBOL_NAME(sys_setdomainname)
-       .long SYMBOL_NAME(sys_newuname)
-       .long SYMBOL_NAME(sys_modify_ldt)
-       .long SYMBOL_NAME(sys_adjtimex)
-       .long SYMBOL_NAME(sys_mprotect)         /* 125 */
-       .long SYMBOL_NAME(sys_sigprocmask)
-       .long SYMBOL_NAME(sys_create_module)
-       .long SYMBOL_NAME(sys_init_module)
-       .long SYMBOL_NAME(sys_delete_module)
-       .long SYMBOL_NAME(sys_get_kernel_syms)  /* 130 */
-       .long SYMBOL_NAME(sys_quotactl)
-       .long SYMBOL_NAME(sys_getpgid)
-       .long SYMBOL_NAME(sys_fchdir)
-       .long SYMBOL_NAME(sys_bdflush)
-       .long SYMBOL_NAME(sys_sysfs)            /* 135 */
-       .long SYMBOL_NAME(sys_personality)
-       .long SYMBOL_NAME(sys_ni_syscall)       /* for afs_syscall */
-       .long SYMBOL_NAME(sys_setfsuid16)
-       .long SYMBOL_NAME(sys_setfsgid16)
-       .long SYMBOL_NAME(sys_llseek)           /* 140 */
-       .long SYMBOL_NAME(sys_getdents)
-       .long SYMBOL_NAME(sys_select)
-       .long SYMBOL_NAME(sys_flock)
-       .long SYMBOL_NAME(sys_msync)
-       .long SYMBOL_NAME(sys_readv)            /* 145 */
-       .long SYMBOL_NAME(sys_writev)
-       .long SYMBOL_NAME(sys_getsid)
-       .long SYMBOL_NAME(sys_fdatasync)
-       .long SYMBOL_NAME(sys_sysctl)
-       .long SYMBOL_NAME(sys_mlock)            /* 150 */
-       .long SYMBOL_NAME(sys_munlock)
-       .long SYMBOL_NAME(sys_mlockall)
-       .long SYMBOL_NAME(sys_munlockall)
-       .long SYMBOL_NAME(sys_sched_setparam)
-       .long SYMBOL_NAME(sys_sched_getparam)   /* 155 */
-       .long SYMBOL_NAME(sys_sched_setscheduler)
-       .long SYMBOL_NAME(sys_sched_getscheduler)
-       .long SYMBOL_NAME(sys_sched_yield)
-       .long SYMBOL_NAME(sys_sched_get_priority_max)
-       .long SYMBOL_NAME(sys_sched_get_priority_min)  /* 160 */
-       .long SYMBOL_NAME(sys_sched_rr_get_interval)
-       .long SYMBOL_NAME(sys_nanosleep)
-       .long SYMBOL_NAME(sys_mremap)
-       .long SYMBOL_NAME(sys_setresuid16)
-       .long SYMBOL_NAME(sys_getresuid16)      /* 165 */
-       .long SYMBOL_NAME(sys_ni_syscall) /* was VM86 */
-       .long SYMBOL_NAME(sys_query_module)
-       .long SYMBOL_NAME(sys_poll)
-       .long SYMBOL_NAME(sys_nfsservctl)
-       .long SYMBOL_NAME(sys_setresgid16)      /* 170 */
-       .long SYMBOL_NAME(sys_getresgid16)
-       .long SYMBOL_NAME(sys_prctl)
-       .long SYMBOL_NAME(sys_rt_sigreturn)
-       .long SYMBOL_NAME(sys_rt_sigaction)
-       .long SYMBOL_NAME(sys_rt_sigprocmask)   /* 175 */
-       .long SYMBOL_NAME(sys_rt_sigpending)
-       .long SYMBOL_NAME(sys_rt_sigtimedwait)
-       .long SYMBOL_NAME(sys_rt_sigqueueinfo)
-       .long SYMBOL_NAME(sys_rt_sigsuspend)
-       .long SYMBOL_NAME(sys_pread)            /* 180 */
-       .long SYMBOL_NAME(sys_pwrite)
-       .long SYMBOL_NAME(sys_chown16)
-       .long SYMBOL_NAME(sys_getcwd)
-       .long SYMBOL_NAME(sys_capget)
-       .long SYMBOL_NAME(sys_capset)           /* 185 */
-       .long SYMBOL_NAME(sys_sigaltstack)
-       .long SYMBOL_NAME(sys_sendfile)
-       .long SYMBOL_NAME(sys_ni_syscall)               /* streams1 */
-       .long SYMBOL_NAME(sys_ni_syscall)               /* streams2 */
-       .long SYMBOL_NAME(sys_vfork)            /* 190 */
-       .long SYMBOL_NAME(sys_getrlimit)
-       .long SYMBOL_NAME(sys_mmap2)
-       .long SYMBOL_NAME(sys_truncate64)
-       .long SYMBOL_NAME(sys_ftruncate64)
-       .long SYMBOL_NAME(sys_stat64)           /* 195 */
-       .long SYMBOL_NAME(sys_lstat64)
-       .long SYMBOL_NAME(sys_fstat64)
-       .long SYMBOL_NAME(sys_lchown)
-       .long SYMBOL_NAME(sys_getuid)
-       .long SYMBOL_NAME(sys_getgid)           /* 200 */
-       .long SYMBOL_NAME(sys_geteuid)
-       .long SYMBOL_NAME(sys_getegid)
-       .long SYMBOL_NAME(sys_setreuid)
-       .long SYMBOL_NAME(sys_setregid)
-       .long SYMBOL_NAME(sys_getgroups)        /* 205 */
-       .long SYMBOL_NAME(sys_setgroups)
-       .long SYMBOL_NAME(sys_fchown)
-       .long SYMBOL_NAME(sys_setresuid)
-       .long SYMBOL_NAME(sys_getresuid)
-       .long SYMBOL_NAME(sys_setresgid)        /* 210 */
-       .long SYMBOL_NAME(sys_getresgid)
-       .long SYMBOL_NAME(sys_chown)
-       .long SYMBOL_NAME(sys_setuid)
-       .long SYMBOL_NAME(sys_setgid)
-       .long SYMBOL_NAME(sys_setfsuid)         /* 215 */
-       .long SYMBOL_NAME(sys_setfsgid)
-       .long SYMBOL_NAME(sys_pivot_root)
-       .long SYMBOL_NAME(sys_mincore)
-       .long SYMBOL_NAME(sys_madvise)
-       .long SYMBOL_NAME(sys_getdents64)       /* 220 */
-       .long SYMBOL_NAME(sys_fcntl64)
-       .long SYMBOL_NAME(sys_ni_syscall)       /* reserved for TUX */
-       .long SYMBOL_NAME(sys_ni_syscall)       /* Reserved for Security */
-       .long SYMBOL_NAME(sys_gettid)
-       .long SYMBOL_NAME(sys_readahead)        /* 225 */
-       .long SYMBOL_NAME(sys_setxattr)
-       .long SYMBOL_NAME(sys_lsetxattr)
-       .long SYMBOL_NAME(sys_fsetxattr)
-       .long SYMBOL_NAME(sys_getxattr)
-       .long SYMBOL_NAME(sys_lgetxattr)        /* 230 */
-       .long SYMBOL_NAME(sys_fgetxattr)
-       .long SYMBOL_NAME(sys_listxattr)
-       .long SYMBOL_NAME(sys_llistxattr)
-       .long SYMBOL_NAME(sys_flistxattr)
-       .long SYMBOL_NAME(sys_removexattr)      /* 235 */
-       .long SYMBOL_NAME(sys_lremovexattr)
-       .long SYMBOL_NAME(sys_fremovexattr)
-       .long SYMBOL_NAME(sys_tkill)
-       .long SYMBOL_NAME(sys_sendfile64)
-       .long SYMBOL_NAME(sys_ni_syscall)       /* 240 reserved for futex */
-       .long SYMBOL_NAME(sys_ni_syscall)       /* reserved for sched_setaffinity */
-       .long SYMBOL_NAME(sys_ni_syscall)       /* reserved for sched_getaffinity */
-       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_set_thread_area */
-       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_get_thread_area */
-       .long SYMBOL_NAME(sys_ni_syscall)       /* 245 sys_io_setup */
-       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_io_destroy */
-       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_io_getevents */
-       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_io_submit */
-       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_io_cancel */
-       .long SYMBOL_NAME(sys_ni_syscall)       /* 250 sys_alloc_hugepages */
-       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_free_hugepages */
-       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_exit_group */
-       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_lookup_dcookie */
-       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_epoll_create */
-       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_epoll_ctl 255 */
-       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_epoll_wait */
-       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_remap_file_pages */
-       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_set_tid_address */
-
-       .rept NR_syscalls-(.-sys_call_table)/4
-               .long SYMBOL_NAME(sys_ni_syscall)
-       .endr
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/kernel/head.S b/xenolinux-2.4.21-sparse/arch/xeno/kernel/head.S
deleted file mode 100644 (file)
index a89fd8e..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-
-.text
-#include <linux/config.h>
-#include <linux/threads.h>
-#include <linux/linkage.h>
-#include <asm/segment.h>
-#include <asm/page.h>
-#include <asm/pgtable.h>
-#include <asm/desc.h>
-
-/* Offsets in start_info structure */
-#define SHARED_INFO  4
-#define MOD_START   12
-#define MOD_LEN     16
-                
-startup_32:
-        cld
-        
-        lss stack_start,%esp
-
-        /* Copy initrd somewhere safe before it's clobbered by BSS. */
-        mov  MOD_LEN(%esi),%ecx
-        shr  $2,%ecx
-        jz   2f        /* bail from copy loop if no initrd */
-        mov  $SYMBOL_NAME(_end),%edi
-        add  MOD_LEN(%esi),%edi
-        mov  MOD_START(%esi),%eax
-        add  MOD_LEN(%esi),%eax
-1:      sub  $4,%eax
-        sub  $4,%edi
-        mov  (%eax),%ebx
-        mov  %ebx,(%edi)
-        loop 1b
-        mov  %edi,MOD_START(%esi)
-                
-        /* Clear BSS first so that there are no surprises... */
-2:      xorl %eax,%eax
-       movl $SYMBOL_NAME(__bss_start),%edi
-       movl $SYMBOL_NAME(_end),%ecx
-       subl %edi,%ecx
-       rep stosb
-
-        /* Copy the necessary stuff from start_info structure. */
-        /* We need to copy shared_info early, so that sti/cli work */
-        mov  SHARED_INFO(%esi),%eax
-        mov  %eax,SYMBOL_NAME(HYPERVISOR_shared_info)
-        mov  $SYMBOL_NAME(start_info_union),%edi
-        mov  $128,%ecx
-        rep movsl
-                
-        jmp SYMBOL_NAME(start_kernel)
-
-ENTRY(stack_start)
-       .long SYMBOL_NAME(init_task_union)+8192, __KERNEL_DS
-
-.org 0x1000
-ENTRY(empty_zero_page)
-
-.org 0x2000
-ENTRY(default_ldt)
-
-.org 0x3000
-ENTRY(cpu0_pte_quicklist)
-
-.org 0x3400
-ENTRY(cpu0_pgd_quicklist)
-        
-.org 0x3800
-ENTRY(stext)
-ENTRY(_stext)
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/kernel/hypervisor.c b/xenolinux-2.4.21-sparse/arch/xeno/kernel/hypervisor.c
deleted file mode 100644 (file)
index 3f414e9..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-/******************************************************************************
- * hypervisor.c
- * 
- * Communication to/from hypervisor.
- * 
- * Copyright (c) 2002, K A Fraser
- */
-
-#include <linux/config.h>
-#include <asm/atomic.h>
-#include <linux/irq.h>
-#include <asm/hypervisor.h>
-#include <asm/system.h>
-#include <asm/ptrace.h>
-
-multicall_entry_t multicall_list[8];
-int nr_multicall_ents = 0;
-
-static unsigned long event_mask = 0;
-
-void frobb(void) {}
-
-void do_hypervisor_callback(struct pt_regs *regs)
-{
-    unsigned long events, flags;
-    shared_info_t *shared = HYPERVISOR_shared_info;
-
-    do {
-        /* Specialised local_irq_save(). */
-        flags = test_and_clear_bit(EVENTS_MASTER_ENABLE_BIT, 
-                                   &shared->events_mask);
-        barrier();
-
-        events  = xchg(&shared->events, 0);
-        events &= event_mask;
-
-        __asm__ __volatile__ (
-            "   push %1                            ;"
-            "   sub  $4,%%esp                      ;"
-            "   jmp  2f                            ;"
-            "1: btrl %%eax,%0                      ;" /* clear bit     */
-            "   mov  %%eax,(%%esp)                 ;"
-            "   call do_IRQ                        ;" /* do_IRQ(event) */
-            "2: bsfl %0,%%eax                      ;" /* %eax == bit # */
-            "   jnz  1b                            ;"
-            "   add  $8,%%esp                      ;"
-            /* we use %ebx because it is callee-saved */
-            : : "b" (events), "r" (regs)
-            /* clobbered by callback function calls */
-            : "eax", "ecx", "edx", "memory" ); 
-
-        /* Specialised local_irq_restore(). */
-        if ( flags ) set_bit(EVENTS_MASTER_ENABLE_BIT, &shared->events_mask);
-        barrier();
-    }
-    while ( shared->events );
-}
-
-
-
-/*
- * Define interface to generic handling in irq.c
- */
-
-static void shutdown_hypervisor_event(unsigned int irq)
-{
-    clear_bit(irq, &event_mask);
-    clear_bit(irq, &HYPERVISOR_shared_info->events_mask);
-}
-
-static void enable_hypervisor_event(unsigned int irq)
-{
-    set_bit(irq, &event_mask);
-    set_bit(irq, &HYPERVISOR_shared_info->events_mask);
-    if ( test_bit(EVENTS_MASTER_ENABLE_BIT, 
-                  &HYPERVISOR_shared_info->events_mask) )
-        do_hypervisor_callback(NULL);
-}
-
-static void disable_hypervisor_event(unsigned int irq)
-{
-    clear_bit(irq, &event_mask);
-    clear_bit(irq, &HYPERVISOR_shared_info->events_mask);
-}
-
-static void ack_hypervisor_event(unsigned int irq)
-{
-    if ( !(event_mask & (1<<irq)) )
-    {
-        printk("Unexpected hypervisor event %d\n", irq);
-        atomic_inc(&irq_err_count);
-    }
-    set_bit(irq, &HYPERVISOR_shared_info->events_mask);
-}
-
-static unsigned int startup_hypervisor_event(unsigned int irq)
-{
-    enable_hypervisor_event(irq);
-    return 0;
-}
-
-static void end_hypervisor_event(unsigned int irq)
-{
-}
-
-static struct hw_interrupt_type hypervisor_irq_type = {
-    "Hypervisor-event",
-    startup_hypervisor_event,
-    shutdown_hypervisor_event,
-    enable_hypervisor_event,
-    disable_hypervisor_event,
-    ack_hypervisor_event,
-    end_hypervisor_event,
-    NULL
-};
-
-void __init init_IRQ(void)
-{
-    int i;
-
-    for ( i = 0; i < NR_IRQS; i++ )
-    {
-        irq_desc[i].status  = IRQ_DISABLED;
-        irq_desc[i].action  = 0;
-        irq_desc[i].depth   = 1;
-        irq_desc[i].handler = &hypervisor_irq_type;
-    }
-}
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/kernel/i386_ksyms.c b/xenolinux-2.4.21-sparse/arch/xeno/kernel/i386_ksyms.c
deleted file mode 100644 (file)
index b62c171..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/smp.h>
-#include <linux/user.h>
-#include <linux/elfcore.h>
-#include <linux/mca.h>
-#include <linux/sched.h>
-#include <linux/in6.h>
-#include <linux/interrupt.h>
-#include <linux/smp_lock.h>
-#include <linux/pm.h>
-//XXX ??? #include <linux/pci.h>
-#include <linux/apm_bios.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/tty.h>
-
-#include <asm/semaphore.h>
-#include <asm/processor.h>
-#include <asm/i387.h>
-#include <asm/uaccess.h>
-#include <asm/checksum.h>
-#include <asm/io.h>
-#include <asm/hardirq.h>
-#include <asm/delay.h>
-#include <asm/irq.h>
-#include <asm/mmx.h>
-#include <asm/desc.h>
-#include <asm/pgtable.h>
-#include <asm/pgalloc.h>
-
-extern void dump_thread(struct pt_regs *, struct user *);
-extern spinlock_t rtc_lock;
-
-#if defined(CONFIG_APMXXX) || defined(CONFIG_APM_MODULEXXX)
-extern void machine_real_restart(unsigned char *, int);
-EXPORT_SYMBOL(machine_real_restart);
-extern void default_idle(void);
-EXPORT_SYMBOL(default_idle);
-#endif
-
-#ifdef CONFIG_SMP
-extern void FASTCALL( __write_lock_failed(rwlock_t *rw));
-extern void FASTCALL( __read_lock_failed(rwlock_t *rw));
-#endif
-
-#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_HD) || defined(CONFIG_BLK_DEV_IDE_MODULE) || defined(CONFIG_BLK_DEV_HD_MODULE)
-extern struct drive_info_struct drive_info;
-EXPORT_SYMBOL(drive_info);
-#endif
-
-// XXX extern unsigned long get_cmos_time(void);
-
-/* platform dependent support */
-EXPORT_SYMBOL(boot_cpu_data);
-EXPORT_SYMBOL(dump_thread);
-EXPORT_SYMBOL(dump_fpu);
-EXPORT_SYMBOL(dump_extended_fpu);
-EXPORT_SYMBOL(enable_irq);
-EXPORT_SYMBOL(disable_irq);
-EXPORT_SYMBOL(disable_irq_nosync);
-EXPORT_SYMBOL(probe_irq_mask);
-EXPORT_SYMBOL(kernel_thread);
-EXPORT_SYMBOL(pm_idle);
-EXPORT_SYMBOL(pm_power_off);
-EXPORT_SYMBOL(apm_info);
-//EXPORT_SYMBOL(gdt);
-EXPORT_SYMBOL(empty_zero_page);
-
-#ifdef CONFIG_DEBUG_IOVIRT
-EXPORT_SYMBOL(__io_virt_debug);
-#endif
-
-EXPORT_SYMBOL_NOVERS(__down_failed);
-EXPORT_SYMBOL_NOVERS(__down_failed_interruptible);
-EXPORT_SYMBOL_NOVERS(__down_failed_trylock);
-EXPORT_SYMBOL_NOVERS(__up_wakeup);
-/* Networking helper routines. */
-EXPORT_SYMBOL(csum_partial_copy_generic);
-/* Delay loops */
-EXPORT_SYMBOL(__ndelay);
-EXPORT_SYMBOL(__udelay);
-EXPORT_SYMBOL(__delay);
-EXPORT_SYMBOL(__const_udelay);
-
-EXPORT_SYMBOL_NOVERS(__get_user_1);
-EXPORT_SYMBOL_NOVERS(__get_user_2);
-EXPORT_SYMBOL_NOVERS(__get_user_4);
-
-EXPORT_SYMBOL(strtok);
-EXPORT_SYMBOL(strpbrk);
-EXPORT_SYMBOL(strstr);
-
-EXPORT_SYMBOL(strncpy_from_user);
-EXPORT_SYMBOL(__strncpy_from_user);
-EXPORT_SYMBOL(clear_user);
-EXPORT_SYMBOL(__clear_user);
-EXPORT_SYMBOL(__generic_copy_from_user);
-EXPORT_SYMBOL(__generic_copy_to_user);
-EXPORT_SYMBOL(strnlen_user);
-
-#ifdef CONFIG_X86_USE_3DNOW
-EXPORT_SYMBOL(_mmx_memcpy);
-EXPORT_SYMBOL(mmx_clear_page);
-EXPORT_SYMBOL(mmx_copy_page);
-#endif
-
-#ifdef CONFIG_SMP
-EXPORT_SYMBOL(cpu_data);
-EXPORT_SYMBOL(kernel_flag_cacheline);
-EXPORT_SYMBOL(smp_num_cpus);
-EXPORT_SYMBOL(cpu_online_map);
-EXPORT_SYMBOL_NOVERS(__write_lock_failed);
-EXPORT_SYMBOL_NOVERS(__read_lock_failed);
-
-/* Global SMP irq stuff */
-EXPORT_SYMBOL(synchronize_irq);
-EXPORT_SYMBOL(global_irq_holder);
-EXPORT_SYMBOL(__global_cli);
-EXPORT_SYMBOL(__global_sti);
-EXPORT_SYMBOL(__global_save_flags);
-EXPORT_SYMBOL(__global_restore_flags);
-EXPORT_SYMBOL(smp_call_function);
-
-/* TLB flushing */
-EXPORT_SYMBOL(flush_tlb_page);
-#endif
-
-#ifdef CONFIG_X86_IO_APIC
-EXPORT_SYMBOL(IO_APIC_get_PCI_irq_vector);
-#endif
-
-#ifdef CONFIG_VT
-EXPORT_SYMBOL(screen_info);
-#endif
-
-EXPORT_SYMBOL(get_wchan);
-
-EXPORT_SYMBOL(rtc_lock);
-
-#undef memcpy
-#undef memset
-extern void * memset(void *,int,__kernel_size_t);
-extern void * memcpy(void *,const void *,__kernel_size_t);
-EXPORT_SYMBOL_NOVERS(memcpy);
-EXPORT_SYMBOL_NOVERS(memset);
-
-#ifdef CONFIG_HAVE_DEC_LOCK
-EXPORT_SYMBOL(atomic_dec_and_lock);
-#endif
-
-#ifdef CONFIG_MULTIQUAD
-EXPORT_SYMBOL(xquad_portio);
-#endif
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/kernel/ioport.c b/xenolinux-2.4.21-sparse/arch/xeno/kernel/ioport.c
deleted file mode 100644 (file)
index ed6dbbc..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/types.h>
-#include <linux/stddef.h>
-#include <asm/hypervisor-ifs/dom0_ops.h>
-
-
-asmlinkage int sys_iopl(unsigned int new_io_pl)
-{
-    unsigned int old_io_pl = current->thread.io_pl;
-    dom0_op_t op;
-
-    if ( !(start_info.flags & SIF_PRIVILEGED) )
-        return -EPERM;
-
-    if ( new_io_pl > 3 )
-        return -EINVAL;
-
-    /* Need "raw I/O" privileges for direct port access. */
-    if ( (new_io_pl > old_io_pl) && !capable(CAP_SYS_RAWIO) )
-        return -EPERM;
-
-    /* Maintain OS privileges even if user attempts to relinquish them. */
-    if ( (new_io_pl == 0) && (start_info.flags & SIF_PRIVILEGED) )
-        new_io_pl = 1;
-
-    /* Change our version of the privilege levels. */
-    current->thread.io_pl = new_io_pl;
-
-    /* Force the change at ring 0. */
-    op.cmd           = DOM0_IOPL;
-    op.u.iopl.domain = start_info.dom_id;
-    op.u.iopl.iopl   = new_io_pl;
-    HYPERVISOR_dom0_op(&op);
-
-    return 0;
-}
-
-
-asmlinkage int sys_ioperm(unsigned long from, unsigned long num, int turn_on)
-{
-    printk(KERN_INFO "ioperm not fully supported - %s\n",
-           turn_on ? "set iopl to 3" : "ignore resource release");
-    return turn_on ? sys_iopl(3) : 0;
-}
-
-
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/kernel/irq.c b/xenolinux-2.4.21-sparse/arch/xeno/kernel/irq.c
deleted file mode 100644 (file)
index 4f44969..0000000
+++ /dev/null
@@ -1,1136 +0,0 @@
-/*
- *     linux/arch/i386/kernel/irq.c
- *
- *     Copyright (C) 1992, 1998 Linus Torvalds, Ingo Molnar
- *
- * This file contains the code used by various IRQ handling routines:
- * asking for different IRQ's should be done through these routines
- * instead of just grabbing them. Thus setups with different IRQ numbers
- * shouldn't result in any weird surprises, and installing new handlers
- * should be easier.
- */
-
-/*
- * (mostly architecture independent, will move to kernel/irq.c in 2.5.)
- *
- * IRQs are in fact implemented a bit like signal handlers for the kernel.
- * Naturally it's not a 1:1 relation, but there are similarities.
- */
-
-#include <linux/config.h>
-#include <linux/ptrace.h>
-#include <linux/errno.h>
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/ioport.h>
-#include <linux/interrupt.h>
-#include <linux/timex.h>
-#include <linux/slab.h>
-#include <linux/random.h>
-#include <linux/smp_lock.h>
-#include <linux/init.h>
-#include <linux/kernel_stat.h>
-#include <linux/irq.h>
-#include <linux/proc_fs.h>
-
-#include <asm/atomic.h>
-#include <asm/io.h>
-#include <asm/smp.h>
-#include <asm/system.h>
-#include <asm/bitops.h>
-#include <asm/uaccess.h>
-#include <asm/pgalloc.h>
-#include <asm/delay.h>
-#include <asm/desc.h>
-#include <asm/irq.h>
-
-
-
-/*
- * Linux has a controller-independent x86 interrupt architecture.
- * every controller has a 'controller-template', that is used
- * by the main code to do the right thing. Each driver-visible
- * interrupt source is transparently wired to the apropriate
- * controller. Thus drivers need not be aware of the
- * interrupt-controller.
- *
- * Various interrupt controllers we handle: 8259 PIC, SMP IO-APIC,
- * PIIX4's internal 8259 PIC and SGI's Visual Workstation Cobalt (IO-)APIC.
- * (IO-APICs assumed to be messaging to Pentium local-APICs)
- *
- * the code is designed to be easily extended with new/different
- * interrupt controllers, without having to do assembly magic.
- */
-
-/*
- * Controller mappings for all interrupt sources:
- */
-irq_desc_t irq_desc[NR_IRQS] __cacheline_aligned =
-       { [0 ... NR_IRQS-1] = { 0, &no_irq_type, NULL, 0, SPIN_LOCK_UNLOCKED}};
-
-static void register_irq_proc (unsigned int irq);
-
-/*
- * Special irq handlers.
- */
-
-void no_action(int cpl, void *dev_id, struct pt_regs *regs) { }
-
-/*
- * Generic no controller code
- */
-
-static void enable_none(unsigned int irq) { }
-static unsigned int startup_none(unsigned int irq) { return 0; }
-static void disable_none(unsigned int irq) { }
-static void ack_none(unsigned int irq)
-{
-       printk("unexpected IRQ trap at vector %02x\n", irq);
-}
-
-/* startup is the same as "enable", shutdown is same as "disable" */
-#define shutdown_none  disable_none
-#define end_none       enable_none
-
-struct hw_interrupt_type no_irq_type = {
-       "none",
-       startup_none,
-       shutdown_none,
-       enable_none,
-       disable_none,
-       ack_none,
-       end_none
-};
-
-atomic_t irq_err_count;
-#ifdef CONFIG_X86_IO_APIC
-#ifdef APIC_MISMATCH_DEBUG
-atomic_t irq_mis_count;
-#endif
-#endif
-
-/*
- * Generic, controller-independent functions:
- */
-
-int get_irq_list(char *buf)
-{
-       int i, j;
-       struct irqaction * action;
-       char *p = buf;
-
-       p += sprintf(p, "           ");
-       for (j=0; j<smp_num_cpus; j++)
-               p += sprintf(p, "CPU%d       ",j);
-       *p++ = '\n';
-
-       for (i = 0 ; i < NR_IRQS ; i++) {
-               action = irq_desc[i].action;
-               if (!action) 
-                       continue;
-               p += sprintf(p, "%3d: ",i);
-#ifndef CONFIG_SMP
-               p += sprintf(p, "%10u ", kstat_irqs(i));
-#else
-               for (j = 0; j < smp_num_cpus; j++)
-                       p += sprintf(p, "%10u ",
-                               kstat.irqs[cpu_logical_map(j)][i]);
-#endif
-               p += sprintf(p, " %14s", irq_desc[i].handler->typename);
-               p += sprintf(p, "  %s", action->name);
-
-               for (action=action->next; action; action = action->next)
-                       p += sprintf(p, ", %s", action->name);
-               *p++ = '\n';
-       }
-       p += sprintf(p, "NMI: ");
-       for (j = 0; j < smp_num_cpus; j++)
-               p += sprintf(p, "%10u ",
-                       nmi_count(cpu_logical_map(j)));
-       p += sprintf(p, "\n");
-#if CONFIG_X86_LOCAL_APIC
-       p += sprintf(p, "LOC: ");
-       for (j = 0; j < smp_num_cpus; j++)
-               p += sprintf(p, "%10u ",
-                       apic_timer_irqs[cpu_logical_map(j)]);
-       p += sprintf(p, "\n");
-#endif
-       p += sprintf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
-#ifdef CONFIG_X86_IO_APIC
-#ifdef APIC_MISMATCH_DEBUG
-       p += sprintf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
-#endif
-#endif
-       return p - buf;
-}
-
-
-/*
- * Global interrupt locks for SMP. Allow interrupts to come in on any
- * CPU, yet make cli/sti act globally to protect critical regions..
- */
-
-#ifdef CONFIG_SMP
-unsigned char global_irq_holder = NO_PROC_ID;
-unsigned volatile long global_irq_lock; /* pendantic: long for set_bit --RR */
-
-extern void show_stack(unsigned long* esp);
-
-static void show(char * str)
-{
-       int i;
-       int cpu = smp_processor_id();
-
-       printk("\n%s, CPU %d:\n", str, cpu);
-       printk("irq:  %d [",irqs_running());
-       for(i=0;i < smp_num_cpus;i++)
-               printk(" %d",local_irq_count(i));
-       printk(" ]\nbh:   %d [",spin_is_locked(&global_bh_lock) ? 1 : 0);
-       for(i=0;i < smp_num_cpus;i++)
-               printk(" %d",local_bh_count(i));
-
-       printk(" ]\nStack dumps:");
-       for(i = 0; i < smp_num_cpus; i++) {
-               unsigned long esp;
-               if (i == cpu)
-                       continue;
-               printk("\nCPU %d:",i);
-               esp = init_tss[i].esp0;
-               if (!esp) {
-                       /* tss->esp0 is set to NULL in cpu_init(),
-                        * it's initialized when the cpu returns to user
-                        * space. -- manfreds
-                        */
-                       printk(" <unknown> ");
-                       continue;
-               }
-               esp &= ~(THREAD_SIZE-1);
-               esp += sizeof(struct task_struct);
-               show_stack((void*)esp);
-       }
-       printk("\nCPU %d:",cpu);
-       show_stack(NULL);
-       printk("\n");
-}
-       
-#define MAXCOUNT 100000000
-
-/*
- * I had a lockup scenario where a tight loop doing
- * spin_unlock()/spin_lock() on CPU#1 was racing with
- * spin_lock() on CPU#0. CPU#0 should have noticed spin_unlock(), but
- * apparently the spin_unlock() information did not make it
- * through to CPU#0 ... nasty, is this by design, do we have to limit
- * 'memory update oscillation frequency' artificially like here?
- *
- * Such 'high frequency update' races can be avoided by careful design, but
- * some of our major constructs like spinlocks use similar techniques,
- * it would be nice to clarify this issue. Set this define to 0 if you
- * want to check whether your system freezes.  I suspect the delay done
- * by SYNC_OTHER_CORES() is in correlation with 'snooping latency', but
- * i thought that such things are guaranteed by design, since we use
- * the 'LOCK' prefix.
- */
-#define SUSPECTED_CPU_OR_CHIPSET_BUG_WORKAROUND 0
-
-#if SUSPECTED_CPU_OR_CHIPSET_BUG_WORKAROUND
-# define SYNC_OTHER_CORES(x) udelay(x+1)
-#else
-/*
- * We have to allow irqs to arrive between __sti and __cli
- */
-# define SYNC_OTHER_CORES(x) __asm__ __volatile__ ("nop")
-#endif
-
-static inline void wait_on_irq(int cpu)
-{
-       int count = MAXCOUNT;
-
-       for (;;) {
-
-               /*
-                * Wait until all interrupts are gone. Wait
-                * for bottom half handlers unless we're
-                * already executing in one..
-                */
-               if (!irqs_running())
-                       if (local_bh_count(cpu) || !spin_is_locked(&global_bh_lock))
-                               break;
-
-               /* Duh, we have to loop. Release the lock to avoid deadlocks */
-               clear_bit(0,&global_irq_lock);
-
-               for (;;) {
-                       if (!--count) {
-                               show("wait_on_irq");
-                               count = ~0;
-                       }
-                       __sti();
-                       SYNC_OTHER_CORES(cpu);
-                       __cli();
-                       if (irqs_running())
-                               continue;
-                       if (global_irq_lock)
-                               continue;
-                       if (!local_bh_count(cpu) && spin_is_locked(&global_bh_lock))
-                               continue;
-                       if (!test_and_set_bit(0,&global_irq_lock))
-                               break;
-               }
-       }
-}
-
-/*
- * This is called when we want to synchronize with
- * interrupts. We may for example tell a device to
- * stop sending interrupts: but to make sure there
- * are no interrupts that are executing on another
- * CPU we need to call this function.
- */
-void synchronize_irq(void)
-{
-       if (irqs_running()) {
-               /* Stupid approach */
-               cli();
-               sti();
-       }
-}
-
-static inline void get_irqlock(int cpu)
-{
-       if (test_and_set_bit(0,&global_irq_lock)) {
-               /* do we already hold the lock? */
-               if ((unsigned char) cpu == global_irq_holder)
-                       return;
-               /* Uhhuh.. Somebody else got it. Wait.. */
-               do {
-                       do {
-                               rep_nop();
-                       } while (test_bit(0,&global_irq_lock));
-               } while (test_and_set_bit(0,&global_irq_lock));         
-       }
-       /* 
-        * We also to make sure that nobody else is running
-        * in an interrupt context. 
-        */
-       wait_on_irq(cpu);
-
-       /*
-        * Ok, finally..
-        */
-       global_irq_holder = cpu;
-}
-
-void __global_cli(void)
-{
-    panic("__global_cli");
-}
-
-void __global_sti(void)
-{
-    panic("__global_sti");
-}
-
-/*
- * SMP flags value to restore to:
- * 0 - global cli
- * 1 - global sti
- * 2 - local cli
- * 3 - local sti
- */
-unsigned long __global_save_flags(void)
-{
-    panic("__global_save_flags");
-}
-
-void __global_restore_flags(unsigned long flags)
-{
-    panic("__global_restore_flags");
-}
-
-#endif
-
-/*
- * This should really return information about whether
- * we should do bottom half handling etc. Right now we
- * end up _always_ checking the bottom half, which is a
- * waste of time and is not what some drivers would
- * prefer.
- */
-int handle_IRQ_event(unsigned int irq, struct pt_regs * regs, struct irqaction * action)
-{
-       int status;
-       int cpu = smp_processor_id();
-
-       irq_enter(cpu, irq);
-
-       status = 1;     /* Force the "do bottom halves" bit */
-
-       if (!(action->flags & SA_INTERRUPT))
-               __sti();
-
-       do {
-               status |= action->flags;
-               action->handler(irq, action->dev_id, regs);
-               action = action->next;
-       } while (action);
-       if (status & SA_SAMPLE_RANDOM)
-               add_interrupt_randomness(irq);
-       __cli();
-
-       irq_exit(cpu, irq);
-
-       return status;
-}
-
-/*
- * Generic enable/disable code: this just calls
- * down into the PIC-specific version for the actual
- * hardware disable after having gotten the irq
- * controller lock. 
- */
-/**
- *     disable_irq_nosync - disable an irq without waiting
- *     @irq: Interrupt to disable
- *
- *     Disable the selected interrupt line.  Disables and Enables are
- *     nested.
- *     Unlike disable_irq(), this function does not ensure existing
- *     instances of the IRQ handler have completed before returning.
- *
- *     This function may be called from IRQ context.
- */
-inline void disable_irq_nosync(unsigned int irq)
-{
-       irq_desc_t *desc = irq_desc + irq;
-       unsigned long flags;
-
-       spin_lock_irqsave(&desc->lock, flags);
-       if (!desc->depth++) {
-               desc->status |= IRQ_DISABLED;
-               desc->handler->disable(irq);
-       }
-       spin_unlock_irqrestore(&desc->lock, flags);
-}
-
-/**
- *     disable_irq - disable an irq and wait for completion
- *     @irq: Interrupt to disable
- *
- *     Disable the selected interrupt line.  Enables and Disables are
- *     nested.
- *     This function waits for any pending IRQ handlers for this interrupt
- *     to complete before returning. If you use this function while
- *     holding a resource the IRQ handler may need you will deadlock.
- *
- *     This function may be called - with care - from IRQ context.
- */
-void disable_irq(unsigned int irq)
-{
-       disable_irq_nosync(irq);
-
-       if (!local_irq_count(smp_processor_id())) {
-               do {
-                       barrier();
-                       cpu_relax();
-               } while (irq_desc[irq].status & IRQ_INPROGRESS);
-       }
-}
-
-/**
- *     enable_irq - enable handling of an irq
- *     @irq: Interrupt to enable
- *
- *     Undoes the effect of one call to disable_irq().  If this
- *     matches the last disable, processing of interrupts on this
- *     IRQ line is re-enabled.
- *
- *     This function may be called from IRQ context.
- */
-void enable_irq(unsigned int irq)
-{
-       irq_desc_t *desc = irq_desc + irq;
-       unsigned long flags;
-
-       spin_lock_irqsave(&desc->lock, flags);
-       switch (desc->depth) {
-       case 1: {
-               unsigned int status = desc->status & ~IRQ_DISABLED;
-               desc->status = status;
-               if ((status & (IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) {
-                       desc->status = status | IRQ_REPLAY;
-                       hw_resend_irq(desc->handler,irq);
-               }
-               desc->handler->enable(irq);
-               /* fall-through */
-       }
-       default:
-               desc->depth--;
-               break;
-       case 0:
-               printk("enable_irq(%u) unbalanced from %p\n", irq,
-                      __builtin_return_address(0));
-       }
-       spin_unlock_irqrestore(&desc->lock, flags);
-}
-
-/*
- * do_IRQ handles all normal device IRQ's (the special
- * SMP cross-CPU interrupts have their own specific
- * handlers).
- */
-asmlinkage unsigned int do_IRQ(int irq, struct pt_regs *regs)
-{      
-       /* 
-        * We ack quickly, we don't want the irq controller
-        * thinking we're snobs just because some other CPU has
-        * disabled global interrupts (we have already done the
-        * INT_ACK cycles, it's too late to try to pretend to the
-        * controller that we aren't taking the interrupt).
-        *
-        * 0 return value means that this irq is already being
-        * handled by some other CPU. (or is disabled)
-        */
-       int cpu = smp_processor_id();
-       irq_desc_t *desc = irq_desc + irq;
-       struct irqaction * action;
-       unsigned int status;
-#ifdef CONFIG_DEBUG_STACKOVERFLOW
-       long esp;
-
-       /* Debugging check for stack overflow: is there less than 1KB free? */
-       __asm__ __volatile__("andl %%esp,%0" : "=r" (esp) : "0" (8191));
-       if (unlikely(esp < (sizeof(struct task_struct) + 1024))) {
-               extern void show_stack(unsigned long *);
-
-               printk("do_IRQ: stack overflow: %ld\n",
-                       esp - sizeof(struct task_struct));
-               __asm__ __volatile__("movl %%esp,%0" : "=r" (esp));
-               show_stack((void *)esp);
-       }
-#endif
-
-       kstat.irqs[cpu][irq]++;
-       spin_lock(&desc->lock);
-       desc->handler->ack(irq);
-       /*
-          REPLAY is when Linux resends an IRQ that was dropped earlier
-          WAITING is used by probe to mark irqs that are being tested
-          */
-       status = desc->status & ~(IRQ_REPLAY | IRQ_WAITING);
-       status |= IRQ_PENDING; /* we _want_ to handle it */
-
-       /*
-        * If the IRQ is disabled for whatever reason, we cannot
-        * use the action we have.
-        */
-       action = NULL;
-       if (!(status & (IRQ_DISABLED | IRQ_INPROGRESS))) {
-               action = desc->action;
-               status &= ~IRQ_PENDING; /* we commit to handling */
-               status |= IRQ_INPROGRESS; /* we are handling it */
-       }
-       desc->status = status;
-
-       /*
-        * If there is no IRQ handler or it was disabled, exit early.
-          Since we set PENDING, if another processor is handling
-          a different instance of this same irq, the other processor
-          will take care of it.
-        */
-       if (!action)
-               goto out;
-
-       /*
-        * Edge triggered interrupts need to remember
-        * pending events.
-        * This applies to any hw interrupts that allow a second
-        * instance of the same irq to arrive while we are in do_IRQ
-        * or in the handler. But the code here only handles the _second_
-        * instance of the irq, not the third or fourth. So it is mostly
-        * useful for irq hardware that does not mask cleanly in an
-        * SMP environment.
-        */
-       for (;;) {
-               spin_unlock(&desc->lock);
-               handle_IRQ_event(irq, regs, action);
-               spin_lock(&desc->lock);
-               
-               if (!(desc->status & IRQ_PENDING))
-                       break;
-               desc->status &= ~IRQ_PENDING;
-       }
-       desc->status &= ~IRQ_INPROGRESS;
-out:
-       /*
-        * The ->end() handler has to deal with interrupts which got
-        * disabled while the handler was running.
-        */
-       desc->handler->end(irq);
-       spin_unlock(&desc->lock);
-
-       if (softirq_pending(cpu))
-               do_softirq();
-       return 1;
-}
-
-/**
- *     request_irq - allocate an interrupt line
- *     @irq: Interrupt line to allocate
- *     @handler: Function to be called when the IRQ occurs
- *     @irqflags: Interrupt type flags
- *     @devname: An ascii name for the claiming device
- *     @dev_id: A cookie passed back to the handler function
- *
- *     This call allocates interrupt resources and enables the
- *     interrupt line and IRQ handling. From the point this
- *     call is made your handler function may be invoked. Since
- *     your handler function must clear any interrupt the board 
- *     raises, you must take care both to initialise your hardware
- *     and to set up the interrupt handler in the right order.
- *
- *     Dev_id must be globally unique. Normally the address of the
- *     device data structure is used as the cookie. Since the handler
- *     receives this value it makes sense to use it.
- *
- *     If your interrupt is shared you must pass a non NULL dev_id
- *     as this is required when freeing the interrupt.
- *
- *     Flags:
- *
- *     SA_SHIRQ                Interrupt is shared
- *
- *     SA_INTERRUPT            Disable local interrupts while processing
- *
- *     SA_SAMPLE_RANDOM        The interrupt can be used for entropy
- *
- */
-int request_irq(unsigned int irq, 
-               void (*handler)(int, void *, struct pt_regs *),
-               unsigned long irqflags, 
-               const char * devname,
-               void *dev_id)
-{
-       int retval;
-       struct irqaction * action;
-
-#if 1
-       /*
-        * Sanity-check: shared interrupts should REALLY pass in
-        * a real dev-ID, otherwise we'll have trouble later trying
-        * to figure out which interrupt is which (messes up the
-        * interrupt freeing logic etc).
-        */
-       if (irqflags & SA_SHIRQ) {
-               if (!dev_id)
-                       printk("Bad boy: %s (at 0x%x) called us without a dev_id!\n", devname, (&irq)[-1]);
-       }
-#endif
-
-       if (irq >= NR_IRQS)
-               return -EINVAL;
-       if (!handler)
-               return -EINVAL;
-
-       action = (struct irqaction *)
-                       kmalloc(sizeof(struct irqaction), GFP_KERNEL);
-       if (!action)
-               return -ENOMEM;
-
-       action->handler = handler;
-       action->flags = irqflags;
-       action->mask = 0;
-       action->name = devname;
-       action->next = NULL;
-       action->dev_id = dev_id;
-
-       retval = setup_irq(irq, action);
-       if (retval)
-               kfree(action);
-       return retval;
-}
-
-/**
- *     free_irq - free an interrupt
- *     @irq: Interrupt line to free
- *     @dev_id: Device identity to free
- *
- *     Remove an interrupt handler. The handler is removed and if the
- *     interrupt line is no longer in use by any driver it is disabled.
- *     On a shared IRQ the caller must ensure the interrupt is disabled
- *     on the card it drives before calling this function. The function
- *     does not return until any executing interrupts for this IRQ
- *     have completed.
- *
- *     This function may be called from interrupt context. 
- *
- *     Bugs: Attempting to free an irq in a handler for the same irq hangs
- *           the machine.
- */
-void free_irq(unsigned int irq, void *dev_id)
-{
-       irq_desc_t *desc;
-       struct irqaction **p;
-       unsigned long flags;
-
-       if (irq >= NR_IRQS)
-               return;
-
-       desc = irq_desc + irq;
-       spin_lock_irqsave(&desc->lock,flags);
-       p = &desc->action;
-       for (;;) {
-               struct irqaction * action = *p;
-               if (action) {
-                       struct irqaction **pp = p;
-                       p = &action->next;
-                       if (action->dev_id != dev_id)
-                               continue;
-
-                       /* Found it - now remove it from the list of entries */
-                       *pp = action->next;
-                       if (!desc->action) {
-                               desc->status |= IRQ_DISABLED;
-                               desc->handler->shutdown(irq);
-                       }
-                       spin_unlock_irqrestore(&desc->lock,flags);
-
-#ifdef CONFIG_SMP
-                       /* Wait to make sure it's not being used on another CPU */
-                       while (desc->status & IRQ_INPROGRESS) {
-                               barrier();
-                               cpu_relax();
-                       }
-#endif
-                       kfree(action);
-                       return;
-               }
-               printk("Trying to free free IRQ%d\n",irq);
-               spin_unlock_irqrestore(&desc->lock,flags);
-               return;
-       }
-}
-
-/*
- * IRQ autodetection code..
- *
- * This depends on the fact that any interrupt that
- * comes in on to an unassigned handler will get stuck
- * with "IRQ_WAITING" cleared and the interrupt
- * disabled.
- */
-
-static DECLARE_MUTEX(probe_sem);
-
-/**
- *     probe_irq_on    - begin an interrupt autodetect
- *
- *     Commence probing for an interrupt. The interrupts are scanned
- *     and a mask of potential interrupt lines is returned.
- *
- */
-unsigned long probe_irq_on(void)
-{
-       unsigned int i;
-       irq_desc_t *desc;
-       unsigned long val;
-       unsigned long delay;
-
-       down(&probe_sem);
-       /* 
-        * something may have generated an irq long ago and we want to
-        * flush such a longstanding irq before considering it as spurious. 
-        */
-       for (i = NR_IRQS-1; i > 0; i--)  {
-               desc = irq_desc + i;
-
-               spin_lock_irq(&desc->lock);
-               if (!irq_desc[i].action) 
-                       irq_desc[i].handler->startup(i);
-               spin_unlock_irq(&desc->lock);
-       }
-
-       /* Wait for longstanding interrupts to trigger. */
-       for (delay = jiffies + HZ/50; time_after(delay, jiffies); )
-               /* about 20ms delay */ synchronize_irq();
-
-       /*
-        * enable any unassigned irqs
-        * (we must startup again here because if a longstanding irq
-        * happened in the previous stage, it may have masked itself)
-        */
-       for (i = NR_IRQS-1; i > 0; i--) {
-               desc = irq_desc + i;
-
-               spin_lock_irq(&desc->lock);
-               if (!desc->action) {
-                       desc->status |= IRQ_AUTODETECT | IRQ_WAITING;
-                       if (desc->handler->startup(i))
-                               desc->status |= IRQ_PENDING;
-               }
-               spin_unlock_irq(&desc->lock);
-       }
-
-       /*
-        * Wait for spurious interrupts to trigger
-        */
-       for (delay = jiffies + HZ/10; time_after(delay, jiffies); )
-               /* about 100ms delay */ synchronize_irq();
-
-       /*
-        * Now filter out any obviously spurious interrupts
-        */
-       val = 0;
-       for (i = 0; i < NR_IRQS; i++) {
-               irq_desc_t *desc = irq_desc + i;
-               unsigned int status;
-
-               spin_lock_irq(&desc->lock);
-               status = desc->status;
-
-               if (status & IRQ_AUTODETECT) {
-                       /* It triggered already - consider it spurious. */
-                       if (!(status & IRQ_WAITING)) {
-                               desc->status = status & ~IRQ_AUTODETECT;
-                               desc->handler->shutdown(i);
-                       } else
-                               if (i < 32)
-                                       val |= 1 << i;
-               }
-               spin_unlock_irq(&desc->lock);
-       }
-
-       return val;
-}
-
-/*
- * Return a mask of triggered interrupts (this
- * can handle only legacy ISA interrupts).
- */
-/**
- *     probe_irq_mask - scan a bitmap of interrupt lines
- *     @val:   mask of interrupts to consider
- *
- *     Scan the ISA bus interrupt lines and return a bitmap of
- *     active interrupts. The interrupt probe logic state is then
- *     returned to its previous value.
- *
- *     Note: we need to scan all the irq's even though we will
- *     only return ISA irq numbers - just so that we reset them
- *     all to a known state.
- */
-unsigned int probe_irq_mask(unsigned long val)
-{
-       int i;
-       unsigned int mask;
-
-       mask = 0;
-       for (i = 0; i < NR_IRQS; i++) {
-               irq_desc_t *desc = irq_desc + i;
-               unsigned int status;
-
-               spin_lock_irq(&desc->lock);
-               status = desc->status;
-
-               if (status & IRQ_AUTODETECT) {
-                       if (i < 16 && !(status & IRQ_WAITING))
-                               mask |= 1 << i;
-
-                       desc->status = status & ~IRQ_AUTODETECT;
-                       desc->handler->shutdown(i);
-               }
-               spin_unlock_irq(&desc->lock);
-       }
-       up(&probe_sem);
-
-       return mask & val;
-}
-
-/*
- * Return the one interrupt that triggered (this can
- * handle any interrupt source).
- */
-
-/**
- *     probe_irq_off   - end an interrupt autodetect
- *     @val: mask of potential interrupts (unused)
- *
- *     Scans the unused interrupt lines and returns the line which
- *     appears to have triggered the interrupt. If no interrupt was
- *     found then zero is returned. If more than one interrupt is
- *     found then minus the first candidate is returned to indicate
- *     their is doubt.
- *
- *     The interrupt probe logic state is returned to its previous
- *     value.
- *
- *     BUGS: When used in a module (which arguably shouldnt happen)
- *     nothing prevents two IRQ probe callers from overlapping. The
- *     results of this are non-optimal.
- */
-int probe_irq_off(unsigned long val)
-{
-       int i, irq_found, nr_irqs;
-
-       nr_irqs = 0;
-       irq_found = 0;
-       for (i = 0; i < NR_IRQS; i++) {
-               irq_desc_t *desc = irq_desc + i;
-               unsigned int status;
-
-               spin_lock_irq(&desc->lock);
-               status = desc->status;
-
-               if (status & IRQ_AUTODETECT) {
-                       if (!(status & IRQ_WAITING)) {
-                               if (!nr_irqs)
-                                       irq_found = i;
-                               nr_irqs++;
-                       }
-                       desc->status = status & ~IRQ_AUTODETECT;
-                       desc->handler->shutdown(i);
-               }
-               spin_unlock_irq(&desc->lock);
-       }
-       up(&probe_sem);
-
-       if (nr_irqs > 1)
-               irq_found = -irq_found;
-       return irq_found;
-}
-
-/* this was setup_x86_irq but it seems pretty generic */
-int setup_irq(unsigned int irq, struct irqaction * new)
-{
-       int shared = 0;
-       unsigned long flags;
-       struct irqaction *old, **p;
-       irq_desc_t *desc = irq_desc + irq;
-
-       /*
-        * Some drivers like serial.c use request_irq() heavily,
-        * so we have to be careful not to interfere with a
-        * running system.
-        */
-       if (new->flags & SA_SAMPLE_RANDOM) {
-               /*
-                * This function might sleep, we want to call it first,
-                * outside of the atomic block.
-                * Yes, this might clear the entropy pool if the wrong
-                * driver is attempted to be loaded, without actually
-                * installing a new handler, but is this really a problem,
-                * only the sysadmin is able to do this.
-                */
-               rand_initialize_irq(irq);
-       }
-
-       /*
-        * The following block of code has to be executed atomically
-        */
-       spin_lock_irqsave(&desc->lock,flags);
-       p = &desc->action;
-       if ((old = *p) != NULL) {
-               /* Can't share interrupts unless both agree to */
-               if (!(old->flags & new->flags & SA_SHIRQ)) {
-                       spin_unlock_irqrestore(&desc->lock,flags);
-                       return -EBUSY;
-               }
-
-               /* add new interrupt at end of irq queue */
-               do {
-                       p = &old->next;
-                       old = *p;
-               } while (old);
-               shared = 1;
-       }
-
-       *p = new;
-
-       if (!shared) {
-               desc->depth = 0;
-               desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | IRQ_WAITING);
-               desc->handler->startup(irq);
-       }
-       spin_unlock_irqrestore(&desc->lock,flags);
-
-       register_irq_proc(irq);
-       return 0;
-}
-
-static struct proc_dir_entry * root_irq_dir;
-static struct proc_dir_entry * irq_dir [NR_IRQS];
-
-#define HEX_DIGITS 8
-
-static unsigned int parse_hex_value (const char *buffer,
-               unsigned long count, unsigned long *ret)
-{
-       unsigned char hexnum [HEX_DIGITS];
-       unsigned long value;
-       int i;
-
-       if (!count)
-               return -EINVAL;
-       if (count > HEX_DIGITS)
-               count = HEX_DIGITS;
-       if (copy_from_user(hexnum, buffer, count))
-               return -EFAULT;
-
-       /*
-        * Parse the first 8 characters as a hex string, any non-hex char
-        * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
-        */
-       value = 0;
-
-       for (i = 0; i < count; i++) {
-               unsigned int c = hexnum[i];
-
-               switch (c) {
-                       case '0' ... '9': c -= '0'; break;
-                       case 'a' ... 'f': c -= 'a'-10; break;
-                       case 'A' ... 'F': c -= 'A'-10; break;
-               default:
-                       goto out;
-               }
-               value = (value << 4) | c;
-       }
-out:
-       *ret = value;
-       return 0;
-}
-
-#if CONFIG_SMP
-
-static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
-
-static unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = ~0UL };
-static int irq_affinity_read_proc (char *page, char **start, off_t off,
-                       int count, int *eof, void *data)
-{
-       if (count < HEX_DIGITS+1)
-               return -EINVAL;
-       return sprintf (page, "%08lx\n", irq_affinity[(long)data]);
-}
-
-static int irq_affinity_write_proc (struct file *file, const char *buffer,
-                                       unsigned long count, void *data)
-{
-       int irq = (long) data, full_count = count, err;
-       unsigned long new_value;
-
-       if (!irq_desc[irq].handler->set_affinity)
-               return -EIO;
-
-       err = parse_hex_value(buffer, count, &new_value);
-
-       /*
-        * Do not allow disabling IRQs completely - it's a too easy
-        * way to make the system unusable accidentally :-) At least
-        * one online CPU still has to be targeted.
-        */
-       if (!(new_value & cpu_online_map))
-               return -EINVAL;
-
-       irq_affinity[irq] = new_value;
-       irq_desc[irq].handler->set_affinity(irq, new_value);
-
-       return full_count;
-}
-
-#endif
-
-static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
-                       int count, int *eof, void *data)
-{
-       unsigned long *mask = (unsigned long *) data;
-       if (count < HEX_DIGITS+1)
-               return -EINVAL;
-       return sprintf (page, "%08lx\n", *mask);
-}
-
-static int prof_cpu_mask_write_proc (struct file *file, const char *buffer,
-                                       unsigned long count, void *data)
-{
-       unsigned long *mask = (unsigned long *) data, full_count = count, err;
-       unsigned long new_value;
-
-       err = parse_hex_value(buffer, count, &new_value);
-       if (err)
-               return err;
-
-       *mask = new_value;
-       return full_count;
-}
-
-#define MAX_NAMELEN 10
-
-static void register_irq_proc (unsigned int irq)
-{
-       char name [MAX_NAMELEN];
-
-       if (!root_irq_dir || (irq_desc[irq].handler == &no_irq_type) ||
-                       irq_dir[irq])
-               return;
-
-       memset(name, 0, MAX_NAMELEN);
-       sprintf(name, "%d", irq);
-
-       /* create /proc/irq/1234 */
-       irq_dir[irq] = proc_mkdir(name, root_irq_dir);
-
-#if CONFIG_SMP
-       {
-               struct proc_dir_entry *entry;
-
-               /* create /proc/irq/1234/smp_affinity */
-               entry = create_proc_entry("smp_affinity", 0600, irq_dir[irq]);
-
-               if (entry) {
-                       entry->nlink = 1;
-                       entry->data = (void *)(long)irq;
-                       entry->read_proc = irq_affinity_read_proc;
-                       entry->write_proc = irq_affinity_write_proc;
-               }
-
-               smp_affinity_entry[irq] = entry;
-       }
-#endif
-}
-
-unsigned long prof_cpu_mask = -1;
-
-void init_irq_proc (void)
-{
-       struct proc_dir_entry *entry;
-       int i;
-
-       /* create /proc/irq */
-       root_irq_dir = proc_mkdir("irq", 0);
-
-       /* create /proc/irq/prof_cpu_mask */
-       entry = create_proc_entry("prof_cpu_mask", 0600, root_irq_dir);
-
-       if (!entry)
-           return;
-
-       entry->nlink = 1;
-       entry->data = (void *)&prof_cpu_mask;
-       entry->read_proc = prof_cpu_mask_read_proc;
-       entry->write_proc = prof_cpu_mask_write_proc;
-
-       /*
-        * Create entries for all existing IRQs.
-        */
-       for (i = 0; i < NR_IRQS; i++)
-               register_irq_proc(i);
-}
-
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/kernel/ldt.c b/xenolinux-2.4.21-sparse/arch/xeno/kernel/ldt.c
deleted file mode 100644 (file)
index ca89b69..0000000
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * linux/kernel/ldt.c
- *
- * Copyright (C) 1992 Krishna Balasubramanian and Linus Torvalds
- * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
- */
-
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/vmalloc.h>
-
-#include <asm/uaccess.h>
-#include <asm/system.h>
-#include <asm/ldt.h>
-#include <asm/desc.h>
-
-/*
- * read_ldt() is not really atomic - this is not a problem since
- * synchronization of reads and writes done to the LDT has to be
- * assured by user-space anyway. Writes are atomic, to protect
- * the security checks done on new descriptors.
- */
-static int read_ldt(void * ptr, unsigned long bytecount)
-{
-    int err;
-    unsigned long size;
-    struct mm_struct * mm = current->mm;
-
-    err = 0;
-    if (!mm->context.segments)
-        goto out;
-
-    size = LDT_ENTRIES*LDT_ENTRY_SIZE;
-    if (size > bytecount)
-        size = bytecount;
-
-    err = size;
-    if (copy_to_user(ptr, mm->context.segments, size))
-        err = -EFAULT;
- out:
-    return err;
-}
-
-static int read_default_ldt(void * ptr, unsigned long bytecount)
-{
-    int err;
-    unsigned long size;
-    void *address;
-
-    err = 0;
-    address = &default_ldt[0];
-    size = sizeof(struct desc_struct);
-    if (size > bytecount)
-        size = bytecount;
-
-    err = size;
-    if (copy_to_user(ptr, address, size))
-        err = -EFAULT;
-
-    return err;
-}
-
-static int write_ldt(void * ptr, unsigned long bytecount, int oldmode)
-{
-    struct mm_struct * mm = current->mm;
-    __u32 entry_1, entry_2, *lp;
-    unsigned long phys_lp;
-    int error;
-    struct modify_ldt_ldt_s ldt_info;
-
-    error = -EINVAL;
-    if (bytecount != sizeof(ldt_info))
-        goto out;
-    error = -EFAULT;   
-    if (copy_from_user(&ldt_info, ptr, sizeof(ldt_info)))
-        goto out;
-
-    error = -EINVAL;
-    if (ldt_info.entry_number >= LDT_ENTRIES)
-        goto out;
-    if (ldt_info.contents == 3) {
-        if (oldmode)
-            goto out;
-        if (ldt_info.seg_not_present == 0)
-            goto out;
-    }
-
-    down_write(&mm->mmap_sem);
-    if (!mm->context.segments) {
-        void * segments = vmalloc(LDT_ENTRIES*LDT_ENTRY_SIZE);
-        error = -ENOMEM;
-        if (!segments)
-            goto out_unlock;
-        memset(segments, 0, LDT_ENTRIES*LDT_ENTRY_SIZE);
-        make_pages_readonly(segments, (LDT_ENTRIES*LDT_ENTRY_SIZE)/PAGE_SIZE);
-        wmb();
-        mm->context.segments = segments;
-        mm->context.cpuvalid = 1UL << smp_processor_id();
-        load_LDT(mm);
-        flush_page_update_queue();
-    }
-
-    lp = (__u32 *)((ldt_info.entry_number<<3) + (char *)mm->context.segments);
-    phys_lp = arbitrary_virt_to_phys(lp);
-
-    /* Allow LDTs to be cleared by the user. */
-    if (ldt_info.base_addr == 0 && ldt_info.limit == 0) {
-        if (oldmode ||
-            (ldt_info.contents == 0            &&
-             ldt_info.read_exec_only == 1      &&
-             ldt_info.seg_32bit == 0           &&
-             ldt_info.limit_in_pages == 0      &&
-             ldt_info.seg_not_present == 1     &&
-             ldt_info.useable == 0 )) {
-            entry_1 = 0;
-            entry_2 = 0;
-            goto install;
-        }
-    }
-
-    entry_1 = ((ldt_info.base_addr & 0x0000ffff) << 16) |
-        (ldt_info.limit & 0x0ffff);
-    entry_2 = (ldt_info.base_addr & 0xff000000) |
-        ((ldt_info.base_addr & 0x00ff0000) >> 16) |
-        (ldt_info.limit & 0xf0000) |
-        ((ldt_info.read_exec_only ^ 1) << 9) |
-        (ldt_info.contents << 10) |
-        ((ldt_info.seg_not_present ^ 1) << 15) |
-        (ldt_info.seg_32bit << 22) |
-        (ldt_info.limit_in_pages << 23) |
-        0x7000;
-    if (!oldmode)
-        entry_2 |= (ldt_info.useable << 20);
-
-    /* Install the new entry ...  */
- install:
-    HYPERVISOR_update_descriptor(phys_lp, entry_1, entry_2);
-    error = 0;
-
- out_unlock:
-    up_write(&mm->mmap_sem);
- out:
-    return error;
-}
-
-asmlinkage int sys_modify_ldt(int func, void *ptr, unsigned long bytecount)
-{
-    int ret = -ENOSYS;
-
-    switch (func) {
-    case 0:
-        ret = read_ldt(ptr, bytecount);
-        break;
-    case 1:
-        ret = write_ldt(ptr, bytecount, 1);
-        break;
-    case 2:
-        ret = read_default_ldt(ptr, bytecount);
-        break;
-    case 0x11:
-        ret = write_ldt(ptr, bytecount, 0);
-        break;
-    }
-    return ret;
-}
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/kernel/process.c b/xenolinux-2.4.21-sparse/arch/xeno/kernel/process.c
deleted file mode 100644 (file)
index 3b17c73..0000000
+++ /dev/null
@@ -1,489 +0,0 @@
-/*
- *  linux/arch/i386/kernel/process.c
- *
- *  Copyright (C) 1995  Linus Torvalds
- *
- *  Pentium III FXSR, SSE support
- *     Gareth Hughes <gareth@valinux.com>, May 2000
- */
-
-/*
- * This file handles the architecture-dependent parts of process handling..
- */
-
-#define __KERNEL_SYSCALLS__
-#include <stdarg.h>
-
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/stddef.h>
-#include <linux/unistd.h>
-#include <linux/ptrace.h>
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
-#include <linux/user.h>
-#include <linux/a.out.h>
-#include <linux/interrupt.h>
-#include <linux/config.h>
-#include <linux/delay.h>
-#include <linux/reboot.h>
-#include <linux/init.h>
-#include <linux/mc146818rtc.h>
-
-#include <asm/uaccess.h>
-#include <asm/pgtable.h>
-#include <asm/system.h>
-#include <asm/io.h>
-#include <asm/ldt.h>
-#include <asm/processor.h>
-#include <asm/i387.h>
-#include <asm/desc.h>
-#include <asm/mmu_context.h>
-#include <asm/multicall.h>
-#include <asm/hypervisor-ifs/dom0_ops.h>
-
-#include <linux/irq.h>
-
-asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");
-
-int hlt_counter;
-
-/*
- * Powermanagement idle function, if any..
- */
-void (*pm_idle)(void);
-
-/*
- * Power off function, if any
- */
-void (*pm_power_off)(void);
-
-void disable_hlt(void)
-{
-    hlt_counter++;
-}
-
-void enable_hlt(void)
-{
-    hlt_counter--;
-}
-
-/*
- * The idle thread. There's no useful work to be
- * done, so just try to conserve power and have a
- * low exit latency (ie sit in a loop waiting for
- * somebody to say that they'd like to reschedule)
- */
-void cpu_idle (void)
-{
-    /* endless idle loop with no priority at all */
-    init_idle();
-    current->nice = 20;
-    current->counter = -100;
-
-    while (1) {
-        while (!current->need_resched)
-            HYPERVISOR_yield();
-        schedule();
-        check_pgt_cache();
-    }
-}
-
-void machine_restart(char * __unused)
-{
-    HYPERVISOR_exit();
-}
-
-void machine_halt(void)
-{
-    HYPERVISOR_exit();
-}
-
-void machine_power_off(void)
-{
-    HYPERVISOR_exit();
-}
-
-extern void show_trace(unsigned long* esp);
-
-void show_regs(struct pt_regs * regs)
-{
-    printk("\n");
-    printk("Pid: %d, comm: %20s\n", current->pid, current->comm);
-    printk("EIP: %04x:[<%08lx>] CPU: %d",0xffff & regs->xcs,regs->eip, smp_processor_id());
-    if (regs->xcs & 2)
-        printk(" ESP: %04x:%08lx",0xffff & regs->xss,regs->esp);
-    printk(" EFLAGS: %08lx    %s\n",regs->eflags, print_tainted());
-    printk("EAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\n",
-           regs->eax,regs->ebx,regs->ecx,regs->edx);
-    printk("ESI: %08lx EDI: %08lx EBP: %08lx",
-           regs->esi, regs->edi, regs->ebp);
-    printk(" DS: %04x ES: %04x\n",
-           0xffff & regs->xds,0xffff & regs->xes);
-
-    show_trace(&regs->esp);
-}
-
-/*
- * No need to lock the MM as we are the last user
- */
-void release_segments(struct mm_struct *mm)
-{
-    void * ldt = mm->context.segments;
-
-    /*
-     * free the LDT
-     */
-    if (ldt) {
-        mm->context.segments = NULL;
-        clear_LDT();
-        make_pages_writeable(ldt, (LDT_ENTRIES*LDT_ENTRY_SIZE)/PAGE_SIZE);
-        flush_page_update_queue();
-        vfree(ldt);
-    }
-}
-
-/*
- * Create a kernel thread
- */
-int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
-{
-    long retval, d0;
-
-    __asm__ __volatile__(
-        "movl %%esp,%%esi\n\t"
-        "int $0x80\n\t"                /* Linux/i386 system call */
-        "cmpl %%esp,%%esi\n\t" /* child or parent? */
-        "je 1f\n\t"            /* parent - jump */
-        /* Load the argument into eax, and push it.  That way, it does
-         * not matter whether the called function is compiled with
-         * -mregparm or not.  */
-        "movl %4,%%eax\n\t"
-        "pushl %%eax\n\t"              
-        "call *%5\n\t"         /* call fn */
-        "movl %3,%0\n\t"       /* exit */
-        "int $0x80\n"
-        "1:\t"
-        :"=&a" (retval), "=&S" (d0)
-        :"0" (__NR_clone), "i" (__NR_exit),
-        "r" (arg), "r" (fn),
-        "b" (flags | CLONE_VM)
-        : "memory");
-
-    return retval;
-}
-
-/*
- * Free current thread data structures etc..
- */
-void exit_thread(void)
-{
-    /* nothing to do ... */
-}
-
-void flush_thread(void)
-{
-    struct task_struct *tsk = current;
-
-    memset(tsk->thread.debugreg, 0, sizeof(unsigned long)*8);
-
-    /*
-     * Forget coprocessor state..
-     */
-    clear_fpu(tsk);
-    tsk->used_math = 0;
-}
-
-void release_thread(struct task_struct *dead_task)
-{
-    if (dead_task->mm) {
-        void * ldt = dead_task->mm->context.segments;
-
-        // temporary debugging check
-        if (ldt) {
-            printk("WARNING: dead process %8s still has LDT? <%p>\n",
-                   dead_task->comm, ldt);
-            BUG();
-        }
-    }
-}
-
-/*
- * we do not have to muck with descriptors here, that is
- * done in switch_mm() as needed.
- */
-void copy_segments(struct task_struct *p, struct mm_struct *new_mm)
-{
-    struct mm_struct * old_mm;
-    void *old_ldt, *ldt;
-
-    ldt = NULL;
-    old_mm = current->mm;
-    if (old_mm && (old_ldt = old_mm->context.segments) != NULL) {
-        /*
-         * Completely new LDT, we initialize it from the parent:
-         */
-        ldt = vmalloc(LDT_ENTRIES*LDT_ENTRY_SIZE);
-        if ( ldt == NULL )
-        {
-            printk(KERN_WARNING "ldt allocation failed\n");
-        }
-        else
-        {
-            memcpy(ldt, old_ldt, LDT_ENTRIES*LDT_ENTRY_SIZE);
-            make_pages_readonly(ldt, (LDT_ENTRIES*LDT_ENTRY_SIZE)/PAGE_SIZE);
-        }
-    }
-    new_mm->context.segments = ldt;
-    new_mm->context.cpuvalid = ~0UL;   /* valid on all CPU's - they can't have stale data */
-}
-
-/*
- * Save a segment.
- */
-#define savesegment(seg,value) \
-       asm volatile("movl %%" #seg ",%0":"=m" (*(int *)&(value)))
-
-int copy_thread(int nr, unsigned long clone_flags, unsigned long esp,
-                unsigned long unused,
-                struct task_struct * p, struct pt_regs * regs)
-{
-    struct pt_regs * childregs;
-    unsigned long eflags;
-
-    childregs = ((struct pt_regs *) (THREAD_SIZE + (unsigned long) p)) - 1;
-    struct_cpy(childregs, regs);
-    childregs->eax = 0;
-    childregs->esp = esp;
-
-    p->thread.esp = (unsigned long) childregs;
-    p->thread.esp0 = (unsigned long) (childregs+1);
-
-    p->thread.eip = (unsigned long) ret_from_fork;
-
-    savesegment(fs,p->thread.fs);
-    savesegment(gs,p->thread.gs);
-
-    unlazy_fpu(current);
-    struct_cpy(&p->thread.i387, &current->thread.i387);
-
-
-    __asm__ __volatile__ ( "pushfl; popl %0" : "=r" (eflags) : );
-    p->thread.io_pl = (eflags >> 12) & 3;
-
-    return 0;
-}
-
-/*
- * fill in the user structure for a core dump..
- */
-void dump_thread(struct pt_regs * regs, struct user * dump)
-{
-    int i;
-
-/* changed the size calculations - should hopefully work better. lbt */
-    dump->magic = CMAGIC;
-    dump->start_code = 0;
-    dump->start_stack = regs->esp & ~(PAGE_SIZE - 1);
-    dump->u_tsize = ((unsigned long) current->mm->end_code) >> PAGE_SHIFT;
-    dump->u_dsize = ((unsigned long) (current->mm->brk + (PAGE_SIZE-1))) >> PAGE_SHIFT;
-    dump->u_dsize -= dump->u_tsize;
-    dump->u_ssize = 0;
-    for (i = 0; i < 8; i++)
-        dump->u_debugreg[i] = current->thread.debugreg[i];  
-
-    if (dump->start_stack < TASK_SIZE)
-        dump->u_ssize = ((unsigned long) (TASK_SIZE - dump->start_stack)) >> PAGE_SHIFT;
-
-    dump->regs.ebx = regs->ebx;
-    dump->regs.ecx = regs->ecx;
-    dump->regs.edx = regs->edx;
-    dump->regs.esi = regs->esi;
-    dump->regs.edi = regs->edi;
-    dump->regs.ebp = regs->ebp;
-    dump->regs.eax = regs->eax;
-    dump->regs.ds = regs->xds;
-    dump->regs.es = regs->xes;
-    savesegment(fs,dump->regs.fs);
-    savesegment(gs,dump->regs.gs);
-    dump->regs.orig_eax = regs->orig_eax;
-    dump->regs.eip = regs->eip;
-    dump->regs.cs = regs->xcs;
-    dump->regs.eflags = regs->eflags;
-    dump->regs.esp = regs->esp;
-    dump->regs.ss = regs->xss;
-
-    dump->u_fpvalid = dump_fpu (regs, &dump->i387);
-}
-
-/*
- *     switch_to(x,yn) should switch tasks from x to y.
- *
- * We fsave/fwait so that an exception goes off at the right time
- * (as a call from the fsave or fwait in effect) rather than to
- * the wrong process. Lazy FP saving no longer makes any sense
- * with modern CPU's, and this simplifies a lot of things (SMP
- * and UP become the same).
- *
- * NOTE! We used to use the x86 hardware context switching. The
- * reason for not using it any more becomes apparent when you
- * try to recover gracefully from saved state that is no longer
- * valid (stale segment register values in particular). With the
- * hardware task-switch, there is no way to fix up bad state in
- * a reasonable manner.
- *
- * The fact that Intel documents the hardware task-switching to
- * be slow is a fairly red herring - this code is not noticeably
- * faster. However, there _is_ some room for improvement here,
- * so the performance issues may eventually be a valid point.
- * More important, however, is the fact that this allows us much
- * more flexibility.
- */
-void __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
-{
-    struct thread_struct *next = &next_p->thread;
-
-    __cli();
-
-    MULTICALL_flush_page_update_queue();
-
-    /*
-     * This is basically 'unlazy_fpu', except that we queue a multicall to 
-     * indicate FPU task switch, rather than synchronously trapping to Xen.
-     */
-    if ( prev_p->flags & PF_USEDFPU )
-    {
-       if ( cpu_has_fxsr )
-            asm volatile( "fxsave %0 ; fnclex"
-                          : "=m" (prev_p->thread.i387.fxsave) );
-       else
-            asm volatile( "fnsave %0 ; fwait"
-                          : "=m" (prev_p->thread.i387.fsave) );
-       prev_p->flags &= ~PF_USEDFPU;
-        queue_multicall0(__HYPERVISOR_fpu_taskswitch);
-    }
-
-    queue_multicall2(__HYPERVISOR_stack_switch, __KERNEL_DS, next->esp0);
-    if ( start_info.flags & SIF_PRIVILEGED ) 
-    {
-        dom0_op_t op;
-        op.cmd           = DOM0_IOPL;
-        op.u.iopl.domain = start_info.dom_id;
-        op.u.iopl.iopl   = next->io_pl;
-        queue_multicall1(__HYPERVISOR_dom0_op, (unsigned long)&op);
-    }
-
-    /* EXECUTE ALL TASK SWITCH XEN SYSCALLS AT THIS POINT. */
-    execute_multicall_list();
-    __sti();
-
-    /*
-     * Restore %fs and %gs.
-     */
-    loadsegment(fs, next->fs);
-    loadsegment(gs, next->gs);
-
-    /*
-     * Now maybe reload the debug registers
-     */
-    if ( next->debugreg[7] != 0 )
-    {
-        HYPERVISOR_set_debugreg(0, next->debugreg[0]);
-        HYPERVISOR_set_debugreg(1, next->debugreg[1]);
-        HYPERVISOR_set_debugreg(2, next->debugreg[2]);
-        HYPERVISOR_set_debugreg(3, next->debugreg[3]);
-        /* no 4 and 5 */
-        HYPERVISOR_set_debugreg(6, next->debugreg[6]);
-        HYPERVISOR_set_debugreg(7, next->debugreg[7]);
-    }
-}
-
-asmlinkage int sys_fork(struct pt_regs regs)
-{
-    return do_fork(SIGCHLD, regs.esp, &regs, 0);
-}
-
-asmlinkage int sys_clone(struct pt_regs regs)
-{
-    unsigned long clone_flags;
-    unsigned long newsp;
-
-    clone_flags = regs.ebx;
-    newsp = regs.ecx;
-    if (!newsp)
-        newsp = regs.esp;
-    return do_fork(clone_flags, newsp, &regs, 0);
-}
-
-/*
- * This is trivial, and on the face of it looks like it
- * could equally well be done in user mode.
- *
- * Not so, for quite unobvious reasons - register pressure.
- * In user mode vfork() cannot have a stack frame, and if
- * done by calling the "clone()" system call directly, you
- * do not have enough call-clobbered registers to hold all
- * the information you need.
- */
-asmlinkage int sys_vfork(struct pt_regs regs)
-{
-    return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs.esp, &regs, 0);
-}
-
-/*
- * sys_execve() executes a new program.
- */
-asmlinkage int sys_execve(struct pt_regs regs)
-{
-    int error;
-    char * filename;
-
-    filename = getname((char *) regs.ebx);
-    error = PTR_ERR(filename);
-    if (IS_ERR(filename))
-        goto out;
-    error = do_execve(filename, (char **) regs.ecx, (char **) regs.edx, &regs);
-    if (error == 0)
-        current->ptrace &= ~PT_DTRACE;
-    putname(filename);
- out:
-    return error;
-}
-
-/*
- * These bracket the sleeping functions..
- */
-extern void scheduling_functions_start_here(void);
-extern void scheduling_functions_end_here(void);
-#define first_sched    ((unsigned long) scheduling_functions_start_here)
-#define last_sched     ((unsigned long) scheduling_functions_end_here)
-
-unsigned long get_wchan(struct task_struct *p)
-{
-    unsigned long ebp, esp, eip;
-    unsigned long stack_page;
-    int count = 0;
-    if (!p || p == current || p->state == TASK_RUNNING)
-        return 0;
-    stack_page = (unsigned long)p;
-    esp = p->thread.esp;
-    if (!stack_page || esp < stack_page || esp > 8188+stack_page)
-        return 0;
-    /* include/asm-i386/system.h:switch_to() pushes ebp last. */
-    ebp = *(unsigned long *) esp;
-    do {
-        if (ebp < stack_page || ebp > 8184+stack_page)
-            return 0;
-        eip = *(unsigned long *) (ebp+4);
-        if (eip < first_sched || eip >= last_sched)
-            return eip;
-        ebp = *(unsigned long *) ebp;
-    } while (count++ < 16);
-    return 0;
-}
-#undef last_sched
-#undef first_sched
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/kernel/setup.c b/xenolinux-2.4.21-sparse/arch/xeno/kernel/setup.c
deleted file mode 100644 (file)
index 1fe9459..0000000
+++ /dev/null
@@ -1,1044 +0,0 @@
-/*
- *  linux/arch/i386/kernel/setup.c
- *
- *  Copyright (C) 1995  Linus Torvalds
- */
-
-/*
- * This file handles the architecture-dependent parts of initialization
- */
-
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/stddef.h>
-#include <linux/unistd.h>
-#include <linux/ptrace.h>
-#include <linux/slab.h>
-#include <linux/user.h>
-#include <linux/a.out.h>
-#include <linux/tty.h>
-#include <linux/ioport.h>
-#include <linux/delay.h>
-#include <linux/config.h>
-#include <linux/init.h>
-#include <linux/apm_bios.h>
-#ifdef CONFIG_BLK_DEV_RAM
-#include <linux/blk.h>
-#endif
-#include <linux/highmem.h>
-#include <linux/bootmem.h>
-#include <linux/seq_file.h>
-#include <asm/processor.h>
-#include <linux/console.h>
-#include <asm/mtrr.h>
-#include <asm/uaccess.h>
-#include <asm/system.h>
-#include <asm/io.h>
-#include <asm/smp.h>
-#include <asm/msr.h>
-#include <asm/desc.h>
-#include <asm/dma.h>
-#include <asm/mpspec.h>
-#include <asm/mmu_context.h>
-#include <asm/hypervisor.h>
-#include <asm/hypervisor-ifs/dom0_ops.h>
-
-shared_info_t *HYPERVISOR_shared_info;
-
-unsigned long *phys_to_machine_mapping;
-
-/*
- * Machine setup..
- */
-
-char ignore_irq13;             /* set if exception 16 works */
-struct cpuinfo_x86 boot_cpu_data = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
-
-unsigned long mmu_cr4_features;
-
-unsigned char * vgacon_mmap;
-
-/*
- * Bus types ..
- */
-#ifdef CONFIG_EISA
-int EISA_bus;
-#endif
-int MCA_bus;
-
-/* for MCA, but anyone else can use it if they want */
-unsigned int machine_id;
-unsigned int machine_submodel_id;
-unsigned int BIOS_revision;
-unsigned int mca_pentium_flag;
-
-/* For PCI or other memory-mapped resources */
-unsigned long pci_mem_start = 0x10000000;
-
-/*
- * Setup options
- */
-struct drive_info_struct { char dummy[32]; } drive_info;
-struct screen_info screen_info;
-struct apm_info apm_info;
-struct sys_desc_table_struct {
-    unsigned short length;
-    unsigned char table[0];
-};
-
-unsigned char aux_device_present;
-
-extern int root_mountflags;
-extern char _text, _etext, _edata, _end;
-
-int enable_acpi_smp_table;
-
-/* Raw start-of-day parameters from the hypervisor. */
-union start_info_union start_info_union;
-
-#define COMMAND_LINE_SIZE 256
-static char command_line[COMMAND_LINE_SIZE];
-char saved_command_line[COMMAND_LINE_SIZE];
-
-static void __init parse_mem_cmdline (char ** cmdline_p)
-{
-    char c = ' ', *to = command_line, *from = saved_command_line;
-    int len = 0;
-
-    /* Save unparsed command line copy for /proc/cmdline */
-    memcpy(saved_command_line, start_info.cmd_line, COMMAND_LINE_SIZE);
-    saved_command_line[COMMAND_LINE_SIZE-1] = '\0';
-
-    for (;;) {
-        /*
-         * "mem=nopentium" disables the 4MB page tables.
-         * "mem=XXX[kKmM]" defines a memory region from HIGH_MEM
-         * to <mem>, overriding the bios size.
-         * "mem=XXX[KkmM]@XXX[KkmM]" defines a memory region from
-         * <start> to <start>+<mem>, overriding the bios size.
-         */
-        if (c == ' ' && !memcmp(from, "mem=", 4)) {
-            if (to != command_line)
-                to--;
-            if (!memcmp(from+4, "nopentium", 9)) {
-                from += 9+4;
-            } else if (!memcmp(from+4, "exactmap", 8)) {
-                from += 8+4;
-            } else {
-                (void)memparse(from+4, &from);
-                if (*from == '@')
-                    (void)memparse(from+1, &from);
-            }
-        }
-
-        c = *(from++);
-        if (!c)
-            break;
-        if (COMMAND_LINE_SIZE <= ++len)
-            break;
-        *(to++) = c;
-    }
-    *to = '\0';
-    *cmdline_p = command_line;
-}
-
-void __init setup_arch(char **cmdline_p)
-{
-    unsigned long start_pfn, max_pfn, max_low_pfn;
-    unsigned long bootmap_size;
-    unsigned long i;
-
-    extern void hypervisor_callback(void);
-    extern void failsafe_callback(void);
-
-    extern unsigned long cpu0_pte_quicklist[];
-    extern unsigned long cpu0_pgd_quicklist[];
-
-    HYPERVISOR_set_callbacks(
-        __KERNEL_CS, (unsigned long)hypervisor_callback,
-        __KERNEL_CS, (unsigned long)failsafe_callback);
-
-    boot_cpu_data.pgd_quick = cpu0_pgd_quicklist;
-    boot_cpu_data.pte_quick = cpu0_pte_quicklist;
-
-    ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
-    memset(&drive_info, 0, sizeof(drive_info));
-    memset(&screen_info, 0, sizeof(screen_info));
-    
-    /* This is drawn from a dump from vgacon:startup in standard Linux. */
-    screen_info.orig_video_mode = 3; 
-    screen_info.orig_video_isVGA = 1;
-    screen_info.orig_video_lines = 25;
-    screen_info.orig_video_cols = 80;
-    screen_info.orig_video_ega_bx = 3;
-    screen_info.orig_video_points = 16;
-
-    memset(&apm_info.bios, 0, sizeof(apm_info.bios));
-    aux_device_present = 0; 
-#ifdef CONFIG_BLK_DEV_RAM
-    rd_image_start = 0;
-    rd_prompt = 0;
-    rd_doload = 0;
-#endif
-
-    root_mountflags &= ~MS_RDONLY;
-    init_mm.start_code = (unsigned long) &_text;
-    init_mm.end_code = (unsigned long) &_etext;
-    init_mm.end_data = (unsigned long) &_edata;
-    init_mm.brk = (unsigned long) &_end;
-
-    parse_mem_cmdline(cmdline_p);
-
-#define PFN_UP(x)      (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
-#define PFN_DOWN(x)    ((x) >> PAGE_SHIFT)
-#define PFN_PHYS(x)    ((x) << PAGE_SHIFT)
-
-/*
- * 128MB for vmalloc and initrd
- */
-#define VMALLOC_RESERVE        (unsigned long)(128 << 20)
-#define MAXMEM         (unsigned long)(HYPERVISOR_VIRT_START-PAGE_OFFSET-VMALLOC_RESERVE)
-#define MAXMEM_PFN     PFN_DOWN(MAXMEM)
-#define MAX_NONPAE_PFN (1 << 20)
-
-    /*
-     * partially used pages are not usable - thus
-     * we are rounding upwards:
-     */
-#ifdef CONFIG_BLK_DEV_INITRD
-    if ( start_info.mod_start )
-        start_pfn = PFN_UP(__pa(start_info.mod_start + start_info.mod_len));
-    else
-#endif
-    start_pfn = PFN_UP(__pa(&_end));
-    max_pfn = start_info.nr_pages;
-
-    /*
-     * Determine low and high memory ranges:
-     */
-    max_low_pfn = max_pfn;
-    if (max_low_pfn > MAXMEM_PFN) {
-        max_low_pfn = MAXMEM_PFN;
-#ifndef CONFIG_HIGHMEM
-        /* Maximum memory usable is what is directly addressable */
-        printk(KERN_WARNING "Warning only %ldMB will be used.\n",
-               MAXMEM>>20);
-        if (max_pfn > MAX_NONPAE_PFN)
-            printk(KERN_WARNING "Use a PAE enabled kernel.\n");
-        else
-            printk(KERN_WARNING "Use a HIGHMEM enabled kernel.\n");
-#else /* !CONFIG_HIGHMEM */
-#ifndef CONFIG_X86_PAE
-        if (max_pfn > MAX_NONPAE_PFN) {
-            max_pfn = MAX_NONPAE_PFN;
-            printk(KERN_WARNING "Warning only 4GB will be used.\n");
-            printk(KERN_WARNING "Use a PAE enabled kernel.\n");
-        }
-#endif /* !CONFIG_X86_PAE */
-#endif /* !CONFIG_HIGHMEM */
-    }
-
-#ifdef CONFIG_HIGHMEM
-    highstart_pfn = highend_pfn = max_pfn;
-    if (max_pfn > MAXMEM_PFN) {
-        highstart_pfn = MAXMEM_PFN;
-        printk(KERN_NOTICE "%ldMB HIGHMEM available.\n",
-               pages_to_mb(highend_pfn - highstart_pfn));
-    }
-#endif
-
-    /*
-     * Initialize the boot-time allocator, and free up all RAM.
-     * Then reserve space for OS image, and the bootmem bitmap.
-     */
-    bootmap_size = init_bootmem(start_pfn, max_low_pfn);
-    free_bootmem(0, PFN_PHYS(max_low_pfn));
-    reserve_bootmem(0, PFN_PHYS(start_pfn) + bootmap_size + PAGE_SIZE-1);
-
-    /* Now reserve space for the hypervisor-provided page tables. */
-    {
-        unsigned long *pgd = (unsigned long *)start_info.pt_base;
-        unsigned long  pte;
-        int i;
-        reserve_bootmem(__pa(pgd), PAGE_SIZE);
-        for ( i = 0; i < (HYPERVISOR_VIRT_START>>22); i++ )
-        {
-            unsigned long pgde = *pgd++;
-            if ( !(pgde & 1) ) continue;
-            pte = machine_to_phys(pgde & PAGE_MASK);
-            reserve_bootmem(pte, PAGE_SIZE);
-        }
-    }
-    cur_pgd = init_mm.pgd = (pgd_t *)start_info.pt_base;
-
-    /* Now initialise the physical->machine mapping table. */
-    phys_to_machine_mapping = alloc_bootmem(max_pfn * sizeof(unsigned long));
-    for ( i = 0; i < max_pfn; i++ )
-    {
-        unsigned long pgde, *ppte;
-        unsigned long pfn = i + (PAGE_OFFSET >> PAGE_SHIFT);
-        pgde = *((unsigned long *)start_info.pt_base + (pfn >> 10));
-        ppte = (unsigned long *)machine_to_phys(pgde & PAGE_MASK) + (pfn&1023);
-        phys_to_machine_mapping[i] = 
-            (*(unsigned long *)__va(ppte)) >> PAGE_SHIFT;
-    }
-
-#ifdef CONFIG_BLK_DEV_INITRD
-    if (start_info.mod_start) {
-        if ((__pa(start_info.mod_start) + start_info.mod_len) <= 
-            (max_low_pfn << PAGE_SHIFT)) {
-            initrd_start = start_info.mod_start;
-            initrd_end   = initrd_start + start_info.mod_len;
-            initrd_below_start_ok = 1;
-        }
-        else {
-            printk(KERN_ERR "initrd extends beyond end of memory "
-                   "(0x%08lx > 0x%08lx)\ndisabling initrd\n",
-                   __pa(start_info.mod_start) + start_info.mod_len,
-                   max_low_pfn << PAGE_SHIFT);
-            initrd_start = 0;
-        }
-    }
-#endif
-
-    paging_init();
-
-    /* We are privileged guest os - should have IO privileges. */
-    if ( start_info.flags & SIF_PRIVILEGED ) 
-    {
-        dom0_op_t op;
-        op.cmd           = DOM0_IOPL;
-        op.u.iopl.domain = start_info.dom_id;
-        op.u.iopl.iopl   = 1;
-        if( HYPERVISOR_dom0_op(&op) != 0 )
-            panic("Unable to obtain IOPL, despite being SIF_PRIVILEGED");
-        current->thread.io_pl = 1;
-    }
-
-    if(start_info.flags & SIF_CONSOLE)
-    {
-        if( !(start_info.flags & SIF_PRIVILEGED) )
-            panic("Xen granted us console access but not privileged status");
-
-#if defined(CONFIG_VT)
-#if defined(CONFIG_VGA_CONSOLE)
-        conswitchp = &vga_con;
-#elif defined(CONFIG_DUMMY_CONSOLE)
-        conswitchp = &dummy_con;
-#endif
-#endif
-    }
-}
-
-static int cachesize_override __initdata = -1;
-static int __init cachesize_setup(char *str)
-{
-    get_option (&str, &cachesize_override);
-    return 1;
-}
-__setup("cachesize=", cachesize_setup);
-
-
-static int __init get_model_name(struct cpuinfo_x86 *c)
-{
-    unsigned int *v;
-    char *p, *q;
-
-    if (cpuid_eax(0x80000000) < 0x80000004)
-        return 0;
-
-    v = (unsigned int *) c->x86_model_id;
-    cpuid(0x80000002, &v[0], &v[1], &v[2], &v[3]);
-    cpuid(0x80000003, &v[4], &v[5], &v[6], &v[7]);
-    cpuid(0x80000004, &v[8], &v[9], &v[10], &v[11]);
-    c->x86_model_id[48] = 0;
-
-    /* Intel chips right-justify this string for some dumb reason;
-       undo that brain damage */
-    p = q = &c->x86_model_id[0];
-    while ( *p == ' ' )
-        p++;
-    if ( p != q ) {
-        while ( *p )
-            *q++ = *p++;
-        while ( q <= &c->x86_model_id[48] )
-            *q++ = '\0';       /* Zero-pad the rest */
-    }
-
-    return 1;
-}
-
-
-static void __init display_cacheinfo(struct cpuinfo_x86 *c)
-{
-    unsigned int n, dummy, ecx, edx, l2size;
-
-    n = cpuid_eax(0x80000000);
-
-    if (n >= 0x80000005) {
-        cpuid(0x80000005, &dummy, &dummy, &ecx, &edx);
-        printk(KERN_INFO "CPU: L1 I Cache: %dK (%d bytes/line), D cache %dK (%d bytes/line)\n",
-               edx>>24, edx&0xFF, ecx>>24, ecx&0xFF);
-        c->x86_cache_size=(ecx>>24)+(edx>>24); 
-    }
-
-    if (n < 0x80000006)        /* Some chips just has a large L1. */
-        return;
-
-    ecx = cpuid_ecx(0x80000006);
-    l2size = ecx >> 16;
-
-    /* AMD errata T13 (order #21922) */
-    if ((c->x86_vendor == X86_VENDOR_AMD) && (c->x86 == 6)) {
-        if (c->x86_model == 3 && c->x86_mask == 0)     /* Duron Rev A0 */
-            l2size = 64;
-        if (c->x86_model == 4 &&
-            (c->x86_mask==0 || c->x86_mask==1))        /* Tbird rev A1/A2 */
-            l2size = 256;
-    }
-
-    /* Intel PIII Tualatin. This comes in two flavours.
-     * One has 256kb of cache, the other 512. We have no way
-     * to determine which, so we use a boottime override
-     * for the 512kb model, and assume 256 otherwise.
-     */
-    if ((c->x86_vendor == X86_VENDOR_INTEL) && (c->x86 == 6) &&
-        (c->x86_model == 11) && (l2size == 0))
-        l2size = 256;
-
-    if (c->x86_vendor == X86_VENDOR_CENTAUR) {
-       /* VIA C3 CPUs (670-68F) need further shifting. */
-       if ((c->x86 == 6) &&
-           ((c->x86_model == 7) || (c->x86_model == 8))) {
-               l2size >>= 8;
-       }
-
-       /* VIA also screwed up Nehemiah stepping 1, and made
-          it return '65KB' instead of '64KB'
-          - Note, it seems this may only be in engineering samples. */
-       if ((c->x86==6) && (c->x86_model==9) &&
-           (c->x86_mask==1) && (l2size==65))
-               l2size -= 1;
-    }
-
-    /* Allow user to override all this if necessary. */
-    if (cachesize_override != -1)
-        l2size = cachesize_override;
-
-    if ( l2size == 0 )
-        return;                /* Again, no L2 cache is possible */
-
-    c->x86_cache_size = l2size;
-
-    printk(KERN_INFO "CPU: L2 Cache: %dK (%d bytes/line)\n",
-           l2size, ecx & 0xFF);
-}
-
-
-static int __init init_amd(struct cpuinfo_x86 *c)
-{
-    int r;
-
-    /* Bit 31 in normal CPUID used for nonstandard 3DNow ID;
-       3DNow is IDd by bit 31 in extended CPUID (1*32+31) anyway */
-    clear_bit(0*32+31, &c->x86_capability);
-       
-    r = get_model_name(c);
-
-    switch(c->x86)
-    {
-    case 6:    /* An Athlon/Duron. We can trust the BIOS probably */
-        break;         
-    default:
-        panic("Unsupported AMD processor\n");
-    }
-
-    display_cacheinfo(c);
-    return r;
-}
-
-
-static void __init init_intel(struct cpuinfo_x86 *c)
-{
-    char *p = NULL;
-    unsigned int l1i = 0, l1d = 0, l2 = 0, l3 = 0; /* Cache sizes */
-
-    if (c->cpuid_level > 1) {
-        /* supports eax=2  call */
-        int i, j, n;
-        int regs[4];
-        unsigned char *dp = (unsigned char *)regs;
-
-        /* Number of times to iterate */
-        n = cpuid_eax(2) & 0xFF;
-
-        for ( i = 0 ; i < n ; i++ ) {
-            cpuid(2, &regs[0], &regs[1], &regs[2], &regs[3]);
-                       
-            /* If bit 31 is set, this is an unknown format */
-            for ( j = 0 ; j < 3 ; j++ ) {
-                if ( regs[j] < 0 ) regs[j] = 0;
-            }
-
-            /* Byte 0 is level count, not a descriptor */
-            for ( j = 1 ; j < 16 ; j++ ) {
-                unsigned char des = dp[j];
-                unsigned char dl, dh;
-                unsigned int cs;
-
-                dh = des >> 4;
-                dl = des & 0x0F;
-
-                               /* Black magic... */
-
-                switch ( dh )
-                {
-                case 0:
-                    switch ( dl ) {
-                    case 6:
-                        /* L1 I cache */
-                        l1i += 8;
-                        break;
-                    case 8:
-                        /* L1 I cache */
-                        l1i += 16;
-                        break;
-                    case 10:
-                        /* L1 D cache */
-                        l1d += 8;
-                        break;
-                    case 12:
-                        /* L1 D cache */
-                        l1d += 16;
-                        break;
-                    default:;
-                        /* TLB, or unknown */
-                    }
-                    break;
-                case 2:
-                    if ( dl ) {
-                        /* L3 cache */
-                        cs = (dl-1) << 9;
-                        l3 += cs;
-                    }
-                    break;
-                case 4:
-                    if ( c->x86 > 6 && dl ) {
-                        /* P4 family */
-                        /* L3 cache */
-                        cs = 128 << (dl-1);
-                        l3 += cs;
-                        break;
-                    }
-                    /* else same as 8 - fall through */
-                case 8:
-                    if ( dl ) {
-                        /* L2 cache */
-                        cs = 128 << (dl-1);
-                        l2 += cs;
-                    }
-                    break;
-                case 6:
-                    if (dl > 5) {
-                        /* L1 D cache */
-                        cs = 8<<(dl-6);
-                        l1d += cs;
-                    }
-                    break;
-                case 7:
-                    if ( dl >= 8 ) 
-                    {
-                        /* L2 cache */
-                        cs = 64<<(dl-8);
-                        l2 += cs;
-                    } else {
-                        /* L0 I cache, count as L1 */
-                        cs = dl ? (16 << (dl-1)) : 12;
-                        l1i += cs;
-                    }
-                    break;
-                default:
-                    /* TLB, or something else we don't know about */
-                    break;
-                }
-            }
-        }
-        if ( l1i || l1d )
-            printk(KERN_INFO "CPU: L1 I cache: %dK, L1 D cache: %dK\n",
-                   l1i, l1d);
-        if ( l2 )
-            printk(KERN_INFO "CPU: L2 cache: %dK\n", l2);
-        if ( l3 )
-            printk(KERN_INFO "CPU: L3 cache: %dK\n", l3);
-
-        /*
-         * This assumes the L3 cache is shared; it typically lives in
-         * the northbridge.  The L1 caches are included by the L2
-         * cache, and so should not be included for the purpose of
-         * SMP switching weights.
-         */
-        c->x86_cache_size = l2 ? l2 : (l1i+l1d);
-    }
-
-    /* SEP CPUID bug: Pentium Pro reports SEP but doesn't have it */
-    if ( c->x86 == 6 && c->x86_model < 3 && c->x86_mask < 3 )
-        clear_bit(X86_FEATURE_SEP, &c->x86_capability);
-       
-    /* Names for the Pentium II/Celeron processors 
-       detectable only by also checking the cache size.
-       Dixon is NOT a Celeron. */
-    if (c->x86 == 6) {
-        switch (c->x86_model) {
-        case 5:
-            if (l2 == 0)
-                p = "Celeron (Covington)";
-            if (l2 == 256)
-                p = "Mobile Pentium II (Dixon)";
-            break;
-                       
-        case 6:
-            if (l2 == 128)
-                p = "Celeron (Mendocino)";
-            break;
-                       
-        case 8:
-            if (l2 == 128)
-                p = "Celeron (Coppermine)";
-            break;
-        }
-    }
-
-    if ( p )
-        strcpy(c->x86_model_id, p);
-}
-
-void __init get_cpu_vendor(struct cpuinfo_x86 *c)
-{
-    char *v = c->x86_vendor_id;
-
-    if (!strcmp(v, "GenuineIntel"))
-        c->x86_vendor = X86_VENDOR_INTEL;
-    else if (!strcmp(v, "AuthenticAMD"))
-        c->x86_vendor = X86_VENDOR_AMD;
-    else
-        c->x86_vendor = X86_VENDOR_UNKNOWN;
-}
-
-struct cpu_model_info {
-    int vendor;
-    int family;
-    char *model_names[16];
-};
-
-/* Naming convention should be: <Name> [(<Codename>)] */
-/* This table only is used unless init_<vendor>() below doesn't set it; */
-/* in particular, if CPUID levels 0x80000002..4 are supported, this isn't used */
-static struct cpu_model_info cpu_models[] __initdata = {
-    { X86_VENDOR_INTEL,        6,
-      { "Pentium Pro A-step", "Pentium Pro", NULL, "Pentium II (Klamath)", 
-        NULL, "Pentium II (Deschutes)", "Mobile Pentium II",
-        "Pentium III (Katmai)", "Pentium III (Coppermine)", NULL,
-        "Pentium III (Cascades)", NULL, NULL, NULL, NULL }},
-    { X86_VENDOR_AMD,  6, /* Is this this really necessary?? */
-      { "Athlon", "Athlon",
-        "Athlon", NULL, "Athlon", NULL,
-        NULL, NULL, NULL,
-        NULL, NULL, NULL, NULL, NULL, NULL, NULL }}
-};
-
-/* Look up CPU names by table lookup. */
-static char __init *table_lookup_model(struct cpuinfo_x86 *c)
-{
-    struct cpu_model_info *info = cpu_models;
-    int i;
-
-    if ( c->x86_model >= 16 )
-        return NULL;   /* Range check */
-
-    for ( i = 0 ; i < sizeof(cpu_models)/sizeof(struct cpu_model_info) ; i++ ) {
-        if ( info->vendor == c->x86_vendor &&
-             info->family == c->x86 ) {
-            return info->model_names[c->x86_model];
-        }
-        info++;
-    }
-    return NULL;               /* Not found */
-}
-
-
-
-/* Standard macro to see if a specific flag is changeable */
-static inline int flag_is_changeable_p(u32 flag)
-{
-    u32 f1, f2;
-
-    asm("pushfl\n\t"
-        "pushfl\n\t"
-        "popl %0\n\t"
-        "movl %0,%1\n\t"
-        "xorl %2,%0\n\t"
-        "pushl %0\n\t"
-        "popfl\n\t"
-        "pushfl\n\t"
-        "popl %0\n\t"
-        "popfl\n\t"
-        : "=&r" (f1), "=&r" (f2)
-        : "ir" (flag));
-
-    return ((f1^f2) & flag) != 0;
-}
-
-
-/* Probe for the CPUID instruction */
-static int __init have_cpuid_p(void)
-{
-    return flag_is_changeable_p(X86_EFLAGS_ID);
-}
-
-
-
-/*
- * This does the hard work of actually picking apart the CPU stuff...
- */
-void __init identify_cpu(struct cpuinfo_x86 *c)
-{
-    int junk, i;
-    u32 xlvl, tfms;
-
-    c->loops_per_jiffy = loops_per_jiffy;
-    c->x86_cache_size = -1;
-    c->x86_vendor = X86_VENDOR_UNKNOWN;
-    c->cpuid_level = -1;       /* CPUID not detected */
-    c->x86_model = c->x86_mask = 0;    /* So far unknown... */
-    c->x86_vendor_id[0] = '\0'; /* Unset */
-    c->x86_model_id[0] = '\0';  /* Unset */
-    memset(&c->x86_capability, 0, sizeof c->x86_capability);
-    c->hard_math = 1;
-
-    if ( !have_cpuid_p() ) {
-        panic("Processor must support CPUID\n");
-    } else {
-        /* CPU does have CPUID */
-
-        /* Get vendor name */
-        cpuid(0x00000000, &c->cpuid_level,
-              (int *)&c->x86_vendor_id[0],
-              (int *)&c->x86_vendor_id[8],
-              (int *)&c->x86_vendor_id[4]);
-               
-        get_cpu_vendor(c);
-        /* Initialize the standard set of capabilities */
-        /* Note that the vendor-specific code below might override */
-
-        /* Intel-defined flags: level 0x00000001 */
-        if ( c->cpuid_level >= 0x00000001 ) {
-            cpuid(0x00000001, &tfms, &junk, &junk,
-                  &c->x86_capability[0]);
-            c->x86 = (tfms >> 8) & 15;
-            c->x86_model = (tfms >> 4) & 15;
-            c->x86_mask = tfms & 15;
-        } else {
-            /* Have CPUID level 0 only - unheard of */
-            c->x86 = 4;
-        }
-
-        /* AMD-defined flags: level 0x80000001 */
-        xlvl = cpuid_eax(0x80000000);
-        if ( (xlvl & 0xffff0000) == 0x80000000 ) {
-            if ( xlvl >= 0x80000001 )
-                c->x86_capability[1] = cpuid_edx(0x80000001);
-            if ( xlvl >= 0x80000004 )
-                get_model_name(c); /* Default name */
-        }
-
-        /* Transmeta-defined flags: level 0x80860001 */
-        xlvl = cpuid_eax(0x80860000);
-        if ( (xlvl & 0xffff0000) == 0x80860000 ) {
-            if (  xlvl >= 0x80860001 )
-                c->x86_capability[2] = cpuid_edx(0x80860001);
-        }
-    }
-
-    printk(KERN_DEBUG "CPU: Before vendor init, caps: %08x %08x %08x, vendor = %d\n",
-           c->x86_capability[0],
-           c->x86_capability[1],
-           c->x86_capability[2],
-           c->x86_vendor);
-
-    /*
-     * Vendor-specific initialization.  In this section we
-     * canonicalize the feature flags, meaning if there are
-     * features a certain CPU supports which CPUID doesn't
-     * tell us, CPUID claiming incorrect flags, or other bugs,
-     * we handle them here.
-     *
-     * At the end of this section, c->x86_capability better
-     * indicate the features this CPU genuinely supports!
-     */
-    switch ( c->x86_vendor ) {
-    case X86_VENDOR_AMD:
-        init_amd(c);
-        break;
-
-    case X86_VENDOR_INTEL:
-        init_intel(c);
-        break;
-
-    default:
-        panic("Unsupported CPU vendor\n");
-    }
-       
-    printk(KERN_DEBUG "CPU: After vendor init, caps: %08x %08x %08x %08x\n",
-           c->x86_capability[0],
-           c->x86_capability[1],
-           c->x86_capability[2],
-           c->x86_capability[3]);
-
-
-    /* If the model name is still unset, do table lookup. */
-    if ( !c->x86_model_id[0] ) {
-        char *p;
-        p = table_lookup_model(c);
-        if ( p )
-            strcpy(c->x86_model_id, p);
-        else
-            /* Last resort... */
-            sprintf(c->x86_model_id, "%02x/%02x",
-                    c->x86_vendor, c->x86_model);
-    }
-
-    /* Now the feature flags better reflect actual CPU features! */
-
-    printk(KERN_DEBUG "CPU:     After generic, caps: %08x %08x %08x %08x\n",
-           c->x86_capability[0],
-           c->x86_capability[1],
-           c->x86_capability[2],
-           c->x86_capability[3]);
-
-    /*
-     * On SMP, boot_cpu_data holds the common feature set between
-     * all CPUs; so make sure that we indicate which features are
-     * common between the CPUs.  The first time this routine gets
-     * executed, c == &boot_cpu_data.
-     */
-    if ( c != &boot_cpu_data ) {
-        /* AND the already accumulated flags with these */
-        for ( i = 0 ; i < NCAPINTS ; i++ )
-            boot_cpu_data.x86_capability[i] &= c->x86_capability[i];
-    }
-
-    printk(KERN_DEBUG "CPU:             Common caps: %08x %08x %08x %08x\n",
-           boot_cpu_data.x86_capability[0],
-           boot_cpu_data.x86_capability[1],
-           boot_cpu_data.x86_capability[2],
-           boot_cpu_data.x86_capability[3]);
-}
-
-
-/* These need to match <asm/processor.h> */
-static char *cpu_vendor_names[] __initdata = {
-    "Intel", "Cyrix", "AMD", "UMC", "NexGen", "Centaur", "Rise", "Transmeta" };
-
-
-void __init print_cpu_info(struct cpuinfo_x86 *c)
-{
-    char *vendor = NULL;
-
-    if (c->x86_vendor < sizeof(cpu_vendor_names)/sizeof(char *))
-        vendor = cpu_vendor_names[c->x86_vendor];
-    else if (c->cpuid_level >= 0)
-        vendor = c->x86_vendor_id;
-
-    if (vendor && strncmp(c->x86_model_id, vendor, strlen(vendor)))
-        printk("%s ", vendor);
-
-    if (!c->x86_model_id[0])
-        printk("%d86", c->x86);
-    else
-        printk("%s", c->x86_model_id);
-
-    if (c->x86_mask || c->cpuid_level >= 0) 
-        printk(" stepping %02x\n", c->x86_mask);
-    else
-        printk("\n");
-}
-
-/*
- *     Get CPU information for use by the procfs.
- */
-static int show_cpuinfo(struct seq_file *m, void *v)
-{
-    /* 
-     * These flag bits must match the definitions in <asm/cpufeature.h>.
-     * NULL means this bit is undefined or reserved; either way it doesn't
-     * have meaning as far as Linux is concerned.  Note that it's important
-     * to realize there is a difference between this table and CPUID -- if
-     * applications want to get the raw CPUID data, they should access
-     * /dev/cpu/<cpu_nr>/cpuid instead.
-        */
-    static char *x86_cap_flags[] = {
-        /* Intel-defined */
-        "fpu", "vme", "de", "pse", "tsc", "msr", "pae", "mce",
-        "cx8", "apic", NULL, "sep", "mtrr", "pge", "mca", "cmov",
-        "pat", "pse36", "pn", "clflush", NULL, "dts", "acpi", "mmx",
-        "fxsr", "sse", "sse2", "ss", NULL, "tm", "ia64", NULL,
-
-        /* AMD-defined */
-        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-        NULL, NULL, NULL, "syscall", NULL, NULL, NULL, NULL,
-        NULL, NULL, NULL, NULL, NULL, NULL, "mmxext", NULL,
-        NULL, NULL, NULL, NULL, NULL, "lm", "3dnowext", "3dnow",
-
-        /* Transmeta-defined */
-        "recovery", "longrun", NULL, "lrti", NULL, NULL, NULL, NULL,
-        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-
-        /* Other (Linux-defined) */
-        "cxmmx", "k6_mtrr", "cyrix_arr", "centaur_mcr", NULL, NULL, NULL, NULL,
-        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-    };
-    struct cpuinfo_x86 *c = v;
-    int i, n = c - cpu_data;
-    int fpu_exception;
-
-#ifdef CONFIG_SMP
-    if (!(cpu_online_map & (1<<n)))
-        return 0;
-#endif
-    seq_printf(m, "processor\t: %d\n"
-               "vendor_id\t: %s\n"
-               "cpu family\t: %d\n"
-               "model\t\t: %d\n"
-               "model name\t: %s\n",
-               n,
-               c->x86_vendor_id[0] ? c->x86_vendor_id : "unknown",
-               c->x86,
-               c->x86_model,
-               c->x86_model_id[0] ? c->x86_model_id : "unknown");
-
-    if (c->x86_mask || c->cpuid_level >= 0)
-        seq_printf(m, "stepping\t: %d\n", c->x86_mask);
-    else
-        seq_printf(m, "stepping\t: unknown\n");
-
-    if ( test_bit(X86_FEATURE_TSC, &c->x86_capability) ) {
-        seq_printf(m, "cpu MHz\t\t: %lu.%03lu\n",
-                   cpu_khz / 1000, (cpu_khz % 1000));
-    }
-
-    /* Cache size */
-    if (c->x86_cache_size >= 0)
-        seq_printf(m, "cache size\t: %d KB\n", c->x86_cache_size);
-       
-       /* We use exception 16 if we have hardware math and we've either seen it or the CPU claims it is internal */
-    fpu_exception = c->hard_math && (ignore_irq13 || cpu_has_fpu);
-    seq_printf(m, "fdiv_bug\t: %s\n"
-               "hlt_bug\t\t: %s\n"
-               "f00f_bug\t: %s\n"
-               "coma_bug\t: %s\n"
-               "fpu\t\t: %s\n"
-               "fpu_exception\t: %s\n"
-               "cpuid level\t: %d\n"
-               "wp\t\t: %s\n"
-               "flags\t\t:",
-               c->fdiv_bug ? "yes" : "no",
-               c->hlt_works_ok ? "no" : "yes",
-               c->f00f_bug ? "yes" : "no",
-               c->coma_bug ? "yes" : "no",
-               c->hard_math ? "yes" : "no",
-               fpu_exception ? "yes" : "no",
-               c->cpuid_level,
-               c->wp_works_ok ? "yes" : "no");
-
-    for ( i = 0 ; i < 32*NCAPINTS ; i++ )
-        if ( test_bit(i, &c->x86_capability) &&
-             x86_cap_flags[i] != NULL )
-            seq_printf(m, " %s", x86_cap_flags[i]);
-
-    seq_printf(m, "\nbogomips\t: %lu.%02lu\n\n",
-               c->loops_per_jiffy/(500000/HZ),
-               (c->loops_per_jiffy/(5000/HZ)) % 100);
-    return 0;
-}
-
-static void *c_start(struct seq_file *m, loff_t *pos)
-{
-    return *pos < NR_CPUS ? cpu_data + *pos : NULL;
-}
-static void *c_next(struct seq_file *m, void *v, loff_t *pos)
-{
-    ++*pos;
-    return c_start(m, pos);
-}
-static void c_stop(struct seq_file *m, void *v)
-{
-}
-struct seq_operations cpuinfo_op = {
-    start:     c_start,
-    next:      c_next,
-    stop:      c_stop,
-    show:      show_cpuinfo,
-};
-
-unsigned long cpu_initialized __initdata = 0;
-
-/*
- * cpu_init() initializes state that is per-CPU. Some data is already
- * initialized (naturally) in the bootstrap process, such as the GDT
- * and IDT. We reload them nevertheless, this function acts as a
- * 'CPU state barrier', nothing should get across.
- */
-void __init cpu_init (void)
-{
-    int nr = smp_processor_id();
-
-    if (test_and_set_bit(nr, &cpu_initialized)) {
-        printk(KERN_WARNING "CPU#%d already initialized!\n", nr);
-        for (;;) __sti();
-    }
-    printk(KERN_INFO "Initializing CPU#%d\n", nr);
-
-    /*
-     * set up and load the per-CPU TSS and LDT
-     */
-    atomic_inc(&init_mm.mm_count);
-    current->active_mm = &init_mm;
-    if(current->mm)
-        BUG();
-    enter_lazy_tlb(&init_mm, current, nr);
-
-    HYPERVISOR_stack_switch(__KERNEL_DS, current->thread.esp0);
-
-    load_LDT(&init_mm);
-    flush_page_update_queue();
-
-    /* Force FPU initialization. */
-    current->flags &= ~PF_USEDFPU;
-    current->used_math = 0;
-    stts();
-}
-
-
-/******************************************************************************
- * Time-to-die callback handling.
- */
-
-static void time_to_die(int irq, void *unused, struct pt_regs *regs)
-{
-    extern void ctrl_alt_del(void);
-    ctrl_alt_del();
-}
-
-static int __init setup_death_event(void)
-{
-    (void)request_irq(_EVENT_DIE, time_to_die, 0, "die", NULL);
-    return 0;
-}
-
-__initcall(setup_death_event);
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/kernel/signal.c b/xenolinux-2.4.21-sparse/arch/xeno/kernel/signal.c
deleted file mode 100644 (file)
index f646c5c..0000000
+++ /dev/null
@@ -1,717 +0,0 @@
-/*
- *  linux/arch/i386/kernel/signal.c
- *
- *  Copyright (C) 1991, 1992  Linus Torvalds
- *
- *  1997-11-28  Modified for POSIX.1b signals by Richard Henderson
- *  2000-06-20  Pentium III FXSR, SSE support by Gareth Hughes
- */
-
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/kernel.h>
-#include <linux/signal.h>
-#include <linux/errno.h>
-#include <linux/wait.h>
-#include <linux/ptrace.h>
-#include <linux/unistd.h>
-#include <linux/stddef.h>
-#include <linux/tty.h>
-#include <linux/personality.h>
-#include <asm/ucontext.h>
-#include <asm/uaccess.h>
-#include <asm/i387.h>
-
-#define DEBUG_SIG 0
-
-#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
-
-int FASTCALL(do_signal(struct pt_regs *regs, sigset_t *oldset));
-
-int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from)
-{
-       if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t)))
-               return -EFAULT;
-       if (from->si_code < 0)
-               return __copy_to_user(to, from, sizeof(siginfo_t));
-       else {
-               int err;
-
-               /* If you change siginfo_t structure, please be sure
-                  this code is fixed accordingly.
-                  It should never copy any pad contained in the structure
-                  to avoid security leaks, but must copy the generic
-                  3 ints plus the relevant union member.  */
-               err = __put_user(from->si_signo, &to->si_signo);
-               err |= __put_user(from->si_errno, &to->si_errno);
-               err |= __put_user((short)from->si_code, &to->si_code);
-               /* First 32bits of unions are always present.  */
-               err |= __put_user(from->si_pid, &to->si_pid);
-               switch (from->si_code >> 16) {
-               case __SI_FAULT >> 16:
-                       break;
-               case __SI_CHLD >> 16:
-                       err |= __put_user(from->si_utime, &to->si_utime);
-                       err |= __put_user(from->si_stime, &to->si_stime);
-                       err |= __put_user(from->si_status, &to->si_status);
-               default:
-                       err |= __put_user(from->si_uid, &to->si_uid);
-                       break;
-               /* case __SI_RT: This is not generated by the kernel as of now.  */
-               }
-               return err;
-       }
-}
-
-/*
- * Atomically swap in the new signal mask, and wait for a signal.
- */
-asmlinkage int
-sys_sigsuspend(int history0, int history1, old_sigset_t mask)
-{
-       struct pt_regs * regs = (struct pt_regs *) &history0;
-       sigset_t saveset;
-
-       mask &= _BLOCKABLE;
-       spin_lock_irq(&current->sigmask_lock);
-       saveset = current->blocked;
-       siginitset(&current->blocked, mask);
-       recalc_sigpending(current);
-       spin_unlock_irq(&current->sigmask_lock);
-
-       regs->eax = -EINTR;
-       while (1) {
-               current->state = TASK_INTERRUPTIBLE;
-               schedule();
-               if (do_signal(regs, &saveset))
-                       return -EINTR;
-       }
-}
-
-asmlinkage int
-sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize)
-{
-       struct pt_regs * regs = (struct pt_regs *) &unewset;
-       sigset_t saveset, newset;
-
-       /* XXX: Don't preclude handling different sized sigset_t's.  */
-       if (sigsetsize != sizeof(sigset_t))
-               return -EINVAL;
-
-       if (copy_from_user(&newset, unewset, sizeof(newset)))
-               return -EFAULT;
-       sigdelsetmask(&newset, ~_BLOCKABLE);
-
-       spin_lock_irq(&current->sigmask_lock);
-       saveset = current->blocked;
-       current->blocked = newset;
-       recalc_sigpending(current);
-       spin_unlock_irq(&current->sigmask_lock);
-
-       regs->eax = -EINTR;
-       while (1) {
-               current->state = TASK_INTERRUPTIBLE;
-               schedule();
-               if (do_signal(regs, &saveset))
-                       return -EINTR;
-       }
-}
-
-asmlinkage int 
-sys_sigaction(int sig, const struct old_sigaction *act,
-             struct old_sigaction *oact)
-{
-       struct k_sigaction new_ka, old_ka;
-       int ret;
-
-       if (act) {
-               old_sigset_t mask;
-               if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
-                   __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
-                   __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
-                       return -EFAULT;
-               __get_user(new_ka.sa.sa_flags, &act->sa_flags);
-               __get_user(mask, &act->sa_mask);
-               siginitset(&new_ka.sa.sa_mask, mask);
-       }
-
-       ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
-
-       if (!ret && oact) {
-               if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
-                   __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
-                   __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
-                       return -EFAULT;
-               __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
-               __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
-       }
-
-       return ret;
-}
-
-asmlinkage int
-sys_sigaltstack(const stack_t *uss, stack_t *uoss)
-{
-       struct pt_regs *regs = (struct pt_regs *) &uss;
-       return do_sigaltstack(uss, uoss, regs->esp);
-}
-
-
-/*
- * Do a signal return; undo the signal stack.
- */
-
-struct sigframe
-{
-       char *pretcode;
-       int sig;
-       struct sigcontext sc;
-       struct _fpstate fpstate;
-       unsigned long extramask[_NSIG_WORDS-1];
-       char retcode[8];
-};
-
-struct rt_sigframe
-{
-       char *pretcode;
-       int sig;
-       struct siginfo *pinfo;
-       void *puc;
-       struct siginfo info;
-       struct ucontext uc;
-       struct _fpstate fpstate;
-       char retcode[8];
-};
-
-static int
-restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc, int *peax)
-{
-       unsigned int err = 0;
-
-#define COPY(x)                err |= __get_user(regs->x, &sc->x)
-
-#define COPY_SEG(seg)                                                  \
-       { unsigned short tmp;                                           \
-         err |= __get_user(tmp, &sc->seg);                             \
-         regs->x##seg = tmp; }
-
-#define COPY_SEG_STRICT(seg)                                           \
-       { unsigned short tmp;                                           \
-         err |= __get_user(tmp, &sc->seg);                             \
-         regs->x##seg = tmp|3; }
-
-#define GET_SEG(seg)                                                   \
-       { unsigned short tmp;                                           \
-         err |= __get_user(tmp, &sc->seg);                             \
-         loadsegment(seg,tmp); }
-
-       GET_SEG(gs);
-       GET_SEG(fs);
-       COPY_SEG(es);
-       COPY_SEG(ds);
-       COPY(edi);
-       COPY(esi);
-       COPY(ebp);
-       COPY(esp);
-       COPY(ebx);
-       COPY(edx);
-       COPY(ecx);
-       COPY(eip);
-       COPY_SEG_STRICT(cs);
-       COPY_SEG_STRICT(ss);
-       
-       {
-               unsigned int tmpflags;
-               err |= __get_user(tmpflags, &sc->eflags);
-               regs->eflags = (regs->eflags & ~0x40DD5) | (tmpflags & 0x40DD5);
-               regs->orig_eax = -1;            /* disable syscall checks */
-       }
-
-       {
-               struct _fpstate * buf;
-               err |= __get_user(buf, &sc->fpstate);
-               if (buf) {
-                       if (verify_area(VERIFY_READ, buf, sizeof(*buf)))
-                               goto badframe;
-                       err |= restore_i387(buf);
-               }
-       }
-
-       err |= __get_user(*peax, &sc->eax);
-       return err;
-
-badframe:
-       return 1;
-}
-
-asmlinkage int sys_sigreturn(unsigned long __unused)
-{
-       struct pt_regs *regs = (struct pt_regs *) &__unused;
-       struct sigframe *frame = (struct sigframe *)(regs->esp - 8);
-       sigset_t set;
-       int eax;
-
-       if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
-               goto badframe;
-       if (__get_user(set.sig[0], &frame->sc.oldmask)
-           || (_NSIG_WORDS > 1
-               && __copy_from_user(&set.sig[1], &frame->extramask,
-                                   sizeof(frame->extramask))))
-               goto badframe;
-
-       sigdelsetmask(&set, ~_BLOCKABLE);
-       spin_lock_irq(&current->sigmask_lock);
-       current->blocked = set;
-       recalc_sigpending(current);
-       spin_unlock_irq(&current->sigmask_lock);
-       
-       if (restore_sigcontext(regs, &frame->sc, &eax))
-               goto badframe;
-       return eax;
-
-badframe:
-       force_sig(SIGSEGV, current);
-       return 0;
-}      
-
-asmlinkage int sys_rt_sigreturn(unsigned long __unused)
-{
-       struct pt_regs *regs = (struct pt_regs *) &__unused;
-       struct rt_sigframe *frame = (struct rt_sigframe *)(regs->esp - 4);
-       sigset_t set;
-       stack_t st;
-       int eax;
-
-       if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
-               goto badframe;
-       if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
-               goto badframe;
-
-       sigdelsetmask(&set, ~_BLOCKABLE);
-       spin_lock_irq(&current->sigmask_lock);
-       current->blocked = set;
-       recalc_sigpending(current);
-       spin_unlock_irq(&current->sigmask_lock);
-       
-       if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &eax))
-               goto badframe;
-
-       if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
-               goto badframe;
-       /* It is more difficult to avoid calling this function than to
-          call it and ignore errors.  */
-       do_sigaltstack(&st, NULL, regs->esp);
-
-       return eax;
-
-badframe:
-       force_sig(SIGSEGV, current);
-       return 0;
-}      
-
-/*
- * Set up a signal frame.
- */
-
-static int
-setup_sigcontext(struct sigcontext *sc, struct _fpstate *fpstate,
-                struct pt_regs *regs, unsigned long mask)
-{
-       int tmp, err = 0;
-
-       tmp = 0;
-       __asm__("movl %%gs,%0" : "=r"(tmp): "0"(tmp));
-       err |= __put_user(tmp, (unsigned int *)&sc->gs);
-       __asm__("movl %%fs,%0" : "=r"(tmp): "0"(tmp));
-       err |= __put_user(tmp, (unsigned int *)&sc->fs);
-
-       err |= __put_user(regs->xes, (unsigned int *)&sc->es);
-       err |= __put_user(regs->xds, (unsigned int *)&sc->ds);
-       err |= __put_user(regs->edi, &sc->edi);
-       err |= __put_user(regs->esi, &sc->esi);
-       err |= __put_user(regs->ebp, &sc->ebp);
-       err |= __put_user(regs->esp, &sc->esp);
-       err |= __put_user(regs->ebx, &sc->ebx);
-       err |= __put_user(regs->edx, &sc->edx);
-       err |= __put_user(regs->ecx, &sc->ecx);
-       err |= __put_user(regs->eax, &sc->eax);
-       err |= __put_user(current->thread.trap_no, &sc->trapno);
-       err |= __put_user(current->thread.error_code, &sc->err);
-       err |= __put_user(regs->eip, &sc->eip);
-       err |= __put_user(regs->xcs, (unsigned int *)&sc->cs);
-       err |= __put_user(regs->eflags, &sc->eflags);
-       err |= __put_user(regs->esp, &sc->esp_at_signal);
-       err |= __put_user(regs->xss, (unsigned int *)&sc->ss);
-
-       tmp = save_i387(fpstate);
-       if (tmp < 0)
-         err = 1;
-       else
-         err |= __put_user(tmp ? fpstate : NULL, &sc->fpstate);
-
-       /* non-iBCS2 extensions.. */
-       err |= __put_user(mask, &sc->oldmask);
-       err |= __put_user(current->thread.cr2, &sc->cr2);
-
-       return err;
-}
-
-/*
- * Determine which stack to use..
- */
-static inline void *
-get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
-{
-       unsigned long esp;
-
-       /* Default to using normal stack */
-       esp = regs->esp;
-
-       /* This is the X/Open sanctioned signal stack switching.  */
-       if (ka->sa.sa_flags & SA_ONSTACK) {
-               if (sas_ss_flags(esp) == 0)
-                       esp = current->sas_ss_sp + current->sas_ss_size;
-       }
-
-       /* This is the legacy signal stack switching. */
-       else if ((regs->xss & 0xffff) != __USER_DS &&
-                !(ka->sa.sa_flags & SA_RESTORER) &&
-                ka->sa.sa_restorer) {
-               esp = (unsigned long) ka->sa.sa_restorer;
-       }
-
-       return (void *)((esp - frame_size) & -8ul);
-}
-
-static void setup_frame(int sig, struct k_sigaction *ka,
-                       sigset_t *set, struct pt_regs * regs)
-{
-       struct sigframe *frame;
-       int err = 0;
-
-       frame = get_sigframe(ka, regs, sizeof(*frame));
-
-       if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
-               goto give_sigsegv;
-
-       err |= __put_user((current->exec_domain
-                          && current->exec_domain->signal_invmap
-                          && sig < 32
-                          ? current->exec_domain->signal_invmap[sig]
-                          : sig),
-                         &frame->sig);
-       if (err)
-               goto give_sigsegv;
-
-       err |= setup_sigcontext(&frame->sc, &frame->fpstate, regs, set->sig[0]);
-       if (err)
-               goto give_sigsegv;
-
-       if (_NSIG_WORDS > 1) {
-               err |= __copy_to_user(frame->extramask, &set->sig[1],
-                                     sizeof(frame->extramask));
-       }
-       if (err)
-               goto give_sigsegv;
-
-       /* Set up to return from userspace.  If provided, use a stub
-          already in userspace.  */
-       if (ka->sa.sa_flags & SA_RESTORER) {
-               err |= __put_user(ka->sa.sa_restorer, &frame->pretcode);
-       } else {
-               err |= __put_user(frame->retcode, &frame->pretcode);
-               /* This is popl %eax ; movl $,%eax ; int $0x80 */
-               err |= __put_user(0xb858, (short *)(frame->retcode+0));
-               err |= __put_user(__NR_sigreturn, (int *)(frame->retcode+2));
-               err |= __put_user(0x80cd, (short *)(frame->retcode+6));
-       }
-
-       if (err)
-               goto give_sigsegv;
-
-       /* Set up registers for signal handler */
-       regs->esp = (unsigned long) frame;
-       regs->eip = (unsigned long) ka->sa.sa_handler;
-
-       set_fs(USER_DS);
-       regs->xds = __USER_DS;
-       regs->xes = __USER_DS;
-       regs->xss = __USER_DS;
-       regs->xcs = __USER_CS;
-       regs->eflags &= ~TF_MASK;
-
-#if DEBUG_SIG
-       printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
-               current->comm, current->pid, frame, regs->eip, frame->pretcode);
-#endif
-
-       return;
-
-give_sigsegv:
-       if (sig == SIGSEGV)
-               ka->sa.sa_handler = SIG_DFL;
-       force_sig(SIGSEGV, current);
-}
-
-static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
-                          sigset_t *set, struct pt_regs * regs)
-{
-       struct rt_sigframe *frame;
-       int err = 0;
-
-       frame = get_sigframe(ka, regs, sizeof(*frame));
-
-       if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
-               goto give_sigsegv;
-
-       err |= __put_user((current->exec_domain
-                          && current->exec_domain->signal_invmap
-                          && sig < 32
-                          ? current->exec_domain->signal_invmap[sig]
-                          : sig),
-                         &frame->sig);
-       err |= __put_user(&frame->info, &frame->pinfo);
-       err |= __put_user(&frame->uc, &frame->puc);
-       err |= copy_siginfo_to_user(&frame->info, info);
-       if (err)
-               goto give_sigsegv;
-
-       /* Create the ucontext.  */
-       err |= __put_user(0, &frame->uc.uc_flags);
-       err |= __put_user(0, &frame->uc.uc_link);
-       err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
-       err |= __put_user(sas_ss_flags(regs->esp),
-                         &frame->uc.uc_stack.ss_flags);
-       err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
-       err |= setup_sigcontext(&frame->uc.uc_mcontext, &frame->fpstate,
-                               regs, set->sig[0]);
-       err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
-       if (err)
-               goto give_sigsegv;
-
-       /* Set up to return from userspace.  If provided, use a stub
-          already in userspace.  */
-       if (ka->sa.sa_flags & SA_RESTORER) {
-               err |= __put_user(ka->sa.sa_restorer, &frame->pretcode);
-       } else {
-               err |= __put_user(frame->retcode, &frame->pretcode);
-               /* This is movl $,%eax ; int $0x80 */
-               err |= __put_user(0xb8, (char *)(frame->retcode+0));
-               err |= __put_user(__NR_rt_sigreturn, (int *)(frame->retcode+1));
-               err |= __put_user(0x80cd, (short *)(frame->retcode+5));
-       }
-
-       if (err)
-               goto give_sigsegv;
-
-       /* Set up registers for signal handler */
-       regs->esp = (unsigned long) frame;
-       regs->eip = (unsigned long) ka->sa.sa_handler;
-
-       set_fs(USER_DS);
-       regs->xds = __USER_DS;
-       regs->xes = __USER_DS;
-       regs->xss = __USER_DS;
-       regs->xcs = __USER_CS;
-       regs->eflags &= ~TF_MASK;
-
-#if DEBUG_SIG
-       printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
-               current->comm, current->pid, frame, regs->eip, frame->pretcode);
-#endif
-
-       return;
-
-give_sigsegv:
-       if (sig == SIGSEGV)
-               ka->sa.sa_handler = SIG_DFL;
-       force_sig(SIGSEGV, current);
-}
-
-/*
- * OK, we're invoking a handler
- */    
-
-static void
-handle_signal(unsigned long sig, struct k_sigaction *ka,
-             siginfo_t *info, sigset_t *oldset, struct pt_regs * regs)
-{
-       /* Are we from a system call? */
-       if (regs->orig_eax >= 0) {
-               /* If so, check system call restarting.. */
-               switch (regs->eax) {
-                       case -ERESTARTNOHAND:
-                               regs->eax = -EINTR;
-                               break;
-
-                       case -ERESTARTSYS:
-                               if (!(ka->sa.sa_flags & SA_RESTART)) {
-                                       regs->eax = -EINTR;
-                                       break;
-                               }
-                       /* fallthrough */
-                       case -ERESTARTNOINTR:
-                               regs->eax = regs->orig_eax;
-                               regs->eip -= 2;
-               }
-       }
-
-       /* Set up the stack frame */
-       if (ka->sa.sa_flags & SA_SIGINFO)
-               setup_rt_frame(sig, ka, info, oldset, regs);
-       else
-               setup_frame(sig, ka, oldset, regs);
-
-       if (ka->sa.sa_flags & SA_ONESHOT)
-               ka->sa.sa_handler = SIG_DFL;
-
-       if (!(ka->sa.sa_flags & SA_NODEFER)) {
-               spin_lock_irq(&current->sigmask_lock);
-               sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
-               sigaddset(&current->blocked,sig);
-               recalc_sigpending(current);
-               spin_unlock_irq(&current->sigmask_lock);
-       }
-}
-
-/*
- * Note that 'init' is a special process: it doesn't get signals it doesn't
- * want to handle. Thus you cannot kill init even with a SIGKILL even by
- * mistake.
- */
-int do_signal(struct pt_regs *regs, sigset_t *oldset)
-{
-       siginfo_t info;
-       struct k_sigaction *ka;
-
-       /*
-        * We want the common case to go fast, which
-        * is why we may in certain cases get here from
-        * kernel mode. Just return without doing anything
-        * if so.
-        */
-       if ((regs->xcs & 2) != 2)
-               return 1;
-
-       if (!oldset)
-               oldset = &current->blocked;
-
-       for (;;) {
-               unsigned long signr;
-
-               spin_lock_irq(&current->sigmask_lock);
-               signr = dequeue_signal(&current->blocked, &info);
-               spin_unlock_irq(&current->sigmask_lock);
-
-               if (!signr)
-                       break;
-
-               if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
-                       /* Let the debugger run.  */
-                       current->exit_code = signr;
-                       current->state = TASK_STOPPED;
-                       notify_parent(current, SIGCHLD);
-                       schedule();
-
-                       /* We're back.  Did the debugger cancel the sig?  */
-                       if (!(signr = current->exit_code))
-                               continue;
-                       current->exit_code = 0;
-
-                       /* The debugger continued.  Ignore SIGSTOP.  */
-                       if (signr == SIGSTOP)
-                               continue;
-
-                       /* Update the siginfo structure.  Is this good?  */
-                       if (signr != info.si_signo) {
-                               info.si_signo = signr;
-                               info.si_errno = 0;
-                               info.si_code = SI_USER;
-                               info.si_pid = current->p_pptr->pid;
-                               info.si_uid = current->p_pptr->uid;
-                       }
-
-                       /* If the (new) signal is now blocked, requeue it.  */
-                       if (sigismember(&current->blocked, signr)) {
-                               send_sig_info(signr, &info, current);
-                               continue;
-                       }
-               }
-
-               ka = &current->sig->action[signr-1];
-               if (ka->sa.sa_handler == SIG_IGN) {
-                       if (signr != SIGCHLD)
-                               continue;
-                       /* Check for SIGCHLD: it's special.  */
-                       while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
-                               /* nothing */;
-                       continue;
-               }
-
-               if (ka->sa.sa_handler == SIG_DFL) {
-                       int exit_code = signr;
-
-                       /* Init gets no signals it doesn't want.  */
-                       if (current->pid == 1)
-                               continue;
-
-                       switch (signr) {
-                       case SIGCONT: case SIGCHLD: case SIGWINCH: case SIGURG:
-                               continue;
-
-                       case SIGTSTP: case SIGTTIN: case SIGTTOU:
-                               if (is_orphaned_pgrp(current->pgrp))
-                                       continue;
-                               /* FALLTHRU */
-
-                       case SIGSTOP: {
-                               struct signal_struct *sig;
-                               current->state = TASK_STOPPED;
-                               current->exit_code = signr;
-                               sig = current->p_pptr->sig;
-                               if (sig && !(sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP))
-                                       notify_parent(current, SIGCHLD);
-                               schedule();
-                               continue;
-                       }
-
-                       case SIGQUIT: case SIGILL: case SIGTRAP:
-                       case SIGABRT: case SIGFPE: case SIGSEGV:
-                       case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
-                               if (do_coredump(signr, regs))
-                                       exit_code |= 0x80;
-                               /* FALLTHRU */
-
-                       default:
-                               sig_exit(signr, exit_code, &info);
-                               /* NOTREACHED */
-                       }
-               }
-
-               /* Reenable any watchpoints before delivering the
-                * signal to user space. The processor register will
-                * have been cleared if the watchpoint triggered
-                * inside the kernel.
-                */
-                if ( current->thread.debugreg[7] != 0 )
-                    HYPERVISOR_set_debugreg(7, current->thread.debugreg[7]);
-
-               /* Whee!  Actually deliver the signal.  */
-               handle_signal(signr, ka, &info, oldset, regs);
-               return 1;
-       }
-
-       /* Did we come from a system call? */
-       if (regs->orig_eax >= 0) {
-               /* Restart the system call - no handlers present */
-               if (regs->eax == -ERESTARTNOHAND ||
-                   regs->eax == -ERESTARTSYS ||
-                   regs->eax == -ERESTARTNOINTR) {
-                       regs->eax = regs->orig_eax;
-                       regs->eip -= 2;
-               }
-       }
-       return 0;
-}
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/kernel/time.c b/xenolinux-2.4.21-sparse/arch/xeno/kernel/time.c
deleted file mode 100644 (file)
index 73ac82c..0000000
+++ /dev/null
@@ -1,323 +0,0 @@
-/* -*-  Mode:C; c-basic-offset:4; tab-width:4 -*-
- ****************************************************************************
- * (C) 2002 - Rolf Neugebauer - Intel Research Cambridge
- ****************************************************************************
- *
- *        File: arch.xeno/time.c
- *      Author: Rolf Neugebauer
- *     Changes: 
- *              
- *        Date: Nov 2002
- * 
- * Environment: XenoLinux
- * Description: Interface with Hypervisor to get correct notion of time
- *              Currently supports Systemtime and WallClock time.
- *
- * (This has hardly any resemblence with the Linux code but left the
- *  copyright notice anyway. Ignore the comments in the copyright notice.)
- ****************************************************************************
- * $Id: c-insert.c,v 1.7 2002/11/08 16:04:34 rn Exp $
- ****************************************************************************
- */
-
-/*
- *  linux/arch/i386/kernel/time.c
- *
- *  Copyright (C) 1991, 1992, 1995  Linus Torvalds
- *
- * This file contains the PC-specific time handling details:
- * reading the RTC at bootup, etc..
- * 1994-07-02    Alan Modra
- *     fixed set_rtc_mmss, fixed time.year for >= 2000, new mktime
- * 1995-03-26    Markus Kuhn
- *      fixed 500 ms bug at call to set_rtc_mmss, fixed DS12887
- *      precision CMOS clock update
- * 1996-05-03    Ingo Molnar
- *      fixed time warps in do_[slow|fast]_gettimeoffset()
- * 1997-09-10  Updated NTP code according to technical memorandum Jan '96
- *             "A Kernel Model for Precision Timekeeping" by Dave Mills
- * 1998-09-05    (Various)
- *     More robust do_fast_gettimeoffset() algorithm implemented
- *     (works with APM, Cyrix 6x86MX and Centaur C6),
- *     monotonic gettimeofday() with fast_get_timeoffset(),
- *     drift-proof precision TSC calibration on boot
- *     (C. Scott Ananian <cananian@alumni.princeton.edu>, Andrew D.
- *     Balsa <andrebalsa@altern.org>, Philip Gladstone <philip@raptor.com>;
- *     ported from 2.0.35 Jumbo-9 by Michael Krause <m.krause@tu-harburg.de>).
- * 1998-12-16    Andrea Arcangeli
- *     Fixed Jumbo-9 code in 2.1.131: do_gettimeofday was missing 1 jiffy
- *     because was not accounting lost_ticks.
- * 1998-12-24 Copyright (C) 1998  Andrea Arcangeli
- *     Fixed a xtime SMP race (we need the xtime_lock rw spinlock to
- *     serialize accesses to xtime/lost_ticks).
- */
-
-#include <asm/smp.h>
-#include <asm/irq.h>
-#include <asm/msr.h>
-#include <asm/delay.h>
-#include <asm/mpspec.h>
-#include <asm/uaccess.h>
-#include <asm/processor.h>
-
-#include <asm/div64.h>
-#include <asm/hypervisor.h>
-
-#include <linux/kernel.h>
-#include <linux/interrupt.h>
-#include <linux/time.h>
-#include <linux/init.h>
-#include <linux/smp.h>
-#include <linux/irq.h>
-
-#undef XENO_TIME_DEBUG /* adds sanity checks and periodic printouts */
-
-spinlock_t rtc_lock = SPIN_LOCK_UNLOCKED;
-extern rwlock_t xtime_lock;
-
-unsigned long cpu_khz; /* get this from Xen, used elsewhere */
-static spinlock_t hyp_time_lock = SPIN_LOCK_UNLOCKED;
-
-static unsigned int rdtsc_bitshift;
-static u32 st_scale_f;
-static u32 st_scale_i;
-static u32 shadow_st_pcc;
-static s64 shadow_st;
-
-/*
- * System time.
- * Although the rest of the Linux kernel doesn't know about this, we
- * we use it to extrapolate passage of wallclock time.
- * We need to read the values from the shared info page "atomically" 
- * and use the cycle counter value as the "version" number. Clashes
- * should be very rare.
- */
-static inline s64 __get_s_time(void)
-{
-    s32 delta_tsc;
-    u32 low;
-    u64 delta, tsc;
-
-    rdtscll(tsc);
-    low = (u32)(tsc >> rdtsc_bitshift);
-    delta_tsc = (s32)(low - shadow_st_pcc);
-    if ( unlikely(delta_tsc < 0) ) delta_tsc = 0;
-    delta = ((u64)delta_tsc * st_scale_f);
-    delta >>= 32;
-    delta += ((u64)delta_tsc * st_scale_i);
-
-    return shadow_st + delta;
-}
-
-/*
- * Wallclock time.
- * Based on what the hypervisor tells us, extrapolated using system time.
- * Again need to read a number of values from the shared page "atomically".
- * this time using a version number.
- */
-static u32        shadow_wc_version=0;
-static long       shadow_tv_sec;
-static long       shadow_tv_usec;
-static long long  shadow_wc_timestamp;
-void do_gettimeofday(struct timeval *tv)
-{
-    unsigned long flags;
-    long          usec, sec;
-    u32                  version;
-    u64           now, cpu_freq, scale;
-
-    spin_lock_irqsave(&hyp_time_lock, flags);
-
-    while ( (version = HYPERVISOR_shared_info->wc_version) != 
-            shadow_wc_version )
-    {
-        barrier();
-
-        shadow_wc_version   = version;
-        shadow_tv_sec       = HYPERVISOR_shared_info->tv_sec;
-        shadow_tv_usec      = HYPERVISOR_shared_info->tv_usec;
-        shadow_wc_timestamp = HYPERVISOR_shared_info->wc_timestamp;
-        shadow_st_pcc       = HYPERVISOR_shared_info->st_timestamp;
-        shadow_st           = HYPERVISOR_shared_info->system_time;
-
-        rdtsc_bitshift      = HYPERVISOR_shared_info->rdtsc_bitshift;
-        cpu_freq            = HYPERVISOR_shared_info->cpu_freq;
-
-        /* XXX cpu_freq as u32 limits it to 4.29 GHz. Get a better do_div! */
-        scale = 1000000000LL << (32 + rdtsc_bitshift);
-        do_div(scale,(u32)cpu_freq);
-        st_scale_f = scale & 0xffffffff;
-        st_scale_i = scale >> 32;
-
-        barrier();
-       }
-
-    now   = __get_s_time();
-    usec  = ((unsigned long)(now-shadow_wc_timestamp))/1000;
-    sec   = shadow_tv_sec;
-    usec += shadow_tv_usec;
-
-    while ( usec >= 1000000 ) 
-    {
-        usec -= 1000000;
-        sec++;
-    }
-
-    tv->tv_sec = sec;
-    tv->tv_usec = usec;
-
-    spin_unlock_irqrestore(&hyp_time_lock, flags);
-
-#ifdef XENO_TIME_DEBUG
-    {
-        static long long old_now=0;
-        static long long wct=0, old_wct=0;
-
-        /* This debug code checks if time increase over two subsequent calls */
-        wct=(((long long)sec) * 1000000) + usec;
-        /* wall clock time going backwards */
-        if ((wct < old_wct) ) {        
-            printk("Urgh1: wc diff=%6ld, usec = %ld (0x%lX)\n",
-                   (long)(wct-old_wct), usec, usec);           
-            printk("       st diff=%lld cur st=0x%016llX old st=0x%016llX\n",
-                   now-old_now, now, old_now);
-        }
-
-        /* system time going backwards */
-        if (now<=old_now) {
-            printk("Urgh2: st diff=%lld cur st=0x%016llX old st=0x%016llX\n",
-                   now-old_now, now, old_now);
-        }
-        old_wct  = wct;
-        old_now  = now;
-    }
-#endif
-}
-
-void do_settimeofday(struct timeval *tv)
-{
-/* XXX RN: should do something special here for dom0 */
-#if 0
-    write_lock_irq(&xtime_lock);
-    /*
-     * This is revolting. We need to set "xtime" correctly. However, the
-     * value in this location is the value at the most recent update of
-     * wall time.  Discover what correction gettimeofday() would have
-     * made, and then undo it!
-     */
-    tv->tv_usec -= do_gettimeoffset();
-    tv->tv_usec -= (jiffies - wall_jiffies) * (1000000 / HZ);
-
-    while ( tv->tv_usec < 0 )
-    {
-        tv->tv_usec += 1000000;
-        tv->tv_sec--;
-    }
-
-    xtime = *tv;
-    time_adjust = 0;           /* stop active adjtime() */
-    time_status |= STA_UNSYNC;
-    time_maxerror = NTP_PHASE_LIMIT;
-    time_esterror = NTP_PHASE_LIMIT;
-    write_unlock_irq(&xtime_lock);
-#endif
-}
-
-
-/*
- * Timer ISR. 
- * Unlike normal Linux these don't come in at a fixed rate of HZ. 
- * In here we wrok out how often it should have been called and then call
- * the architecture independent part (do_timer()) the appropriate number of
- * times. A bit of a nasty hack, to keep the "other" notion of wallclock time
- * happy.
- */
-static long long us_per_tick=1000000/HZ;
-static long long last_irq;
-static inline void do_timer_interrupt(int irq, void *dev_id,
-                                      struct pt_regs *regs)
-{
-    struct timeval tv;
-    long long time, delta;
-
-    /*
-     * The next bit really sucks:
-     * Linux not only uses do_gettimeofday() to keep a notion of
-     * wallclock time, but also maintains the xtime struct and jiffies.
-     * (Even worse some userland code accesses this via the sys_time()
-     * system call)
-     * Unfortunately, xtime is maintain in the architecture independent
-     * part of the timer ISR (./kernel/timer.c sic!). So, although we have
-     * perfectly valid notion of wallclock time from the hypervisor we here
-     * fake missed timer interrupts so that the arch independent part of
-     * the Timer ISR updates jiffies for us *and* once the bh gets run
-     * updates xtime accordingly. Yuck!
-     */
-
-    /* Work out the number of jiffy intervals passed and update them. */
-    do_gettimeofday(&tv);
-    time = (((long long)tv.tv_sec) * 1000000) + tv.tv_usec;
-    delta = time - last_irq;
-    if (delta <= 0) {
-        printk ("Timer ISR: Time went backwards: %lld\n", delta);
-        return;
-    }
-    while (delta >= us_per_tick) {
-        do_timer(regs);
-        delta    -= us_per_tick;
-        last_irq += us_per_tick;
-    }
-
-#if 0
-    if (!user_mode(regs))
-        x86_do_profile(regs->eip);
-#endif
-}
-
-static void timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-{
-    write_lock(&xtime_lock);
-    do_timer_interrupt(irq, NULL, regs);
-    write_unlock(&xtime_lock);
-}
-
-static struct irqaction irq_timer = {
-    timer_interrupt, 
-    SA_INTERRUPT, 
-    0, 
-    "timer", 
-    NULL, 
-    NULL
-};
-
-void __init time_init(void)
-{
-    unsigned long long alarm;
-    u64 __cpu_khz;
-
-    __cpu_khz = HYPERVISOR_shared_info->cpu_freq;
-    do_div(__cpu_khz, 1000);
-    cpu_khz = (u32)__cpu_khz;
-    printk("Xen reported: %lu.%03lu MHz processor.\n", 
-           cpu_khz / 1000, cpu_khz % 1000);
-
-    do_gettimeofday(&xtime);
-    last_irq = (((long long)xtime.tv_sec) * 1000000) + xtime.tv_usec;
-
-    setup_irq(TIMER_IRQ, &irq_timer);
-
-    /*
-     * Start ticker. Note that timing runs of wall clock, not virtual 'domain' 
-     * time. This means that clock sshould run at the correct rate. For things 
-     * like scheduling, it's not clear whether it matters which sort of time 
-     * we use. XXX RN: unimplemented.
-     */
-
-    rdtscll(alarm);
-#if 0
-    alarm += (1000/HZ)*HYPERVISOR_shared_info->ticks_per_ms;
-    HYPERVISOR_shared_info->wall_timeout   = alarm;
-    HYPERVISOR_shared_info->domain_timeout = ~0ULL;
-#endif
-    clear_bit(_EVENT_TIMER, &HYPERVISOR_shared_info->events);
-}
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/kernel/traps.c b/xenolinux-2.4.21-sparse/arch/xeno/kernel/traps.c
deleted file mode 100644 (file)
index 85c6acb..0000000
+++ /dev/null
@@ -1,600 +0,0 @@
-/*
- *  linux/arch/i386/traps.c
- *
- *  Copyright (C) 1991, 1992  Linus Torvalds
- *
- *  Pentium III FXSR, SSE support
- *     Gareth Hughes <gareth@valinux.com>, May 2000
- */
-
-/*
- * 'Traps.c' handles hardware traps and faults after we have saved some
- * state in 'asm.s'.
- */
-#include <linux/config.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/errno.h>
-#include <linux/ptrace.h>
-#include <linux/timer.h>
-#include <linux/mm.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-#include <linux/spinlock.h>
-#include <linux/interrupt.h>
-#include <linux/highmem.h>
-
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/io.h>
-#include <asm/atomic.h>
-#include <asm/debugreg.h>
-#include <asm/desc.h>
-#include <asm/i387.h>
-
-#include <asm/smp.h>
-#include <asm/pgalloc.h>
-
-#include <asm/hypervisor.h>
-
-#include <linux/irq.h>
-#include <linux/module.h>
-
-asmlinkage int system_call(void);
-asmlinkage void lcall7(void);
-asmlinkage void lcall27(void);
-
-asmlinkage void divide_error(void);
-asmlinkage void debug(void);
-asmlinkage void int3(void);
-asmlinkage void overflow(void);
-asmlinkage void bounds(void);
-asmlinkage void invalid_op(void);
-asmlinkage void device_not_available(void);
-asmlinkage void double_fault(void);
-asmlinkage void coprocessor_segment_overrun(void);
-asmlinkage void invalid_TSS(void);
-asmlinkage void segment_not_present(void);
-asmlinkage void stack_segment(void);
-asmlinkage void general_protection(void);
-asmlinkage void page_fault(void);
-asmlinkage void coprocessor_error(void);
-asmlinkage void simd_coprocessor_error(void);
-asmlinkage void alignment_check(void);
-asmlinkage void spurious_interrupt_bug(void);
-asmlinkage void machine_check(void);
-
-int kstack_depth_to_print = 24;
-
-
-/*
- * If the address is either in the .text section of the
- * kernel, or in the vmalloc'ed module regions, it *may* 
- * be the address of a calling routine
- */
-
-#ifdef CONFIG_MODULES
-
-extern struct module *module_list;
-extern struct module kernel_module;
-
-static inline int kernel_text_address(unsigned long addr)
-{
-       int retval = 0;
-       struct module *mod;
-
-       if (addr >= (unsigned long) &_stext &&
-           addr <= (unsigned long) &_etext)
-               return 1;
-
-       for (mod = module_list; mod != &kernel_module; mod = mod->next) {
-               /* mod_bound tests for addr being inside the vmalloc'ed
-                * module area. Of course it'd be better to test only
-                * for the .text subset... */
-               if (mod_bound(addr, 0, mod)) {
-                       retval = 1;
-                       break;
-               }
-       }
-
-       return retval;
-}
-
-#else
-
-static inline int kernel_text_address(unsigned long addr)
-{
-       return (addr >= (unsigned long) &_stext &&
-               addr <= (unsigned long) &_etext);
-}
-
-#endif
-
-void show_trace(unsigned long * stack)
-{
-       int i;
-       unsigned long addr;
-
-       if (!stack)
-               stack = (unsigned long*)&stack;
-
-       printk("Call Trace: ");
-       i = 1;
-       while (((long) stack & (THREAD_SIZE-1)) != 0) {
-               addr = *stack++;
-               if (kernel_text_address(addr)) {
-                       if (i && ((i % 6) == 0))
-                               printk("\n   ");
-                       printk("[<%08lx>] ", addr);
-                       i++;
-               }
-       }
-       printk("\n");
-}
-
-void show_trace_task(struct task_struct *tsk)
-{
-       unsigned long esp = tsk->thread.esp;
-
-       /* User space on another CPU? */
-       if ((esp ^ (unsigned long)tsk) & (PAGE_MASK<<1))
-               return;
-       show_trace((unsigned long *)esp);
-}
-
-void show_stack(unsigned long * esp)
-{
-       unsigned long *stack;
-       int i;
-
-       // debugging aid: "show_stack(NULL);" prints the
-       // back trace for this cpu.
-
-       if(esp==NULL)
-               esp=(unsigned long*)&esp;
-
-       stack = esp;
-       for(i=0; i < kstack_depth_to_print; i++) {
-               if (((long) stack & (THREAD_SIZE-1)) == 0)
-                       break;
-               if (i && ((i % 8) == 0))
-                       printk("\n       ");
-               printk("%08lx ", *stack++);
-       }
-       printk("\n");
-       show_trace(esp);
-}
-
-void show_registers(struct pt_regs *regs)
-{
-       int in_kernel = 1;
-       unsigned long esp;
-       unsigned short ss;
-
-       esp = (unsigned long) (&regs->esp);
-       ss = __KERNEL_DS;
-       if (regs->xcs & 2) {
-               in_kernel = 0;
-               esp = regs->esp;
-               ss = regs->xss & 0xffff;
-       }
-       printk("CPU:    %d\nEIP:    %04x:[<%08lx>]    %s\nEFLAGS: %08lx\n",
-               smp_processor_id(), 0xffff & regs->xcs, regs->eip, print_tainted(), regs->eflags);
-       printk("eax: %08lx   ebx: %08lx   ecx: %08lx   edx: %08lx\n",
-               regs->eax, regs->ebx, regs->ecx, regs->edx);
-       printk("esi: %08lx   edi: %08lx   ebp: %08lx   esp: %08lx\n",
-               regs->esi, regs->edi, regs->ebp, esp);
-       printk("ds: %04x   es: %04x   ss: %04x\n",
-               regs->xds & 0xffff, regs->xes & 0xffff, ss);
-       printk("Process %s (pid: %d, stackpage=%08lx)",
-               current->comm, current->pid, 4096+(unsigned long)current);
-       /*
-        * When in-kernel, we also print out the stack and code at the
-        * time of the fault..
-        */
-       if (in_kernel) {
-
-               printk("\nStack: ");
-               show_stack((unsigned long*)esp);
-
-#if 0
-                {
-                        int i;
-                       printk("\nCode: ");
-                       if(regs->eip < PAGE_OFFSET)
-                               goto bad;
-
-                       for(i=0;i<20;i++)
-                       {
-                               unsigned char c;
-                               if(__get_user(c, &((unsigned char*)regs->eip)[i])) {
-bad:
-                                       printk(" Bad EIP value.");
-                                       break;
-                               }
-                               printk("%02x ", c);
-                       }
-               }
-#endif
-       }
-       printk("\n");
-}      
-
-spinlock_t die_lock = SPIN_LOCK_UNLOCKED;
-
-void die(const char * str, struct pt_regs * regs, long err)
-{
-       console_verbose();
-       spin_lock_irq(&die_lock);
-       bust_spinlocks(1);
-       printk("%s: %04lx\n", str, err & 0xffff);
-       show_registers(regs);
-       bust_spinlocks(0);
-       spin_unlock_irq(&die_lock);
-       do_exit(SIGSEGV);
-}
-
-static inline void die_if_kernel(const char * str, struct pt_regs * regs, long err)
-{
-       if (!(2 & regs->xcs))
-               die(str, regs, err);
-}
-
-
-static void inline do_trap(int trapnr, int signr, char *str,
-                          struct pt_regs * regs, long error_code,
-                           siginfo_t *info)
-{
-       if (!(regs->xcs & 2))
-               goto kernel_trap;
-
-       /*trap_signal:*/ {
-               struct task_struct *tsk = current;
-               tsk->thread.error_code = error_code;
-               tsk->thread.trap_no = trapnr;
-               if (info)
-                       force_sig_info(signr, info, tsk);
-               else
-                       force_sig(signr, tsk);
-               return;
-       }
-
-       kernel_trap: {
-               unsigned long fixup = search_exception_table(regs->eip);
-               if (fixup)
-                       regs->eip = fixup;
-               else    
-                       die(str, regs, error_code);
-               return;
-       }
-}
-
-#define DO_ERROR(trapnr, signr, str, name) \
-asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
-{ \
-       do_trap(trapnr, signr, str, regs, error_code, NULL); \
-}
-
-#define DO_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \
-asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
-{ \
-       siginfo_t info; \
-       info.si_signo = signr; \
-       info.si_errno = 0; \
-       info.si_code = sicode; \
-       info.si_addr = (void *)siaddr; \
-       do_trap(trapnr, signr, str, regs, error_code, &info); \
-}
-
-DO_ERROR_INFO( 0, SIGFPE,  "divide error", divide_error, FPE_INTDIV, regs->eip)
-DO_ERROR( 3, SIGTRAP, "int3", int3)
-DO_ERROR( 4, SIGSEGV, "overflow", overflow)
-DO_ERROR( 5, SIGSEGV, "bounds", bounds)
-DO_ERROR_INFO( 6, SIGILL,  "invalid operand", invalid_op, ILL_ILLOPN, regs->eip)
-DO_ERROR( 7, SIGSEGV, "device not available", device_not_available)
-DO_ERROR( 8, SIGSEGV, "double fault", double_fault)
-DO_ERROR( 9, SIGFPE,  "coprocessor segment overrun", coprocessor_segment_overrun)
-DO_ERROR(10, SIGSEGV, "invalid TSS", invalid_TSS)
-DO_ERROR(11, SIGBUS,  "segment not present", segment_not_present)
-DO_ERROR(12, SIGBUS,  "stack segment", stack_segment)
-DO_ERROR_INFO(17, SIGBUS, "alignment check", alignment_check, BUS_ADRALN, 0)
-DO_ERROR(18, SIGBUS, "machine check", machine_check)
-
-asmlinkage void do_general_protection(struct pt_regs * regs, long error_code)
-{
-       if (!(regs->xcs & 2))
-               goto gp_in_kernel;
-
-       current->thread.error_code = error_code;
-       current->thread.trap_no = 13;
-       force_sig(SIGSEGV, current);
-       return;
-
-gp_in_kernel:
-       {
-               unsigned long fixup;
-               fixup = search_exception_table(regs->eip);
-               if (fixup) {
-                       regs->eip = fixup;
-                       return;
-               }
-               die("general protection fault", regs, error_code);
-       }
-}
-
-
-asmlinkage void do_debug(struct pt_regs * regs, long error_code)
-{
-    unsigned int condition;
-    struct task_struct *tsk = current;
-    siginfo_t info;
-
-    condition = HYPERVISOR_get_debugreg(6);
-
-    /* Mask out spurious debug traps due to lazy DR7 setting */
-    if (condition & (DR_TRAP0|DR_TRAP1|DR_TRAP2|DR_TRAP3)) {
-        if (!tsk->thread.debugreg[7])
-            goto clear_dr7;
-    }
-
-    /* Save debug status register where ptrace can see it */
-    tsk->thread.debugreg[6] = condition;
-
-    /* Mask out spurious TF errors due to lazy TF clearing */
-    if (condition & DR_STEP) {
-        /*
-         * The TF error should be masked out only if the current
-         * process is not traced and if the TRAP flag has been set
-         * previously by a tracing process (condition detected by
-         * the PT_DTRACE flag); remember that the i386 TRAP flag
-         * can be modified by the process itself in user mode,
-         * allowing programs to debug themselves without the ptrace()
-         * interface.
-         */
-        if ((tsk->ptrace & (PT_DTRACE|PT_PTRACED)) == PT_DTRACE)
-            goto clear_TF;
-    }
-
-    /* Ok, finally something we can handle */
-    tsk->thread.trap_no = 1;
-    tsk->thread.error_code = error_code;
-    info.si_signo = SIGTRAP;
-    info.si_errno = 0;
-    info.si_code = TRAP_BRKPT;
-        
-    /* If this is a kernel mode trap, save the user PC on entry to 
-     * the kernel, that's what the debugger can make sense of.
-     */
-    info.si_addr = ((regs->xcs & 2) == 0) ? (void *)tsk->thread.eip : 
-                                            (void *)regs->eip;
-    force_sig_info(SIGTRAP, &info, tsk);
-
-    /* Disable additional traps. They'll be re-enabled when
-     * the signal is delivered.
-     */
- clear_dr7:
-    HYPERVISOR_set_debugreg(7, 0);
-    return;
-
- clear_TF:
-    regs->eflags &= ~TF_MASK;
-    return;
-}
-
-
-/*
- * Note that we play around with the 'TS' bit in an attempt to get
- * the correct behaviour even in the presence of the asynchronous
- * IRQ13 behaviour
- */
-void math_error(void *eip)
-{
-       struct task_struct * task;
-       siginfo_t info;
-       unsigned short cwd, swd;
-
-       /*
-        * Save the info for the exception handler and clear the error.
-        */
-       task = current;
-       save_init_fpu(task);
-       task->thread.trap_no = 16;
-       task->thread.error_code = 0;
-       info.si_signo = SIGFPE;
-       info.si_errno = 0;
-       info.si_code = __SI_FAULT;
-       info.si_addr = eip;
-       /*
-        * (~cwd & swd) will mask out exceptions that are not set to unmasked
-        * status.  0x3f is the exception bits in these regs, 0x200 is the
-        * C1 reg you need in case of a stack fault, 0x040 is the stack
-        * fault bit.  We should only be taking one exception at a time,
-        * so if this combination doesn't produce any single exception,
-        * then we have a bad program that isn't syncronizing its FPU usage
-        * and it will suffer the consequences since we won't be able to
-        * fully reproduce the context of the exception
-        */
-       cwd = get_fpu_cwd(task);
-       swd = get_fpu_swd(task);
-       switch (((~cwd) & swd & 0x3f) | (swd & 0x240)) {
-               case 0x000:
-               default:
-                       break;
-               case 0x001: /* Invalid Op */
-               case 0x040: /* Stack Fault */
-               case 0x240: /* Stack Fault | Direction */
-                       info.si_code = FPE_FLTINV;
-                       break;
-               case 0x002: /* Denormalize */
-               case 0x010: /* Underflow */
-                       info.si_code = FPE_FLTUND;
-                       break;
-               case 0x004: /* Zero Divide */
-                       info.si_code = FPE_FLTDIV;
-                       break;
-               case 0x008: /* Overflow */
-                       info.si_code = FPE_FLTOVF;
-                       break;
-               case 0x020: /* Precision */
-                       info.si_code = FPE_FLTRES;
-                       break;
-       }
-       force_sig_info(SIGFPE, &info, task);
-}
-
-asmlinkage void do_coprocessor_error(struct pt_regs * regs, long error_code)
-{
-       ignore_irq13 = 1;
-       math_error((void *)regs->eip);
-}
-
-void simd_math_error(void *eip)
-{
-       struct task_struct * task;
-       siginfo_t info;
-       unsigned short mxcsr;
-
-       /*
-        * Save the info for the exception handler and clear the error.
-        */
-       task = current;
-       save_init_fpu(task);
-       task->thread.trap_no = 19;
-       task->thread.error_code = 0;
-       info.si_signo = SIGFPE;
-       info.si_errno = 0;
-       info.si_code = __SI_FAULT;
-       info.si_addr = eip;
-       /*
-        * The SIMD FPU exceptions are handled a little differently, as there
-        * is only a single status/control register.  Thus, to determine which
-        * unmasked exception was caught we must mask the exception mask bits
-        * at 0x1f80, and then use these to mask the exception bits at 0x3f.
-        */
-       mxcsr = get_fpu_mxcsr(task);
-       switch (~((mxcsr & 0x1f80) >> 7) & (mxcsr & 0x3f)) {
-               case 0x000:
-               default:
-                       break;
-               case 0x001: /* Invalid Op */
-                       info.si_code = FPE_FLTINV;
-                       break;
-               case 0x002: /* Denormalize */
-               case 0x010: /* Underflow */
-                       info.si_code = FPE_FLTUND;
-                       break;
-               case 0x004: /* Zero Divide */
-                       info.si_code = FPE_FLTDIV;
-                       break;
-               case 0x008: /* Overflow */
-                       info.si_code = FPE_FLTOVF;
-                       break;
-               case 0x020: /* Precision */
-                       info.si_code = FPE_FLTRES;
-                       break;
-       }
-       force_sig_info(SIGFPE, &info, task);
-}
-
-asmlinkage void do_simd_coprocessor_error(struct pt_regs * regs,
-                                         long error_code)
-{
-       if (cpu_has_xmm) {
-               /* Handle SIMD FPU exceptions on PIII+ processors. */
-               ignore_irq13 = 1;
-               simd_math_error((void *)regs->eip);
-       } else {
-               die_if_kernel("cache flush denied", regs, error_code);
-               current->thread.trap_no = 19;
-               current->thread.error_code = error_code;
-               force_sig(SIGSEGV, current);
-       }
-}
-
-asmlinkage void do_spurious_interrupt_bug(struct pt_regs * regs,
-                                         long error_code)
-{
-}
-
-/*
- *  'math_state_restore()' saves the current math information in the
- * old math state array, and gets the new ones from the current task
- *
- * Careful.. There are problems with IBM-designed IRQ13 behaviour.
- * Don't touch unless you *really* know how it works.
- */
-asmlinkage void math_state_restore(struct pt_regs regs)
-{
-       if (current->used_math) {
-               restore_fpu(current);
-       } else {
-               init_fpu();
-       }
-       current->flags |= PF_USEDFPU;   /* So we fnsave on switch_to() */
-}
-
-
-#define _set_gate(gate_addr,type,dpl,addr) \
-do { \
-  int __d0, __d1; \
-  __asm__ __volatile__ ("movw %%dx,%%ax\n\t" \
-       "movw %4,%%dx\n\t" \
-       "movl %%eax,%0\n\t" \
-       "movl %%edx,%1" \
-       :"=m" (*((long *) (gate_addr))), \
-        "=m" (*(1+(long *) (gate_addr))), "=&a" (__d0), "=&d" (__d1) \
-       :"i" ((short) (0x8000+(dpl<<13)+(type<<8))), \
-        "3" ((char *) (addr)),"2" (__KERNEL_CS << 16)); \
-} while (0)
-
-static void __init set_call_gate(void *a, void *addr)
-{
-       _set_gate(a,12,3,addr);
-}
-
-
-/* NB. All these are "trap gates" (i.e. events_mask isn't cleared). */
-static trap_info_t trap_table[] = {
-    {  0, 0, __KERNEL_CS, (unsigned long)divide_error                },
-    {  1, 0, __KERNEL_CS, (unsigned long)debug                       },
-    {  3, 3, __KERNEL_CS, (unsigned long)int3                        },
-    {  4, 3, __KERNEL_CS, (unsigned long)overflow                    },
-    {  5, 3, __KERNEL_CS, (unsigned long)bounds                      },
-    {  6, 0, __KERNEL_CS, (unsigned long)invalid_op                  },
-    {  7, 0, __KERNEL_CS, (unsigned long)device_not_available        },
-    {  8, 0, __KERNEL_CS, (unsigned long)double_fault                },
-    {  9, 0, __KERNEL_CS, (unsigned long)coprocessor_segment_overrun },
-    { 10, 0, __KERNEL_CS, (unsigned long)invalid_TSS                 },
-    { 11, 0, __KERNEL_CS, (unsigned long)segment_not_present         },
-    { 12, 0, __KERNEL_CS, (unsigned long)stack_segment               },
-    { 13, 0, __KERNEL_CS, (unsigned long)general_protection          },
-    { 14, 0, __KERNEL_CS, (unsigned long)page_fault                  },
-    { 15, 0, __KERNEL_CS, (unsigned long)spurious_interrupt_bug      },
-    { 16, 0, __KERNEL_CS, (unsigned long)coprocessor_error           },
-    { 17, 0, __KERNEL_CS, (unsigned long)alignment_check             },
-    { 18, 0, __KERNEL_CS, (unsigned long)machine_check               },
-    { 19, 0, __KERNEL_CS, (unsigned long)simd_coprocessor_error      },
-    { SYSCALL_VECTOR, 
-          3, __KERNEL_CS, (unsigned long)system_call                 },
-    {  0, 0,           0, 0                           }
-};
-    
-
-
-void __init trap_init(void)
-{
-    HYPERVISOR_set_trap_table(trap_table);    
-    HYPERVISOR_set_fast_trap(SYSCALL_VECTOR);
-
-    /*
-     * The default LDT is a single-entry callgate to lcall7 for iBCS and a
-     * callgate to lcall27 for Solaris/x86 binaries.
-     */
-    clear_page(&default_ldt[0]);
-    set_call_gate(&default_ldt[0],lcall7);
-    set_call_gate(&default_ldt[4],lcall27);
-    __make_page_readonly(&default_ldt[0]);
-
-    cpu_init();
-}
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/lib/Makefile b/xenolinux-2.4.21-sparse/arch/xeno/lib/Makefile
deleted file mode 100644 (file)
index 2224f03..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-
-.S.o:
-       $(CC) $(AFLAGS) -c $< -o $*.o
-
-L_TARGET = lib.a
-
-obj-y = checksum.o old-checksum.o delay.o \
-       usercopy.o getuser.o \
-       memcpy.o strstr.o
-
-obj-$(CONFIG_X86_USE_3DNOW) += mmx.o
-obj-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.o
-obj-$(CONFIG_DEBUG_IOVIRT)  += iodebug.o
-
-include $(TOPDIR)/Rules.make
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/lib/delay.c b/xenolinux-2.4.21-sparse/arch/xeno/lib/delay.c
deleted file mode 100644 (file)
index 0035bed..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *     Precise Delay Loops for i386
- *
- *     Copyright (C) 1993 Linus Torvalds
- *     Copyright (C) 1997 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
- *
- *     The __delay function must _NOT_ be inlined as its execution time
- *     depends wildly on alignment on many x86 processors. The additional
- *     jump magic is needed to get the timing stable on all the CPU's
- *     we have to worry about.
- */
-
-#include <linux/config.h>
-#include <linux/sched.h>
-#include <linux/delay.h>
-#include <asm/processor.h>
-#include <asm/delay.h>
-
-#ifdef CONFIG_SMP
-#include <asm/smp.h>
-#endif
-
-void __delay(unsigned long loops)
-{
-       unsigned long bclock, now;
-       
-       rdtscl(bclock);
-       do
-       {
-               rep_nop();
-               rdtscl(now);
-       } while ((now-bclock) < loops);
-}
-
-inline void __const_udelay(unsigned long xloops)
-{
-       int d0;
-       __asm__("mull %0"
-               :"=d" (xloops), "=&a" (d0)
-               :"1" (xloops),"0" (current_cpu_data.loops_per_jiffy));
-        __delay(xloops * HZ);
-}
-
-void __udelay(unsigned long usecs)
-{
-       __const_udelay(usecs * 0x000010c6);  /* 2**32 / 1000000 */
-}
-
-void __ndelay(unsigned long nsecs)
-{
-       __const_udelay(nsecs * 0x00005);  /* 2**32 / 1000000000 (rounded up) */
-}
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/mm/Makefile b/xenolinux-2.4.21-sparse/arch/xeno/mm/Makefile
deleted file mode 100644 (file)
index d0d1611..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-#
-# Makefile for the linux i386-specific parts of the memory manager.
-#
-# Note! Dependencies are done automagically by 'make dep', which also
-# removes any old dependencies. DON'T put your own dependencies here
-# unless it's something special (ie not a .c file).
-#
-# Note 2! The CFLAGS definition is now in the main makefile...
-
-O_TARGET := mm.o
-
-obj-y   := init.o fault.o extable.o pageattr.o hypervisor.o ioremap.o
-
-export-objs := pageattr.o
-
-include $(TOPDIR)/Rules.make
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/mm/fault.c b/xenolinux-2.4.21-sparse/arch/xeno/mm/fault.c
deleted file mode 100644 (file)
index d4d24d2..0000000
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
- *  linux/arch/i386/mm/fault.c
- *
- *  Copyright (C) 1995  Linus Torvalds
- */
-
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/ptrace.h>
-#include <linux/mman.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/interrupt.h>
-#include <linux/init.h>
-#include <linux/tty.h>
-#include <linux/vt_kern.h>             /* For unblank_screen() */
-
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/pgalloc.h>
-#include <asm/hardirq.h>
-
-extern void die(const char *,struct pt_regs *,long);
-
-pgd_t *cur_pgd;
-
-extern spinlock_t timerlist_lock;
-
-/*
- * Unlock any spinlocks which will prevent us from getting the
- * message out (timerlist_lock is acquired through the
- * console unblank code)
- */
-void bust_spinlocks(int yes)
-{
-       spin_lock_init(&timerlist_lock);
-       if (yes) {
-               oops_in_progress = 1;
-       } else {
-               int loglevel_save = console_loglevel;
-#ifdef CONFIG_VT
-               unblank_screen();
-#endif
-               oops_in_progress = 0;
-               /*
-                * OK, the message is on the console.  Now we call printk()
-                * without oops_in_progress set so that printk will give klogd
-                * a poke.  Hold onto your hats...
-                */
-               console_loglevel = 15;          /* NMI oopser may have shut the console up */
-               printk(" ");
-               console_loglevel = loglevel_save;
-       }
-}
-
-/*
- * This routine handles page faults.  It determines the address,
- * and the problem, and then passes it off to one of the appropriate
- * routines.
- *
- * error_code:
- *     bit 0 == 0 means no page found, 1 means protection fault
- *     bit 1 == 0 means read, 1 means write
- *     bit 2 == 0 means kernel, 1 means user-mode
- */
-asmlinkage void do_page_fault(struct pt_regs *regs, 
-                              unsigned long error_code,
-                              unsigned long address)
-{
-       struct task_struct *tsk = current;
-       struct mm_struct *mm;
-       struct vm_area_struct * vma;
-       unsigned long page;
-       unsigned long fixup;
-       int write;
-       siginfo_t info;
-
-        /* Set the "privileged fault" bit to something sane. */
-        error_code &= 3;
-        error_code |= (regs->xcs & 2) << 1;
-
-#if PT_UPDATE_DEBUG > 0
-        if ( (error_code == 0) && (address >= TASK_SIZE) )
-        {
-            unsigned long paddr = __pa(address);
-            int i;
-            for ( i = 0; i < pt_update_queue_idx; i++ )
-            {
-                if ( update_debug_queue[i].ptr == paddr )
-                {
-                    printk("XXX now(EIP=%08lx:ptr=%08lx) "
-                           "then(%s/%d:p/v=%08lx/%08lx)\n",
-                           regs->eip, address,
-                           update_debug_queue[i].file,
-                           update_debug_queue[i].line,
-                           update_debug_queue[i].ptr,
-                           update_debug_queue[i].val);
-                }
-            }
-        }
-#endif
-
-        if ( flush_page_update_queue() != 0 ) return;
-
-       /*
-        * We fault-in kernel-space virtual memory on-demand. The
-        * 'reference' page table is init_mm.pgd.
-        *
-        * NOTE! We MUST NOT take any locks for this case. We may
-        * be in an interrupt or a critical region, and should
-        * only copy the information from the master page table,
-        * nothing more.
-        *
-        * This verifies that the fault happens in kernel space
-        * (error_code & 4) == 0, and that the fault was not a
-        * protection error (error_code & 1) == 0.
-        */
-       if (address >= TASK_SIZE && !(error_code & 5))
-               goto vmalloc_fault;
-
-       mm = tsk->mm;
-       info.si_code = SEGV_MAPERR;
-
-       /*
-        * If we're in an interrupt or have no user
-        * context, we must not take the fault..
-        */
-       if (in_interrupt() || !mm)
-               goto no_context;
-
-       down_read(&mm->mmap_sem);
-
-       vma = find_vma(mm, address);
-       if (!vma)
-               goto bad_area;
-       if (vma->vm_start <= address)
-               goto good_area;
-       if (!(vma->vm_flags & VM_GROWSDOWN))
-               goto bad_area;
-       if (error_code & 4) {
-               /*
-                * accessing the stack below %esp is always a bug.
-                * The "+ 32" is there due to some instructions (like
-                * pusha) doing post-decrement on the stack and that
-                * doesn't show up until later..
-                */
-               if (address + 32 < regs->esp)
-                       goto bad_area;
-       }
-       if (expand_stack(vma, address))
-               goto bad_area;
-/*
- * Ok, we have a good vm_area for this memory access, so
- * we can handle it..
- */
-good_area:
-       info.si_code = SEGV_ACCERR;
-       write = 0;
-       switch (error_code & 3) {
-               default:        /* 3: write, present */
-                       /* fall through */
-               case 2:         /* write, not present */
-                       if (!(vma->vm_flags & VM_WRITE))
-                               goto bad_area;
-                       write++;
-                       break;
-               case 1:         /* read, present */
-                       goto bad_area;
-               case 0:         /* read, not present */
-                       if (!(vma->vm_flags & (VM_READ | VM_EXEC)))
-                               goto bad_area;
-       }
-
- survive:
-       /*
-        * If for any reason at all we couldn't handle the fault,
-        * make sure we exit gracefully rather than endlessly redo
-        * the fault.
-        */
-       switch (handle_mm_fault(mm, vma, address, write)) {
-       case 1:
-               tsk->min_flt++;
-               break;
-       case 2:
-               tsk->maj_flt++;
-               break;
-       case 0:
-               goto do_sigbus;
-       default:
-               goto out_of_memory;
-       }
-
-       up_read(&mm->mmap_sem);
-       return;
-
-/*
- * Something tried to access memory that isn't in our memory map..
- * Fix it, but check if it's kernel or user first..
- */
-bad_area:
-       up_read(&mm->mmap_sem);
-
-       /* User mode accesses just cause a SIGSEGV */
-       if (error_code & 4) {
-               tsk->thread.cr2 = address;
-               tsk->thread.error_code = error_code;
-               tsk->thread.trap_no = 14;
-               info.si_signo = SIGSEGV;
-               info.si_errno = 0;
-               /* info.si_code has been set above */
-               info.si_addr = (void *)address;
-               force_sig_info(SIGSEGV, &info, tsk);
-               return;
-       }
-
-no_context:
-       /* Are we prepared to handle this kernel fault?  */
-       if ((fixup = search_exception_table(regs->eip)) != 0) {
-               regs->eip = fixup;
-               return;
-       }
-
-/*
- * Oops. The kernel tried to access some bad page. We'll have to
- * terminate things with extreme prejudice.
- */
-
-       bust_spinlocks(1);
-
-       if (address < PAGE_SIZE)
-               printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference");
-       else
-               printk(KERN_ALERT "Unable to handle kernel paging request");
-       printk(" at virtual address %08lx\n",address);
-       printk(" printing eip:\n");
-       printk("%08lx\n", regs->eip);
-        page = ((unsigned long *) cur_pgd)[address >> 22];
-        printk(KERN_ALERT "*pde=%08lx(%08lx)\n", page, machine_to_phys(page));
-       if (page & 1) {
-               page &= PAGE_MASK;
-               address &= 0x003ff000;
-                page = machine_to_phys(page);
-               page = ((unsigned long *) __va(page))[address >> PAGE_SHIFT];
-                printk(KERN_ALERT "*pte=%08lx(%08lx)\n", page, 
-                       machine_to_phys(page));
-       }
-       die("Oops", regs, error_code);
-       bust_spinlocks(0);
-       do_exit(SIGKILL);
-
-/*
- * We ran out of memory, or some other thing happened to us that made
- * us unable to handle the page fault gracefully.
- */
-out_of_memory:
-       if (tsk->pid == 1) {
-               yield();
-               goto survive;
-       }
-       up_read(&mm->mmap_sem);
-       printk("VM: killing process %s\n", tsk->comm);
-       if (error_code & 4)
-               do_exit(SIGKILL);
-       goto no_context;
-
-do_sigbus:
-       up_read(&mm->mmap_sem);
-
-       /*
-        * Send a sigbus, regardless of whether we were in kernel
-        * or user mode.
-        */
-       tsk->thread.cr2 = address;
-       tsk->thread.error_code = error_code;
-       tsk->thread.trap_no = 14;
-       info.si_signo = SIGBUS;
-       info.si_errno = 0;
-       info.si_code = BUS_ADRERR;
-       info.si_addr = (void *)address;
-       force_sig_info(SIGBUS, &info, tsk);
-
-       /* Kernel mode? Handle exceptions or die */
-       if (!(error_code & 4))
-               goto no_context;
-       return;
-
-vmalloc_fault:
-       {
-               /*
-                * Synchronize this task's top level page-table
-                * with the 'reference' page table.
-                *
-                * Do _not_ use "tsk" here. We might be inside
-                * an interrupt in the middle of a task switch..
-                */
-               int offset = __pgd_offset(address);
-               pgd_t *pgd, *pgd_k;
-               pmd_t *pmd, *pmd_k;
-               pte_t *pte_k;
-
-               pgd = offset + cur_pgd;
-               pgd_k = init_mm.pgd + offset;
-
-               if (!pgd_present(*pgd_k))
-                       goto no_context;
-               set_pgd(pgd, *pgd_k);
-               
-               pmd = pmd_offset(pgd, address);
-               pmd_k = pmd_offset(pgd_k, address);
-               if (!pmd_present(*pmd_k))
-                       goto no_context;
-               set_pmd(pmd, *pmd_k);
-                XENO_flush_page_update_queue(); /* flush PMD update */
-
-               pte_k = pte_offset(pmd_k, address);
-               if (!pte_present(*pte_k))
-                       goto no_context;
-               return;
-       }
-}
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/mm/hypervisor.c b/xenolinux-2.4.21-sparse/arch/xeno/mm/hypervisor.c
deleted file mode 100644 (file)
index 1935595..0000000
+++ /dev/null
@@ -1,238 +0,0 @@
-/******************************************************************************
- * xeno/mm/hypervisor.c
- * 
- * Update page tables via the hypervisor.
- * 
- * Copyright (c) 2002, K A Fraser
- */
-
-#include <linux/config.h>
-#include <linux/sched.h>
-#include <asm/hypervisor.h>
-#include <asm/page.h>
-#include <asm/pgtable.h>
-#include <asm/multicall.h>
-
-/*
- * This suffices to protect us if we ever move to SMP domains.
- * Further, it protects us against interrupts. At the very least, this is
- * required for the network driver which flushes the update queue before
- * pushing new receive buffers.
- */
-static spinlock_t update_lock = SPIN_LOCK_UNLOCKED;
-
-#define QUEUE_SIZE 2048
-static page_update_request_t update_queue[QUEUE_SIZE];
-unsigned int pt_update_queue_idx = 0;
-#define idx pt_update_queue_idx
-
-#if PT_UPDATE_DEBUG > 0
-page_update_debug_t update_debug_queue[QUEUE_SIZE] = {{0}};
-#undef queue_l1_entry_update
-#undef queue_l2_entry_update
-static void DEBUG_allow_pt_reads(void)
-{
-    pte_t *pte;
-    page_update_request_t update;
-    int i;
-    for ( i = idx-1; i >= 0; i-- )
-    {
-        pte = update_debug_queue[i].ptep;
-        if ( pte == NULL ) continue;
-        update_debug_queue[i].ptep = NULL;
-        update.ptr = phys_to_machine(__pa(pte));
-        update.val = update_debug_queue[i].pteval;
-        HYPERVISOR_pt_update(&update, 1);
-    }
-}
-static void DEBUG_disallow_pt_read(unsigned long pa)
-{
-    pte_t *pte;
-    pmd_t *pmd;
-    pgd_t *pgd;
-    unsigned long pteval;
-    /*
-     * We may fault because of an already outstanding update.
-     * That's okay -- it'll get fixed up in the fault handler.
-     */
-    page_update_request_t update;
-    unsigned long va = (unsigned long)__va(pa);
-    pgd = pgd_offset_k(va);
-    pmd = pmd_offset(pgd, va);
-    pte = pte_offset(pmd, va);
-    update.ptr = phys_to_machine(__pa(pte));
-    pteval = *(unsigned long *)pte;
-    update.val = pteval & ~_PAGE_PRESENT;
-    HYPERVISOR_pt_update(&update, 1);
-    update_debug_queue[idx].ptep = pte;
-    update_debug_queue[idx].pteval = pteval;
-}
-#endif
-
-#if PT_UPDATE_DEBUG > 1
-#undef queue_pt_switch
-#undef queue_tlb_flush
-#undef queue_invlpg
-#undef queue_pgd_pin
-#undef queue_pgd_unpin
-#undef queue_pte_pin
-#undef queue_pte_unpin
-#endif
-
-
-/*
- * MULTICALL_flush_page_update_queue:
- *   This is a version of the flush which queues as part of a multicall.
- */
-void MULTICALL_flush_page_update_queue(void)
-{
-    unsigned long flags;
-    spin_lock_irqsave(&update_lock, flags);
-    if ( idx != 0 ) 
-    {
-#if PT_UPDATE_DEBUG > 1
-        printk("Flushing %d entries from pt update queue\n", idx);
-#endif
-#if PT_UPDATE_DEBUG > 0
-        DEBUG_allow_pt_reads();
-#endif
-        queue_multicall2(__HYPERVISOR_pt_update, (unsigned long)update_queue, idx);
-        idx = 0;
-    }
-    spin_unlock_irqrestore(&update_lock, flags);
-}
-
-static inline void __flush_page_update_queue(void)
-{
-#if PT_UPDATE_DEBUG > 1
-    printk("Flushing %d entries from pt update queue\n", idx);
-#endif
-#if PT_UPDATE_DEBUG > 0
-    DEBUG_allow_pt_reads();
-#endif
-    HYPERVISOR_pt_update(update_queue, idx);
-    idx = 0;
-}
-
-void _flush_page_update_queue(void)
-{
-    unsigned long flags;
-    spin_lock_irqsave(&update_lock, flags);
-    if ( idx != 0 ) __flush_page_update_queue();
-    spin_unlock_irqrestore(&update_lock, flags);
-}
-
-static inline void increment_index(void)
-{
-    idx++;
-    if ( unlikely(idx == QUEUE_SIZE) ) __flush_page_update_queue();
-}
-
-void queue_l1_entry_update(unsigned long ptr, unsigned long val)
-{
-    unsigned long flags;
-    spin_lock_irqsave(&update_lock, flags);
-#if PT_UPDATE_DEBUG > 0
-    DEBUG_disallow_pt_read(ptr);
-#endif
-    update_queue[idx].ptr = phys_to_machine(ptr);
-    update_queue[idx].val = val;
-    increment_index();
-    spin_unlock_irqrestore(&update_lock, flags);
-}
-
-void queue_l2_entry_update(unsigned long ptr, unsigned long val)
-{
-    unsigned long flags;
-    spin_lock_irqsave(&update_lock, flags);
-    update_queue[idx].ptr = phys_to_machine(ptr);
-    update_queue[idx].val = val;
-    increment_index();
-    spin_unlock_irqrestore(&update_lock, flags);
-}
-
-void queue_pt_switch(unsigned long ptr)
-{
-    unsigned long flags;
-    spin_lock_irqsave(&update_lock, flags);
-    update_queue[idx].ptr  = phys_to_machine(ptr);
-    update_queue[idx].ptr |= PGREQ_EXTENDED_COMMAND;
-    update_queue[idx].val  = PGEXT_NEW_BASEPTR;
-    increment_index();
-    spin_unlock_irqrestore(&update_lock, flags);
-}
-
-void queue_tlb_flush(void)
-{
-    unsigned long flags;
-    spin_lock_irqsave(&update_lock, flags);
-    update_queue[idx].ptr  = PGREQ_EXTENDED_COMMAND;
-    update_queue[idx].val  = PGEXT_TLB_FLUSH;
-    increment_index();
-    spin_unlock_irqrestore(&update_lock, flags);
-}
-
-void queue_invlpg(unsigned long ptr)
-{
-    unsigned long flags;
-    spin_lock_irqsave(&update_lock, flags);
-    update_queue[idx].ptr  = PGREQ_EXTENDED_COMMAND;
-    update_queue[idx].val  = ptr & PAGE_MASK;
-    update_queue[idx].val |= PGEXT_INVLPG;
-    increment_index();
-    spin_unlock_irqrestore(&update_lock, flags);
-}
-
-void queue_pgd_pin(unsigned long ptr)
-{
-    unsigned long flags;
-    spin_lock_irqsave(&update_lock, flags);
-    update_queue[idx].ptr  = phys_to_machine(ptr);
-    update_queue[idx].ptr |= PGREQ_EXTENDED_COMMAND;
-    update_queue[idx].val  = PGEXT_PIN_L2_TABLE;
-    increment_index();
-    spin_unlock_irqrestore(&update_lock, flags);
-}
-
-void queue_pgd_unpin(unsigned long ptr)
-{
-    unsigned long flags;
-    spin_lock_irqsave(&update_lock, flags);
-    update_queue[idx].ptr  = phys_to_machine(ptr);
-    update_queue[idx].ptr |= PGREQ_EXTENDED_COMMAND;
-    update_queue[idx].val  = PGEXT_UNPIN_TABLE;
-    increment_index();
-    spin_unlock_irqrestore(&update_lock, flags);
-}
-
-void queue_pte_pin(unsigned long ptr)
-{
-    unsigned long flags;
-    spin_lock_irqsave(&update_lock, flags);
-    update_queue[idx].ptr  = phys_to_machine(ptr);
-    update_queue[idx].ptr |= PGREQ_EXTENDED_COMMAND;
-    update_queue[idx].val  = PGEXT_PIN_L1_TABLE;
-    increment_index();
-    spin_unlock_irqrestore(&update_lock, flags);
-}
-
-void queue_pte_unpin(unsigned long ptr)
-{
-    unsigned long flags;
-    spin_lock_irqsave(&update_lock, flags);
-    update_queue[idx].ptr  = phys_to_machine(ptr);
-    update_queue[idx].ptr |= PGREQ_EXTENDED_COMMAND;
-    update_queue[idx].val  = PGEXT_UNPIN_TABLE;
-    increment_index();
-    spin_unlock_irqrestore(&update_lock, flags);
-}
-
-void queue_set_ldt(unsigned long ptr, unsigned long len)
-{
-    unsigned long flags;
-    spin_lock_irqsave(&update_lock, flags);
-    update_queue[idx].ptr  = PGREQ_EXTENDED_COMMAND | ptr;
-    update_queue[idx].val  = PGEXT_SET_LDT | (len << PGEXT_CMD_SHIFT);
-    increment_index();
-    spin_unlock_irqrestore(&update_lock, flags);
-}
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/mm/init.c b/xenolinux-2.4.21-sparse/arch/xeno/mm/init.c
deleted file mode 100644 (file)
index acce1fb..0000000
+++ /dev/null
@@ -1,394 +0,0 @@
-/*
- *  linux/arch/i386/mm/init.c
- *
- *  Copyright (C) 1995  Linus Torvalds
- *
- *  Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
- */
-
-#include <linux/config.h>
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/ptrace.h>
-#include <linux/mman.h>
-#include <linux/mm.h>
-#include <linux/swap.h>
-#include <linux/smp.h>
-#include <linux/init.h>
-#ifdef CONFIG_BLK_DEV_INITRD
-#include <linux/blk.h>
-#endif
-#include <linux/highmem.h>
-#include <linux/pagemap.h>
-#include <linux/bootmem.h>
-#include <linux/slab.h>
-
-#include <asm/processor.h>
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/pgtable.h>
-#include <asm/pgalloc.h>
-#include <asm/dma.h>
-#include <asm/apic.h>
-#include <asm/tlb.h>
-
-mmu_gather_t mmu_gathers[NR_CPUS];
-unsigned long highstart_pfn, highend_pfn;
-static unsigned long totalram_pages;
-static unsigned long totalhigh_pages;
-
-int do_check_pgt_cache(int low, int high)
-{
-       int freed = 0;
-       if(pgtable_cache_size > high) {
-               do {
-            if (!QUICKLIST_EMPTY(pgd_quicklist)) {
-                               free_pgd_slow(get_pgd_fast());
-                               freed++;
-                       }
-            if (!QUICKLIST_EMPTY(pte_quicklist)) {
-                               pte_free_slow(pte_alloc_one_fast(NULL, 0));
-                               freed++;
-                       }
-               } while(pgtable_cache_size > low);
-       }
-       return freed;
-}
-
-void show_mem(void)
-{
-       int i, total = 0, reserved = 0;
-       int shared = 0, cached = 0;
-       int highmem = 0;
-
-       printk("Mem-info:\n");
-       show_free_areas();
-       printk("Free swap:       %6dkB\n",nr_swap_pages<<(PAGE_SHIFT-10));
-       i = max_mapnr;
-       while (i-- > 0) {
-               total++;
-               if (PageHighMem(mem_map+i))
-                       highmem++;
-               if (PageReserved(mem_map+i))
-                       reserved++;
-               else if (PageSwapCache(mem_map+i))
-                       cached++;
-               else if (page_count(mem_map+i))
-                       shared += page_count(mem_map+i) - 1;
-       }
-       printk("%d pages of RAM\n", total);
-       printk("%d pages of HIGHMEM\n",highmem);
-       printk("%d reserved pages\n",reserved);
-       printk("%d pages shared\n",shared);
-       printk("%d pages swap cached\n",cached);
-       printk("%ld pages in page table cache\n",pgtable_cache_size);
-       show_buffers();
-}
-
-/* References to section boundaries */
-
-extern char _text, _etext, _edata, __bss_start, _end;
-extern char __init_begin, __init_end;
-
-static inline void set_pte_phys (unsigned long vaddr,
-                       unsigned long phys, pgprot_t flags)
-{
-       pgprot_t prot;
-       pgd_t *pgd;
-       pmd_t *pmd;
-       pte_t *pte;
-
-    pgd = init_mm.pgd + __pgd_offset(vaddr);
-       if (pgd_none(*pgd)) {
-               printk("PAE BUG #00!\n");
-               return;
-       }
-       pmd = pmd_offset(pgd, vaddr);
-       if (pmd_none(*pmd)) {
-               printk("PAE BUG #01!\n");
-               return;
-       }
-       pte = pte_offset(pmd, vaddr);
-
-       if (pte_val(*pte))
-               pte_ERROR(*pte);
-
-       pgprot_val(prot) = pgprot_val(PAGE_KERNEL) | pgprot_val(flags);
-
-       /* We queue directly, avoiding hidden phys->machine translation. */
-       queue_l1_entry_update(__pa(pte), phys | pgprot_val(prot));
-
-       /*
-        * It's enough to flush this one mapping.
-        * (PGE mappings get flushed as well)
-        */
-       __flush_tlb_one(vaddr);
-}
-
-void __set_fixmap (enum fixed_addresses idx, unsigned long phys, 
-                   pgprot_t flags)
-{
-       unsigned long address = __fix_to_virt(idx);
-
-       if (idx >= __end_of_fixed_addresses) {
-               printk("Invalid __set_fixmap\n");
-               return;
-       }
-       set_pte_phys(address, phys, flags);
-}
-
-static void __init fixrange_init (unsigned long start, 
-                                  unsigned long end, pgd_t *pgd_base)
-{
-       pgd_t *pgd, *kpgd;
-       pmd_t *pmd, *kpmd;
-       pte_t *pte, *kpte;
-       int i, j;
-       unsigned long vaddr;
-
-       vaddr = start;
-       i = __pgd_offset(vaddr);
-       j = __pmd_offset(vaddr);
-       pgd = pgd_base + i;
-
-       for ( ; (i < PTRS_PER_PGD) && (vaddr != end); pgd++, i++) {
-#if CONFIG_X86_PAE
-               if (pgd_none(*pgd)) {
-                       pmd = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);
-                       set_pgd(pgd, __pgd(__pa(pmd) + 0x1));
-                       if (pmd != pmd_offset(pgd, 0))
-                               printk("PAE BUG #02!\n");
-               }
-               pmd = pmd_offset(pgd, vaddr);
-#else
-               pmd = (pmd_t *)pgd;
-#endif
-               for (; (j < PTRS_PER_PMD) && (vaddr != end); pmd++, j++) {
-                       if (pmd_none(*pmd)) {
-                               pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
-                               clear_page(pte);
-                               kpgd = pgd_offset_k((unsigned long)pte);
-                               kpmd = pmd_offset(kpgd, (unsigned long)pte);
-                               kpte = pte_offset(kpmd, (unsigned long)pte);
-                               queue_l1_entry_update(__pa(kpte),
-                                      (*(unsigned long *)kpte)&~_PAGE_RW);
-
-                               set_pmd(pmd, __pmd(_KERNPG_TABLE + __pa(pte)));
-
-                               // XXX Xen below reqd ?
-                               //if (pte != pte_offset(pmd, 0))
-                               //      BUG();
-                       }
-                       vaddr += PMD_SIZE;
-               }
-               j = 0;
-       }
-       
-       XENO_flush_page_update_queue();
-}
-
-
-static void __init zone_sizes_init(void)
-{
-       unsigned long zones_size[MAX_NR_ZONES] = {0, 0, 0};
-       unsigned int max_dma, high, low;
-
-       max_dma = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT;
-       low = max_low_pfn;
-       high = highend_pfn;
-
-       if (low < max_dma)
-               zones_size[ZONE_DMA] = low;
-       else {
-               zones_size[ZONE_DMA] = max_dma;
-               zones_size[ZONE_NORMAL] = low - max_dma;
-#ifdef CONFIG_HIGHMEM
-               zones_size[ZONE_HIGHMEM] = high - low;
-#endif
-       }
-       free_area_init(zones_size);
-}
-
-/*
- * paging_init() sets up the page tables - note that the first 8MB are
- * already mapped by head.S.
- *
- * This routines also unmaps the page at virtual kernel address 0, so
- * that we can trap those pesky NULL-reference errors in the kernel.
- */
-void __init paging_init(void)
-{
-       unsigned long vaddr;
-
-       zone_sizes_init();
-
-       /*
-        * Fixed mappings, only the page table structure has to be created -
-        * mappings will be set by set_fixmap():
-        */
-       vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK;
-       fixrange_init(vaddr, HYPERVISOR_VIRT_START, init_mm.pgd);
-
-       /* Cheesy: this can probably be moved to the blkdev driver. */
-       set_fixmap(FIX_BLKRING_BASE, start_info.blk_ring);
-
-#ifdef CONFIG_HIGHMEM
-#error
-       kmap_init();
-#endif
-}
-
-static inline int page_is_ram (unsigned long pagenr)
-{
-       return 1;
-}
-
-#ifdef CONFIG_HIGHMEM
-void __init one_highpage_init(struct page *page, int pfn, int bad_ppro)
-{
-       if (!page_is_ram(pfn)) {
-               SetPageReserved(page);
-               return;
-       }
-       
-       if (bad_ppro && page_kills_ppro(pfn)) {
-               SetPageReserved(page);
-               return;
-       }
-       
-       ClearPageReserved(page);
-       set_bit(PG_highmem, &page->flags);
-       atomic_set(&page->count, 1);
-       __free_page(page);
-       totalhigh_pages++;
-}
-#endif /* CONFIG_HIGHMEM */
-
-static void __init set_max_mapnr_init(void)
-{
-#ifdef CONFIG_HIGHMEM
-        highmem_start_page = mem_map + highstart_pfn;
-        max_mapnr = num_physpages = highend_pfn;
-        num_mappedpages = max_low_pfn;
-#else
-        max_mapnr = num_mappedpages = num_physpages = max_low_pfn;
-#endif
-}
-
-static int __init free_pages_init(void)
-{
-#ifdef CONFIG_HIGHMEM
-#error Where is this supposed to be initialised?
-        int bad_ppro;
-#endif
-       int reservedpages, pfn;
-
-       /* this will put all low memory onto the freelists */
-       totalram_pages += free_all_bootmem();
-
-       reservedpages = 0;
-       for (pfn = 0; pfn < max_low_pfn; pfn++) {
-               /*
-                * Only count reserved RAM pages
-                */
-               if (page_is_ram(pfn) && PageReserved(mem_map+pfn))
-                       reservedpages++;
-       }
-#ifdef CONFIG_HIGHMEM
-       for (pfn = highend_pfn-1; pfn >= highstart_pfn; pfn--)
-               one_highpage_init((struct page *) (mem_map + pfn), pfn, bad_ppro);
-       totalram_pages += totalhigh_pages;
-#endif
-       return reservedpages;
-}
-
-void __init mem_init(void)
-{
-       int codesize, reservedpages, datasize, initsize;
-
-       if (!mem_map)
-               BUG();
-       
-       set_max_mapnr_init();
-
-       high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);
-
-       /* clear the zero-page */
-       memset(empty_zero_page, 0, PAGE_SIZE);
-
-       reservedpages = free_pages_init();
-
-       codesize =  (unsigned long) &_etext - (unsigned long) &_text;
-       datasize =  (unsigned long) &_edata - (unsigned long) &_etext;
-       initsize =  (unsigned long) &__init_end - (unsigned long) &__init_begin;
-
-       printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, %dk reserved, %dk data, %dk init, %ldk highmem)\n",
-               (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
-               max_mapnr << (PAGE_SHIFT-10),
-               codesize >> 10,
-               reservedpages << (PAGE_SHIFT-10),
-               datasize >> 10,
-               initsize >> 10,
-               (unsigned long) (totalhigh_pages << (PAGE_SHIFT-10))
-              );
-
-    boot_cpu_data.wp_works_ok = 1;
-}
-
-void free_initmem(void)
-{
-       unsigned long addr;
-
-       addr = (unsigned long)(&__init_begin);
-       for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
-               ClearPageReserved(virt_to_page(addr));
-               set_page_count(virt_to_page(addr), 1);
-               free_page(addr);
-               totalram_pages++;
-       }
-       printk (KERN_INFO "Freeing unused kernel memory: %dk freed\n", (&__init_end - &__init_begin) >> 10);
-}
-
-#ifdef CONFIG_BLK_DEV_INITRD
-void free_initrd_mem(unsigned long start, unsigned long end)
-{
-       if (start < end)
-               printk (KERN_INFO "Freeing initrd memory: %ldk freed\n", (end - start) >> 10);
-       for (; start < end; start += PAGE_SIZE) {
-               ClearPageReserved(virt_to_page(start));
-               set_page_count(virt_to_page(start), 1);
-               free_page(start);
-               totalram_pages++;
-       }
-}
-#endif
-
-void si_meminfo(struct sysinfo *val)
-{
-       val->totalram = totalram_pages;
-       val->sharedram = 0;
-       val->freeram = nr_free_pages();
-       val->bufferram = atomic_read(&buffermem_pages);
-       val->totalhigh = totalhigh_pages;
-       val->freehigh = nr_free_highpages();
-       val->mem_unit = PAGE_SIZE;
-       return;
-}
-
-#if defined(CONFIG_X86_PAE)
-struct kmem_cache_s *pae_pgd_cachep;
-void __init pgtable_cache_init(void)
-{
-       /*
-        * PAE pgds must be 16-byte aligned:
-        */
-       pae_pgd_cachep = kmem_cache_create("pae_pgd", 32, 0,
-               SLAB_HWCACHE_ALIGN | SLAB_MUST_HWCACHE_ALIGN, NULL, NULL);
-       if (!pae_pgd_cachep)
-               panic("init_pae(): Cannot alloc pae_pgd SLAB cache");
-}
-#endif /* CONFIG_X86_PAE */
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/mm/ioremap.c b/xenolinux-2.4.21-sparse/arch/xeno/mm/ioremap.c
deleted file mode 100644 (file)
index d537956..0000000
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * arch/xeno/mm/ioremap.c
- *
- * Re-map IO memory to kernel address space so that we can access it.
- *
- * (C) Copyright 1995 1996 Linus Torvalds
- *
- * Modifications for Xenolinux (c) 2003 Keir Fraser
- */
-
-#include <linux/slab.h>
-#include <linux/mm.h>
-#include <linux/mman.h>
-#include <linux/vmalloc.h>
-#include <asm/io.h>
-#include <asm/pgalloc.h>
-#include <asm/uaccess.h>
-#include <asm/tlb.h>
-#include <asm/mmu.h>
-
-#if defined(CONFIG_XENO_PRIV)
-
-#define direct_set_pte(pteptr, pteval) \
-  queue_l1_entry_update(__pa(pteptr)|PGREQ_UNCHECKED_UPDATE, (pteval).pte_low)
-#define __direct_pte(x) ((pte_t) { (x) } )
-#define __direct_mk_pte(page_nr,pgprot) \
-  __direct_pte(((page_nr) << PAGE_SHIFT) | pgprot_val(pgprot))
-#define direct_mk_pte_phys(physpage, pgprot) \
-  __direct_mk_pte((physpage) >> PAGE_SHIFT, pgprot)
-
-
-static inline void direct_remap_area_pte(pte_t *pte, 
-                                         unsigned long address, 
-                                         unsigned long size,
-                                         unsigned long machine_addr, 
-                                         pgprot_t prot)
-{
-    unsigned long end;
-
-    address &= ~PMD_MASK;
-    end = address + size;
-    if (end > PMD_SIZE)
-        end = PMD_SIZE;
-    if (address >= end)
-        BUG();
-    do {
-        if (!pte_none(*pte)) {
-            printk("direct_remap_area_pte: page already exists\n");
-            BUG();
-        }
-        direct_set_pte(pte, pte_mkio(direct_mk_pte_phys(machine_addr, prot))); 
-        address += PAGE_SIZE;
-        machine_addr += PAGE_SIZE;
-        pte++;
-    } while (address && (address < end));
-}
-
-static inline int direct_remap_area_pmd(struct mm_struct *mm,
-                                        pmd_t *pmd, 
-                                        unsigned long address, 
-                                        unsigned long size,
-                                        unsigned long machine_addr,
-                                        pgprot_t prot)
-{
-    unsigned long end;
-
-    address &= ~PGDIR_MASK;
-    end = address + size;
-    if (end > PGDIR_SIZE)
-        end = PGDIR_SIZE;
-    machine_addr -= address;
-    if (address >= end)
-        BUG();
-    do {
-        pte_t * pte = pte_alloc(mm, pmd, address);
-        if (!pte)
-            return -ENOMEM;
-        direct_remap_area_pte(pte, address, end - address, 
-                              address + machine_addr, prot);
-        address = (address + PMD_SIZE) & PMD_MASK;
-        pmd++;
-    } while (address && (address < end));
-    return 0;
-}
-int direct_remap_area_pages(struct mm_struct *mm,
-                            unsigned long address, 
-                            unsigned long machine_addr,
-                            unsigned long size, 
-                            pgprot_t prot)
-{
-    int error = 0;
-    pgd_t * dir;
-    unsigned long end = address + size;
-
-    machine_addr -= address;
-    dir = pgd_offset(mm, address);
-    flush_cache_all();
-    if (address >= end)
-        BUG();
-    spin_lock(&mm->page_table_lock);
-    do {
-        pmd_t *pmd = pmd_alloc(mm, dir, address);
-        error = -ENOMEM;
-        if (!pmd)
-            break;
-        error = direct_remap_area_pmd(mm, pmd, address, end - address,
-                                      machine_addr + address, prot);
-        if (error)
-            break;
-        address = (address + PGDIR_SIZE) & PGDIR_MASK;
-        dir++;
-    } while (address && (address < end));
-    spin_unlock(&mm->page_table_lock);
-    flush_tlb_all();
-    return error;
-}
-
-#endif /* CONFIG_XENO_PRIV */
-
-
-/*
- * Remap an arbitrary machine address space into the kernel virtual
- * address space. Needed when a privileged instance of Xenolinux wants
- * to access space outside its world directly.
- *
- * NOTE! We need to allow non-page-aligned mappings too: we will obviously
- * have to convert them into an offset in a page-aligned mapping, but the
- * caller shouldn't need to know that small detail.
- */
-void * __ioremap(unsigned long machine_addr, 
-                 unsigned long size, 
-                 unsigned long flags)
-{
-#if defined(CONFIG_XENO_PRIV)
-    void * addr;
-    struct vm_struct * area;
-    unsigned long offset, last_addr;
-    pgprot_t prot;
-
-    /* Only privileged Xenolinux can make unchecked pagetable updates. */
-    if ( !(start_info.flags & SIF_PRIVILEGED) )
-        return NULL;
-
-    /* Don't allow wraparound or zero size */
-    last_addr = machine_addr + size - 1;
-    if (!size || last_addr < machine_addr)
-        return NULL;
-
-    /* Mappings have to be page-aligned */
-    offset = machine_addr & ~PAGE_MASK;
-    machine_addr &= PAGE_MASK;
-    size = PAGE_ALIGN(last_addr) - machine_addr;
-
-    /* Ok, go for it */
-    area = get_vm_area(size, VM_IOREMAP);
-    if (!area)
-        return NULL;
-    addr = area->addr;
-    prot = __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | 
-                    _PAGE_ACCESSED | flags);
-    if (direct_remap_area_pages(&init_mm, VMALLOC_VMADDR(addr), 
-                                machine_addr, size, prot)) {
-        vfree(addr);
-        return NULL;
-    }
-    return (void *) (offset + (char *)addr);
-#else
-    return NULL;
-#endif
-}
-
-void iounmap(void *addr)
-{
-    vfree((void *)((unsigned long)addr & PAGE_MASK));
-}
-
-/* implementation of boot time ioremap for purpose of provising access
-to the vga console for privileged domains. Unlike boot time ioremap on 
-other architectures, ours is permanent and not reclaimed when then vmalloc
-infrastructure is started */
-
-void __init *bt_ioremap(unsigned long machine_addr, unsigned long size)
-{
-        unsigned long offset, last_addr;
-        unsigned int nrpages;
-        enum fixed_addresses idx;
-
-        /* Don't allow wraparound or zero size */
-        last_addr = machine_addr + size - 1;
-        if (!size || last_addr < machine_addr)
-                return NULL;
-
-        /*
-         * Mappings have to be page-aligned
-         */
-        offset = machine_addr & ~PAGE_MASK;
-        machine_addr &= PAGE_MASK;
-        size = PAGE_ALIGN(last_addr) - machine_addr;
-
-        /*
-         * Mappings have to fit in the FIX_BTMAP area.
-         */
-        nrpages = size >> PAGE_SHIFT;
-        if (nrpages > NR_FIX_BTMAPS)
-                return NULL;
-
-        /*
-         * Ok, go for it..
-         */
-        idx = FIX_BTMAP_BEGIN;
-        while (nrpages > 0) {
-                set_fixmap(idx, machine_addr);
-                machine_addr += PAGE_SIZE;
-                --idx;
-                --nrpages;
-        }
-
-       flush_tlb_all();
-
-        return (void*) (offset + fix_to_virt(FIX_BTMAP_BEGIN));
-}
-
-
-#if 0 /* We don't support these functions. They shouldn't be required. */
-void __init bt_iounmap(void *addr, unsigned long size) {}
-#endif
diff --git a/xenolinux-2.4.21-sparse/arch/xeno/vmlinux.lds b/xenolinux-2.4.21-sparse/arch/xeno/vmlinux.lds
deleted file mode 100644 (file)
index 7c4c4f8..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-/* ld script to make i386 Linux kernel
- * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>;
- */
-OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
-OUTPUT_ARCH(i386)
-ENTRY(_start)
-SECTIONS
-{
-  . = 0xC0000000 + 0x000000;
-  _text = .;                   /* Text and read-only data */
-  .text : {
-       *(.text)
-       *(.fixup)
-       *(.gnu.warning)
-       } = 0x9090
-
-  _etext = .;                  /* End of text section */
-
-  .rodata : { *(.rodata) *(.rodata.*) }
-  .kstrtab : { *(.kstrtab) }
-
-  . = ALIGN(16);               /* Exception table */
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  __start___ksymtab = .;       /* Kernel symbol table */
-  __ksymtab : { *(__ksymtab) }
-  __stop___ksymtab = .;
-
-  .data : {                    /* Data */
-       *(.data)
-       CONSTRUCTORS
-       }
-
-  _edata = .;                  /* End of data section */
-
-  . = ALIGN(8192);             /* init_task */
-  .data.init_task : { *(.data.init_task) }
-
-  . = ALIGN(4096);             /* Init code and data */
-  __init_begin = .;
-  .text.init : { *(.text.init) }
-  .data.init : { *(.data.init) }
-  . = ALIGN(16);
-  __setup_start = .;
-  .setup.init : { *(.setup.init) }
-  __setup_end = .;
-  __initcall_start = .;
-  .initcall.init : { *(.initcall.init) }
-  __initcall_end = .;
-  . = ALIGN(4096);
-  __init_end = .;
-
-  . = ALIGN(4096);
-  .data.page_aligned : { *(.data.idt) }
-
-  . = ALIGN(32);
-  .data.cacheline_aligned : { *(.data.cacheline_aligned) }
-
-  __bss_start = .;             /* BSS */
-  .bss : {
-       *(.bss)
-       }
-  _end = . ;
-
-  /* Sections to be discarded */
-  /DISCARD/ : {
-       *(.text.exit)
-       *(.data.exit)
-       *(.exitcall.exit)
-       }
-
-  /* Stabs debugging sections.  */
-  .stab 0 : { *(.stab) }
-  .stabstr 0 : { *(.stabstr) }
-  .stab.excl 0 : { *(.stab.excl) }
-  .stab.exclstr 0 : { *(.stab.exclstr) }
-  .stab.index 0 : { *(.stab.index) }
-  .stab.indexstr 0 : { *(.stab.indexstr) }
-  .comment 0 : { *(.comment) }
-}
diff --git a/xenolinux-2.4.21-sparse/drivers/block/genhd.c b/xenolinux-2.4.21-sparse/drivers/block/genhd.c
deleted file mode 100644 (file)
index 403d52e..0000000
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- *  Code extracted from
- *  linux/kernel/hd.c
- *
- *  Copyright (C) 1991-1998  Linus Torvalds
- *
- *  devfs support - jj, rgooch, 980122
- *
- *  Moved partition checking code to fs/partitions* - Russell King
- *  (linux@arm.uk.linux.org)
- */
-
-/*
- * TODO:  rip out the remaining init crap from this file  --hch
- */
-
-#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/fs.h>
-#include <linux/genhd.h>
-#include <linux/kernel.h>
-#include <linux/blk.h>
-#include <linux/init.h>
-#include <linux/spinlock.h>
-#include <linux/seq_file.h>
-
-
-/*
- * Global kernel list of partitioning information.
- *
- * XXX: you should _never_ access this directly.
- *     the only reason this is exported is source compatiblity.
- */
-/*static*/ struct gendisk *gendisk_head;
-static struct gendisk *gendisk_array[MAX_BLKDEV];
-static rwlock_t gendisk_lock = RW_LOCK_UNLOCKED;
-
-EXPORT_SYMBOL(gendisk_head);
-
-
-/**
- * add_gendisk - add partitioning information to kernel list
- * @gp: per-device partitioning information
- *
- * This function registers the partitioning information in @gp
- * with the kernel.
- */
-void
-add_gendisk(struct gendisk *gp)
-{
-       struct gendisk *sgp;
-
-       write_lock(&gendisk_lock);
-
-       /*
-        *      In 2.5 this will go away. Fix the drivers who rely on
-        *      old behaviour.
-        */
-
-       for (sgp = gendisk_head; sgp; sgp = sgp->next)
-       {
-               if (sgp == gp)
-               {
-//                     printk(KERN_ERR "add_gendisk: device major %d is buggy and added a live gendisk!\n",
-//                             sgp->major)
-                       goto out;
-               }
-       }
-       gendisk_array[gp->major] = gp;
-       gp->next = gendisk_head;
-       gendisk_head = gp;
-out:
-       write_unlock(&gendisk_lock);
-}
-
-EXPORT_SYMBOL(add_gendisk);
-
-
-/**
- * del_gendisk - remove partitioning information from kernel list
- * @gp: per-device partitioning information
- *
- * This function unregisters the partitioning information in @gp
- * with the kernel.
- */
-void
-del_gendisk(struct gendisk *gp)
-{
-       struct gendisk **gpp;
-
-       write_lock(&gendisk_lock);
-       gendisk_array[gp->major] = NULL;
-       for (gpp = &gendisk_head; *gpp; gpp = &((*gpp)->next))
-               if (*gpp == gp)
-                       break;
-       if (*gpp)
-               *gpp = (*gpp)->next;
-       write_unlock(&gendisk_lock);
-}
-
-EXPORT_SYMBOL(del_gendisk);
-
-
-/**
- * get_gendisk - get partitioning information for a given device
- * @dev: device to get partitioning information for
- *
- * This function gets the structure containing partitioning
- * information for the given device @dev.
- */
-struct gendisk *
-get_gendisk(kdev_t dev)
-{
-       struct gendisk *gp = NULL;
-       int maj = MAJOR(dev);
-
-       read_lock(&gendisk_lock);
-       if ((gp = gendisk_array[maj]))
-               goto out;
-
-       /* This is needed for early 2.4 source compatiblity.  --hch */
-       for (gp = gendisk_head; gp; gp = gp->next)
-               if (gp->major == maj)
-                       break;
-out:
-       read_unlock(&gendisk_lock);
-       return gp;
-}
-
-EXPORT_SYMBOL(get_gendisk);
-
-
-/**
- * walk_gendisk - issue a command for every registered gendisk
- * @walk: user-specified callback
- * @data: opaque data for the callback
- *
- * This function walks through the gendisk chain and calls back
- * into @walk for every element.
- */
-int
-walk_gendisk(int (*walk)(struct gendisk *, void *), void *data)
-{
-       struct gendisk *gp;
-       int error = 0;
-
-       read_lock(&gendisk_lock);
-       for (gp = gendisk_head; gp; gp = gp->next)
-               if ((error = walk(gp, data)))
-                       break;
-       read_unlock(&gendisk_lock);
-
-       return error;
-}
-
-#ifdef CONFIG_PROC_FS
-/* iterator */
-static void *part_start(struct seq_file *s, loff_t *ppos)
-{
-       struct gendisk *gp;
-       loff_t pos = *ppos;
-
-       read_lock(&gendisk_lock);
-       for (gp = gendisk_head; gp; gp = gp->next)
-               if (!pos--)
-                       return gp;
-       return NULL;
-}
-
-static void *part_next(struct seq_file *s, void *v, loff_t *pos)
-{
-       ++*pos;
-       return ((struct gendisk *)v)->next;
-}
-
-static void part_stop(struct seq_file *s, void *v)
-{
-       read_unlock(&gendisk_lock);
-}
-
-static int part_show(struct seq_file *s, void *v)
-{
-       struct gendisk *gp = v;
-       char buf[64];
-       int n;
-
-       if (gp == gendisk_head) {
-               seq_puts(s, "major minor  #blocks  start_sect   nr_sects name"
-#ifdef CONFIG_BLK_STATS
-                           "     rio rmerge rsect ruse wio wmerge "
-                           "wsect wuse running use aveq"
-#endif
-                          "\n\n");
-       }
-
-       /* show the full disk and all non-0 size partitions of it */
-       for (n = 0; n < (gp->nr_real << gp->minor_shift); n++) {
-               if (gp->part[n].nr_sects) {
-#ifdef CONFIG_BLK_STATS
-                       struct hd_struct *hd = &gp->part[n];
-
-                       disk_round_stats(hd);
-                       seq_printf(s, "%4d  %4d %10d %10ld %s "
-                                     "%d %d %d %d %d %d %d %d %d %d %d\n",
-                                     gp->major, n, gp->sizes[n],
-                                     gp->part[n].start_sect,
-                                     gp->part[n].nr_sects,
-                                     disk_name(gp, n, buf),
-                                     hd->rd_ios, hd->rd_merges,
-#define MSEC(x) ((x) * 1000 / HZ)
-                                     hd->rd_sectors, MSEC(hd->rd_ticks),
-                                     hd->wr_ios, hd->wr_merges,
-                                     hd->wr_sectors, MSEC(hd->wr_ticks),
-                                     hd->ios_in_flight, MSEC(hd->io_ticks),
-                                     MSEC(hd->aveq));
-#else
-                       seq_printf(s, "%4d  %4d %10d %10ld %10ld %s\n",
-                                  gp->major, n, gp->sizes[n],
-                                  gp->part[n].start_sect,
-                                  gp->part[n].nr_sects,
-                                  disk_name(gp, n, buf));
-#endif /* CONFIG_BLK_STATS */
-               }
-       }
-
-       return 0;
-}
-
-struct seq_operations partitions_op = {
-       .start          = part_start,
-       .next           = part_next,
-       .stop           = part_stop,
-       .show           = part_show,
-};
-#endif
-
-extern int blk_dev_init(void);
-extern int net_dev_init(void);
-extern void console_map_init(void);
-extern int atmdev_init(void);
-
-int __init device_init(void)
-{
-       blk_dev_init();
-       sti();
-#ifdef CONFIG_NET
-       net_dev_init();
-#endif
-#ifdef CONFIG_ATM
-       (void) atmdev_init();
-#endif
-#ifdef CONFIG_VT
-       console_map_init();
-#endif
-       return 0;
-}
-
-__initcall(device_init);
diff --git a/xenolinux-2.4.21-sparse/drivers/block/ll_rw_blk.c b/xenolinux-2.4.21-sparse/drivers/block/ll_rw_blk.c
deleted file mode 100644 (file)
index 411b6de..0000000
+++ /dev/null
@@ -1,1529 +0,0 @@
-/*
- *  linux/drivers/block/ll_rw_blk.c
- *
- * Copyright (C) 1991, 1992 Linus Torvalds
- * Copyright (C) 1994,      Karl Keyte: Added support for disk statistics
- * Elevator latency, (C) 2000  Andrea Arcangeli <andrea@suse.de> SuSE
- * Queue request tables / lock, selectable elevator, Jens Axboe <axboe@suse.de>
- * kernel-doc documentation started by NeilBrown <neilb@cse.unsw.edu.au> -  July2000
- */
-
-/*
- * This handles all read/write requests to block devices
- */
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/kernel_stat.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/config.h>
-#include <linux/locks.h>
-#include <linux/mm.h>
-#include <linux/swap.h>
-#include <linux/init.h>
-#include <linux/smp_lock.h>
-#include <linux/completion.h>
-#include <linux/bootmem.h>
-
-#include <asm/system.h>
-#include <asm/io.h>
-#include <linux/blk.h>
-#include <linux/highmem.h>
-#include <linux/slab.h>
-#include <linux/module.h>
-
-/*
- * MAC Floppy IWM hooks
- */
-
-#ifdef CONFIG_MAC_FLOPPY_IWM
-extern int mac_floppy_init(void);
-#endif
-
-/*
- * For the allocated request tables
- */
-static kmem_cache_t *request_cachep;
-
-/*
- * The "disk" task queue is used to start the actual requests
- * after a plug
- */
-DECLARE_TASK_QUEUE(tq_disk);
-
-/*
- * Protect the request list against multiple users..
- *
- * With this spinlock the Linux block IO subsystem is 100% SMP threaded
- * from the IRQ event side, and almost 100% SMP threaded from the syscall
- * side (we still have protect against block device array operations, and
- * the do_request() side is casually still unsafe. The kernel lock protects
- * this part currently.).
- *
- * there is a fair chance that things will work just OK if these functions
- * are called with no global kernel lock held ...
- */
-spinlock_t io_request_lock = SPIN_LOCK_UNLOCKED;
-
-/* This specifies how many sectors to read ahead on the disk. */
-
-int read_ahead[MAX_BLKDEV];
-
-/* blk_dev_struct is:
- *     *request_fn
- *     *current_request
- */
-struct blk_dev_struct blk_dev[MAX_BLKDEV]; /* initialized by blk_dev_init() */
-
-/*
- * blk_size contains the size of all block-devices in units of 1024 byte
- * sectors:
- *
- * blk_size[MAJOR][MINOR]
- *
- * if (!blk_size[MAJOR]) then no minor size checking is done.
- */
-int * blk_size[MAX_BLKDEV];
-
-/*
- * blksize_size contains the size of all block-devices:
- *
- * blksize_size[MAJOR][MINOR]
- *
- * if (!blksize_size[MAJOR]) then 1024 bytes is assumed.
- */
-int * blksize_size[MAX_BLKDEV];
-
-/*
- * hardsect_size contains the size of the hardware sector of a device.
- *
- * hardsect_size[MAJOR][MINOR]
- *
- * if (!hardsect_size[MAJOR])
- *             then 512 bytes is assumed.
- * else
- *             sector_size is hardsect_size[MAJOR][MINOR]
- * This is currently set by some scsi devices and read by the msdos fs driver.
- * Other uses may appear later.
- */
-int * hardsect_size[MAX_BLKDEV];
-
-/*
- * The following tunes the read-ahead algorithm in mm/filemap.c
- */
-int * max_readahead[MAX_BLKDEV];
-
-/*
- * Max number of sectors per request
- */
-int * max_sectors[MAX_BLKDEV];
-
-unsigned long blk_max_low_pfn, blk_max_pfn;
-int blk_nohighio = 0;
-
-static inline int get_max_sectors(kdev_t dev)
-{
-       if (!max_sectors[MAJOR(dev)])
-               return MAX_SECTORS;
-       return max_sectors[MAJOR(dev)][MINOR(dev)];
-}
-
-inline request_queue_t *blk_get_queue(kdev_t dev)
-{
-       struct blk_dev_struct *bdev = blk_dev + MAJOR(dev);
-
-       if (bdev->queue)
-               return bdev->queue(dev);
-       else
-               return &blk_dev[MAJOR(dev)].request_queue;
-}
-
-static int __blk_cleanup_queue(struct request_list *list)
-{
-       struct list_head *head = &list->free;
-       struct request *rq;
-       int i = 0;
-
-       while (!list_empty(head)) {
-               rq = list_entry(head->next, struct request, queue);
-               list_del(&rq->queue);
-               kmem_cache_free(request_cachep, rq);
-               i++;
-       };
-
-       if (i != list->count)
-               printk("request list leak!\n");
-
-       list->count = 0;
-       return i;
-}
-
-/**
- * blk_cleanup_queue: - release a &request_queue_t when it is no longer needed
- * @q:    the request queue to be released
- *
- * Description:
- *     blk_cleanup_queue is the pair to blk_init_queue().  It should
- *     be called when a request queue is being released; typically
- *     when a block device is being de-registered.  Currently, its
- *     primary task it to free all the &struct request structures that
- *     were allocated to the queue.
- * Caveat: 
- *     Hopefully the low level driver will have finished any
- *     outstanding requests first...
- **/
-void blk_cleanup_queue(request_queue_t * q)
-{
-       int count = q->nr_requests;
-
-       count -= __blk_cleanup_queue(&q->rq[READ]);
-       count -= __blk_cleanup_queue(&q->rq[WRITE]);
-
-       if (count)
-               printk("blk_cleanup_queue: leaked requests (%d)\n", count);
-
-       memset(q, 0, sizeof(*q));
-}
-
-/**
- * blk_queue_headactive - indicate whether head of request queue may be active
- * @q:       The queue which this applies to.
- * @active:  A flag indication where the head of the queue is active.
- *
- * Description:
- *    The driver for a block device may choose to leave the currently active
- *    request on the request queue, removing it only when it has completed.
- *    The queue handling routines assume this by default for safety reasons
- *    and will not involve the head of the request queue in any merging or
- *    reordering of requests when the queue is unplugged (and thus may be
- *    working on this particular request).
- *
- *    If a driver removes requests from the queue before processing them, then
- *    it may indicate that it does so, there by allowing the head of the queue
- *    to be involved in merging and reordering.  This is done be calling
- *    blk_queue_headactive() with an @active flag of %0.
- *
- *    If a driver processes several requests at once, it must remove them (or
- *    at least all but one of them) from the request queue.
- *
- *    When a queue is plugged the head will be assumed to be inactive.
- **/
-void blk_queue_headactive(request_queue_t * q, int active)
-{
-       q->head_active = active;
-}
-
-/**
- * blk_queue_make_request - define an alternate make_request function for a device
- * @q:  the request queue for the device to be affected
- * @mfn: the alternate make_request function
- *
- * Description:
- *    The normal way for &struct buffer_heads to be passed to a device
- *    driver is for them to be collected into requests on a request
- *    queue, and then to allow the device driver to select requests
- *    off that queue when it is ready.  This works well for many block
- *    devices. However some block devices (typically virtual devices
- *    such as md or lvm) do not benefit from the processing on the
- *    request queue, and are served best by having the requests passed
- *    directly to them.  This can be achieved by providing a function
- *    to blk_queue_make_request().
- *
- * Caveat:
- *    The driver that does this *must* be able to deal appropriately
- *    with buffers in "highmemory", either by calling bh_kmap() to get
- *    a kernel mapping, to by calling create_bounce() to create a
- *    buffer in normal memory.
- **/
-
-void blk_queue_make_request(request_queue_t * q, make_request_fn * mfn)
-{
-       q->make_request_fn = mfn;
-}
-
-/**
- * blk_queue_bounce_limit - set bounce buffer limit for queue
- * @q:  the request queue for the device
- * @dma_addr:   bus address limit
- *
- * Description:
- *    Different hardware can have different requirements as to what pages
- *    it can do I/O directly to. A low level driver can call
- *    blk_queue_bounce_limit to have lower memory pages allocated as bounce
- *    buffers for doing I/O to pages residing above @page. By default
- *    the block layer sets this to the highest numbered "low" memory page.
- **/
-void blk_queue_bounce_limit(request_queue_t *q, u64 dma_addr)
-{
-       unsigned long bounce_pfn = dma_addr >> PAGE_SHIFT;
-       unsigned long mb = dma_addr >> 20;
-       static request_queue_t *old_q;
-
-       /*
-        * keep this for debugging for now...
-        */
-       if (dma_addr != BLK_BOUNCE_HIGH && q != old_q) {
-               old_q = q;
-               printk("blk: queue %p, ", q);
-               if (dma_addr == BLK_BOUNCE_ANY)
-                       printk("no I/O memory limit\n");
-               else
-                       printk("I/O limit %luMb (mask 0x%Lx)\n", mb,
-                              (long long) dma_addr);
-       }
-
-       q->bounce_pfn = bounce_pfn;
-}
-
-
-/*
- * can we merge the two segments, or do we need to start a new one?
- */
-inline int blk_seg_merge_ok(struct buffer_head *bh, struct buffer_head *nxt)
-{
-       /*
-        * if bh and nxt are contigous and don't cross a 4g boundary, it's ok
-        */
-       if (BH_CONTIG(bh, nxt) && BH_PHYS_4G(bh, nxt))
-               return 1;
-
-       return 0;
-}
-
-static inline int ll_new_segment(request_queue_t *q, struct request *req, int max_segments)
-{
-       if (req->nr_segments < max_segments) {
-               req->nr_segments++;
-               return 1;
-       }
-       return 0;
-}
-
-static int ll_back_merge_fn(request_queue_t *q, struct request *req, 
-                           struct buffer_head *bh, int max_segments)
-{
-       if (blk_seg_merge_ok(req->bhtail, bh))
-               return 1;
-
-       return ll_new_segment(q, req, max_segments);
-}
-
-static int ll_front_merge_fn(request_queue_t *q, struct request *req, 
-                            struct buffer_head *bh, int max_segments)
-{
-       if (blk_seg_merge_ok(bh, req->bh))
-               return 1;
-
-       return ll_new_segment(q, req, max_segments);
-}
-
-static int ll_merge_requests_fn(request_queue_t *q, struct request *req,
-                               struct request *next, int max_segments)
-{
-       int total_segments = req->nr_segments + next->nr_segments;
-
-       if (blk_seg_merge_ok(req->bhtail, next->bh))
-               total_segments--;
-
-       if (total_segments > max_segments)
-               return 0;
-
-       req->nr_segments = total_segments;
-       return 1;
-}
-
-/*
- * "plug" the device if there are no outstanding requests: this will
- * force the transfer to start only after we have put all the requests
- * on the list.
- *
- * This is called with interrupts off and no requests on the queue.
- * (and with the request spinlock acquired)
- */
-static void generic_plug_device(request_queue_t *q, kdev_t dev)
-{
-       /*
-        * no need to replug device
-        */
-       if (!list_empty(&q->queue_head) || q->plugged)
-               return;
-
-       q->plugged = 1;
-       queue_task(&q->plug_tq, &tq_disk);
-}
-
-/*
- * remove the plug and let it rip..
- */
-static inline void __generic_unplug_device(request_queue_t *q)
-{
-       if (q->plugged) {
-               q->plugged = 0;
-               if (!list_empty(&q->queue_head))
-                       q->request_fn(q);
-       }
-}
-
-void generic_unplug_device(void *data)
-{
-       request_queue_t *q = (request_queue_t *) data;
-       unsigned long flags;
-
-       spin_lock_irqsave(&io_request_lock, flags);
-       __generic_unplug_device(q);
-       spin_unlock_irqrestore(&io_request_lock, flags);
-}
-
-/** blk_grow_request_list
- *  @q: The &request_queue_t
- *  @nr_requests: how many requests are desired
- *
- * More free requests are added to the queue's free lists, bringing
- * the total number of requests to @nr_requests.
- *
- * The requests are added equally to the request queue's read
- * and write freelists.
- *
- * This function can sleep.
- *
- * Returns the (new) number of requests which the queue has available.
- */
-int blk_grow_request_list(request_queue_t *q, int nr_requests)
-{
-       unsigned long flags;
-       /* Several broken drivers assume that this function doesn't sleep,
-        * this causes system hangs during boot.
-        * As a temporary fix, make the function non-blocking.
-        */
-       spin_lock_irqsave(&io_request_lock, flags);
-       while (q->nr_requests < nr_requests) {
-               struct request *rq;
-               int rw;
-
-               rq = kmem_cache_alloc(request_cachep, SLAB_ATOMIC);
-               if (rq == NULL)
-                       break;
-               memset(rq, 0, sizeof(*rq));
-               rq->rq_status = RQ_INACTIVE;
-               rw = q->nr_requests & 1;
-               list_add(&rq->queue, &q->rq[rw].free);
-               q->rq[rw].count++;
-               q->nr_requests++;
-       }
-       q->batch_requests = q->nr_requests / 4;
-       if (q->batch_requests > 32)
-               q->batch_requests = 32;
-       spin_unlock_irqrestore(&io_request_lock, flags);
-       return q->nr_requests;
-}
-
-static void blk_init_free_list(request_queue_t *q)
-{
-       struct sysinfo si;
-       int megs;               /* Total memory, in megabytes */
-       int nr_requests;
-
-       INIT_LIST_HEAD(&q->rq[READ].free);
-       INIT_LIST_HEAD(&q->rq[WRITE].free);
-       q->rq[READ].count = 0;
-       q->rq[WRITE].count = 0;
-       q->nr_requests = 0;
-
-       si_meminfo(&si);
-       megs = si.totalram >> (20 - PAGE_SHIFT);
-       nr_requests = 128;
-       if (megs < 32)
-               nr_requests /= 2;
-       blk_grow_request_list(q, nr_requests);
-
-       init_waitqueue_head(&q->wait_for_requests[0]);
-       init_waitqueue_head(&q->wait_for_requests[1]);
-       spin_lock_init(&q->queue_lock);
-}
-
-static int __make_request(request_queue_t * q, int rw, struct buffer_head * bh);
-
-/**
- * blk_init_queue  - prepare a request queue for use with a block device
- * @q:    The &request_queue_t to be initialised
- * @rfn:  The function to be called to process requests that have been
- *        placed on the queue.
- *
- * Description:
- *    If a block device wishes to use the standard request handling procedures,
- *    which sorts requests and coalesces adjacent requests, then it must
- *    call blk_init_queue().  The function @rfn will be called when there
- *    are requests on the queue that need to be processed.  If the device
- *    supports plugging, then @rfn may not be called immediately when requests
- *    are available on the queue, but may be called at some time later instead.
- *    Plugged queues are generally unplugged when a buffer belonging to one
- *    of the requests on the queue is needed, or due to memory pressure.
- *
- *    @rfn is not required, or even expected, to remove all requests off the
- *    queue, but only as many as it can handle at a time.  If it does leave
- *    requests on the queue, it is responsible for arranging that the requests
- *    get dealt with eventually.
- *
- *    A global spin lock $io_request_lock must be held while manipulating the
- *    requests on the request queue.
- *
- *    The request on the head of the queue is by default assumed to be
- *    potentially active, and it is not considered for re-ordering or merging
- *    whenever the given queue is unplugged. This behaviour can be changed with
- *    blk_queue_headactive().
- *
- * Note:
- *    blk_init_queue() must be paired with a blk_cleanup_queue() call
- *    when the block device is deactivated (such as at module unload).
- **/
-void blk_init_queue(request_queue_t * q, request_fn_proc * rfn)
-{
-       INIT_LIST_HEAD(&q->queue_head);
-       elevator_init(&q->elevator, ELEVATOR_LINUS);
-       blk_init_free_list(q);
-       q->request_fn           = rfn;
-       q->back_merge_fn        = ll_back_merge_fn;
-       q->front_merge_fn       = ll_front_merge_fn;
-       q->merge_requests_fn    = ll_merge_requests_fn;
-       q->make_request_fn      = __make_request;
-       q->plug_tq.sync         = 0;
-       q->plug_tq.routine      = &generic_unplug_device;
-       q->plug_tq.data         = q;
-       q->plugged              = 0;
-       /*
-        * These booleans describe the queue properties.  We set the
-        * default (and most common) values here.  Other drivers can
-        * use the appropriate functions to alter the queue properties.
-        * as appropriate.
-        */
-       q->plug_device_fn       = generic_plug_device;
-       q->head_active          = 1;
-
-       blk_queue_bounce_limit(q, BLK_BOUNCE_HIGH);
-}
-
-#define blkdev_free_rq(list) list_entry((list)->next, struct request, queue);
-/*
- * Get a free request. io_request_lock must be held and interrupts
- * disabled on the way in.  Returns NULL if there are no free requests.
- */
-static struct request *get_request(request_queue_t *q, int rw)
-{
-       struct request *rq = NULL;
-       struct request_list *rl = q->rq + rw;
-
-       if (!list_empty(&rl->free)) {
-               rq = blkdev_free_rq(&rl->free);
-               list_del(&rq->queue);
-               rl->count--;
-               rq->rq_status = RQ_ACTIVE;
-               rq->cmd = rw;
-               rq->special = NULL;
-               rq->q = q;
-       }
-
-       return rq;
-}
-
-/*
- * Here's the request allocation design:
- *
- * 1: Blocking on request exhaustion is a key part of I/O throttling.
- * 
- * 2: We want to be `fair' to all requesters.  We must avoid starvation, and
- *    attempt to ensure that all requesters sleep for a similar duration.  Hence
- *    no stealing requests when there are other processes waiting.
- * 
- * 3: We also wish to support `batching' of requests.  So when a process is
- *    woken, we want to allow it to allocate a decent number of requests
- *    before it blocks again, so they can be nicely merged (this only really
- *    matters if the process happens to be adding requests near the head of
- *    the queue).
- * 
- * 4: We want to avoid scheduling storms.  This isn't really important, because
- *    the system will be I/O bound anyway.  But it's easy.
- * 
- *    There is tension between requirements 2 and 3.  Once a task has woken,
- *    we don't want to allow it to sleep as soon as it takes its second request.
- *    But we don't want currently-running tasks to steal all the requests
- *    from the sleepers.  We handle this with wakeup hysteresis around
- *    0 .. batch_requests and with the assumption that request taking is much,
- *    much faster than request freeing.
- * 
- * So here's what we do:
- * 
- *    a) A READA requester fails if free_requests < batch_requests
- * 
- *       We don't want READA requests to prevent sleepers from ever
- *       waking.  Note that READA is used extremely rarely - a few
- *       filesystems use it for directory readahead.
- * 
- *  When a process wants a new request:
- * 
- *    b) If free_requests == 0, the requester sleeps in FIFO manner.
- * 
- *    b) If 0 <  free_requests < batch_requests and there are waiters,
- *       we still take a request non-blockingly.  This provides batching.
- *
- *    c) If free_requests >= batch_requests, the caller is immediately
- *       granted a new request.
- * 
- *  When a request is released:
- * 
- *    d) If free_requests < batch_requests, do nothing.
- * 
- *    f) If free_requests >= batch_requests, wake up a single waiter.
- * 
- *   The net effect is that when a process is woken at the batch_requests level,
- *   it will be able to take approximately (batch_requests) requests before
- *   blocking again (at the tail of the queue).
- * 
- *   This all assumes that the rate of taking requests is much, much higher
- *   than the rate of releasing them.  Which is very true.
- *
- * -akpm, Feb 2002.
- */
-
-static struct request *__get_request_wait(request_queue_t *q, int rw)
-{
-       register struct request *rq;
-       DECLARE_WAITQUEUE(wait, current);
-
-       add_wait_queue(&q->wait_for_requests[rw], &wait);
-       do {
-               set_current_state(TASK_UNINTERRUPTIBLE);
-               generic_unplug_device(q);
-               if (q->rq[rw].count == 0)
-                       schedule();
-               spin_lock_irq(&io_request_lock);
-               rq = get_request(q, rw);
-               spin_unlock_irq(&io_request_lock);
-       } while (rq == NULL);
-       remove_wait_queue(&q->wait_for_requests[rw], &wait);
-       current->state = TASK_RUNNING;
-       return rq;
-}
-
-/* RO fail safe mechanism */
-
-static long ro_bits[MAX_BLKDEV][8];
-
-int is_read_only(kdev_t dev)
-{
-       int minor,major;
-
-       major = MAJOR(dev);
-       minor = MINOR(dev);
-       if (major < 0 || major >= MAX_BLKDEV) return 0;
-       return ro_bits[major][minor >> 5] & (1 << (minor & 31));
-}
-
-void set_device_ro(kdev_t dev,int flag)
-{
-       int minor,major;
-
-       major = MAJOR(dev);
-       minor = MINOR(dev);
-       if (major < 0 || major >= MAX_BLKDEV) return;
-       if (flag) ro_bits[major][minor >> 5] |= 1 << (minor & 31);
-       else ro_bits[major][minor >> 5] &= ~(1 << (minor & 31));
-}
-
-inline void drive_stat_acct (kdev_t dev, int rw,
-                               unsigned long nr_sectors, int new_io)
-{
-       unsigned int major = MAJOR(dev);
-       unsigned int index;
-
-       index = disk_index(dev);
-       if ((index >= DK_MAX_DISK) || (major >= DK_MAX_MAJOR))
-               return;
-
-       kstat.dk_drive[major][index] += new_io;
-       if (rw == READ) {
-               kstat.dk_drive_rio[major][index] += new_io;
-               kstat.dk_drive_rblk[major][index] += nr_sectors;
-       } else if (rw == WRITE) {
-               kstat.dk_drive_wio[major][index] += new_io;
-               kstat.dk_drive_wblk[major][index] += nr_sectors;
-       } else
-               printk(KERN_ERR "drive_stat_acct: cmd not R/W?\n");
-}
-
-#ifdef CONFIG_BLK_STATS
-/*
- * Return up to two hd_structs on which to do IO accounting for a given
- * request.
- *
- * On a partitioned device, we want to account both against the partition
- * and against the whole disk.
- */
-static void locate_hd_struct(struct request *req, 
-                            struct hd_struct **hd1,
-                            struct hd_struct **hd2)
-{
-       struct gendisk *gd;
-
-       *hd1 = NULL;
-       *hd2 = NULL;
-       
-       gd = get_gendisk(req->rq_dev);
-       if (gd && gd->part) {
-               /* Mask out the partition bits: account for the entire disk */
-               int devnr = MINOR(req->rq_dev) >> gd->minor_shift;
-               int whole_minor = devnr << gd->minor_shift;
-
-               *hd1 = &gd->part[whole_minor];
-               if (whole_minor != MINOR(req->rq_dev))
-                       *hd2= &gd->part[MINOR(req->rq_dev)];
-       }
-}
-
-/*
- * Round off the performance stats on an hd_struct.
- *
- * The average IO queue length and utilisation statistics are maintained
- * by observing the current state of the queue length and the amount of
- * time it has been in this state for.
- * Normally, that accounting is done on IO completion, but that can result
- * in more than a second's worth of IO being accounted for within any one
- * second, leading to >100% utilisation.  To deal with that, we do a
- * round-off before returning the results when reading /proc/partitions,
- * accounting immediately for all queue usage up to the current jiffies and
- * restarting the counters again.
- */
-void disk_round_stats(struct hd_struct *hd)
-{
-       unsigned long now = jiffies;
-       
-       hd->aveq += (hd->ios_in_flight * (jiffies - hd->last_queue_change));
-       hd->last_queue_change = now;
-
-       if (hd->ios_in_flight)
-               hd->io_ticks += (now - hd->last_idle_time);
-       hd->last_idle_time = now;       
-}
-
-static inline void down_ios(struct hd_struct *hd)
-{
-       disk_round_stats(hd);   
-       --hd->ios_in_flight;
-}
-
-static inline void up_ios(struct hd_struct *hd)
-{
-       disk_round_stats(hd);
-       ++hd->ios_in_flight;
-}
-
-static void account_io_start(struct hd_struct *hd, struct request *req,
-                            int merge, int sectors)
-{
-       switch (req->cmd) {
-       case READ:
-               if (merge)
-                       hd->rd_merges++;
-               hd->rd_sectors += sectors;
-               break;
-       case WRITE:
-               if (merge)
-                       hd->wr_merges++;
-               hd->wr_sectors += sectors;
-               break;
-       }
-       if (!merge)
-               up_ios(hd);
-}
-
-static void account_io_end(struct hd_struct *hd, struct request *req)
-{
-       unsigned long duration = jiffies - req->start_time;
-       switch (req->cmd) {
-       case READ:
-               hd->rd_ticks += duration;
-               hd->rd_ios++;
-               break;
-       case WRITE:
-               hd->wr_ticks += duration;
-               hd->wr_ios++;
-               break;
-       }
-       down_ios(hd);
-}
-
-void req_new_io(struct request *req, int merge, int sectors)
-{
-       struct hd_struct *hd1, *hd2;
-
-       locate_hd_struct(req, &hd1, &hd2);
-       if (hd1)
-               account_io_start(hd1, req, merge, sectors);
-       if (hd2)
-               account_io_start(hd2, req, merge, sectors);
-}
-
-void req_merged_io(struct request *req)
-{
-       struct hd_struct *hd1, *hd2;
-
-       locate_hd_struct(req, &hd1, &hd2);
-       if (hd1)
-               down_ios(hd1);
-       if (hd2)        
-               down_ios(hd2);
-}
-
-void req_finished_io(struct request *req)
-{
-       struct hd_struct *hd1, *hd2;
-
-       locate_hd_struct(req, &hd1, &hd2);
-       if (hd1)
-               account_io_end(hd1, req);
-       if (hd2)        
-               account_io_end(hd2, req);
-}
-EXPORT_SYMBOL(req_finished_io);
-#endif /* CONFIG_BLK_STATS */
-
-/*
- * add-request adds a request to the linked list.
- * io_request_lock is held and interrupts disabled, as we muck with the
- * request queue list.
- *
- * By this point, req->cmd is always either READ/WRITE, never READA,
- * which is important for drive_stat_acct() above.
- */
-static inline void add_request(request_queue_t * q, struct request * req,
-                              struct list_head *insert_here)
-{
-       drive_stat_acct(req->rq_dev, req->cmd, req->nr_sectors, 1);
-
-       if (!q->plugged && q->head_active && insert_here == &q->queue_head) {
-               spin_unlock_irq(&io_request_lock);
-               printk("list_empty(&q->queue_head) is %d\n", 
-                      list_empty(&q->queue_head)); 
-               BUG();
-       }
-
-       /*
-        * elevator indicated where it wants this request to be
-        * inserted at elevator_merge time
-        */
-       list_add(&req->queue, insert_here);
-}
-
-/*
- * Must be called with io_request_lock held and interrupts disabled
- */
-void blkdev_release_request(struct request *req)
-{
-       request_queue_t *q = req->q;
-       int rw = req->cmd;
-
-       req->rq_status = RQ_INACTIVE;
-       req->q = NULL;
-
-       /*
-        * Request may not have originated from ll_rw_blk. if not,
-        * assume it has free buffers and check waiters
-        */
-       if (q) {
-               list_add(&req->queue, &q->rq[rw].free);
-               if (++q->rq[rw].count >= q->batch_requests)
-                       wake_up(&q->wait_for_requests[rw]);
-       }
-}
-
-/*
- * Has to be called with the request spinlock acquired
- */
-static void attempt_merge(request_queue_t * q,
-                         struct request *req,
-                         int max_sectors,
-                         int max_segments)
-{
-       struct request *next;
-  
-       next = blkdev_next_request(req);
-       if (req->sector + req->nr_sectors != next->sector)
-               return;
-       if (req->cmd != next->cmd
-           || req->rq_dev != next->rq_dev
-           || req->nr_sectors + next->nr_sectors > max_sectors
-           || next->waiting)
-               return;
-       /*
-        * If we are not allowed to merge these requests, then
-        * return.  If we are allowed to merge, then the count
-        * will have been updated to the appropriate number,
-        * and we shouldn't do it here too.
-        */
-       if (!q->merge_requests_fn(q, req, next, max_segments))
-               return;
-
-       q->elevator.elevator_merge_req_fn(req, next);
-       req->bhtail->b_reqnext = next->bh;
-       req->bhtail = next->bhtail;
-       req->nr_sectors = req->hard_nr_sectors += next->hard_nr_sectors;
-       list_del(&next->queue);
-
-       /* One last thing: we have removed a request, so we now have one
-          less expected IO to complete for accounting purposes. */
-       req_merged_io(req);
-
-       blkdev_release_request(next);
-}
-
-static inline void attempt_back_merge(request_queue_t * q,
-                                     struct request *req,
-                                     int max_sectors,
-                                     int max_segments)
-{
-       if (&req->queue == q->queue_head.prev)
-               return;
-       attempt_merge(q, req, max_sectors, max_segments);
-}
-
-static inline void attempt_front_merge(request_queue_t * q,
-                                      struct list_head * head,
-                                      struct request *req,
-                                      int max_sectors,
-                                      int max_segments)
-{
-       struct list_head * prev;
-
-       prev = req->queue.prev;
-       if (head == prev)
-               return;
-       attempt_merge(q, blkdev_entry_to_request(prev), max_sectors, max_segments);
-}
-
-static int __make_request(request_queue_t * q, int rw,
-                                 struct buffer_head * bh)
-{
-       unsigned int sector, count;
-       int max_segments = MAX_SEGMENTS;
-       struct request * req, *freereq = NULL;
-       int rw_ahead, max_sectors, el_ret;
-       struct list_head *head, *insert_here;
-       int latency;
-       elevator_t *elevator = &q->elevator;
-
-       count = bh->b_size >> 9;
-       sector = bh->b_rsector;
-
-       rw_ahead = 0;   /* normal case; gets changed below for READA */
-       switch (rw) {
-               case READA:
-#if 0  /* bread() misinterprets failed READA attempts as IO errors on SMP */
-                       rw_ahead = 1;
-#endif
-                       rw = READ;      /* drop into READ */
-               case READ:
-               case WRITE:
-                       latency = elevator_request_latency(elevator, rw);
-                       break;
-               default:
-                       BUG();
-                       goto end_io;
-       }
-
-       /* We'd better have a real physical mapping!
-          Check this bit only if the buffer was dirty and just locked
-          down by us so at this point flushpage will block and
-          won't clear the mapped bit under us. */
-       if (!buffer_mapped(bh))
-               BUG();
-
-       /*
-        * Temporary solution - in 2.5 this will be done by the lowlevel
-        * driver. Create a bounce buffer if the buffer data points into
-        * high memory - keep the original buffer otherwise.
-        */
-       bh = blk_queue_bounce(q, rw, bh);
-
-/* look for a free request. */
-       /*
-        * Try to coalesce the new request with old requests
-        */
-       max_sectors = get_max_sectors(bh->b_rdev);
-
-again:
-       req = NULL;
-       head = &q->queue_head;
-       /*
-        * Now we acquire the request spinlock, we have to be mega careful
-        * not to schedule or do something nonatomic
-        */
-       spin_lock_irq(&io_request_lock);
-
-       insert_here = head->prev;
-       if (list_empty(head)) {
-               q->plug_device_fn(q, bh->b_rdev); /* is atomic */
-               goto get_rq;
-       } else if (q->head_active && !q->plugged)
-               head = head->next;
-
-       el_ret = elevator->elevator_merge_fn(q, &req, head, bh, rw,max_sectors);
-       switch (el_ret) {
-
-               case ELEVATOR_BACK_MERGE:
-                       if (!q->back_merge_fn(q, req, bh, max_segments)) {
-                               insert_here = &req->queue;
-                               break;
-                       }
-                       req->bhtail->b_reqnext = bh;
-                       req->bhtail = bh;
-                       req->nr_sectors = req->hard_nr_sectors += count;
-                       blk_started_io(count);
-                       drive_stat_acct(req->rq_dev, req->cmd, count, 0);
-                       req_new_io(req, 1, count);
-                       attempt_back_merge(q, req, max_sectors, max_segments);
-                       goto out;
-
-               case ELEVATOR_FRONT_MERGE:
-                       if (!q->front_merge_fn(q, req, bh, max_segments)) {
-                               insert_here = req->queue.prev;
-                               break;
-                       }
-                       bh->b_reqnext = req->bh;
-                       req->bh = bh;
-                       /*
-                        * may not be valid, but queues not having bounce
-                        * enabled for highmem pages must not look at
-                        * ->buffer anyway
-                        */
-                       req->buffer = bh->b_data;
-                       req->current_nr_sectors = req->hard_cur_sectors = count;
-                       req->sector = req->hard_sector = sector;
-                       req->nr_sectors = req->hard_nr_sectors += count;
-                       blk_started_io(count);
-                       drive_stat_acct(req->rq_dev, req->cmd, count, 0);
-                       req_new_io(req, 1, count);
-                       attempt_front_merge(q, head, req, max_sectors, max_segments);
-                       goto out;
-
-               /*
-                * elevator says don't/can't merge. get new request
-                */
-               case ELEVATOR_NO_MERGE:
-                       /*
-                        * use elevator hints as to where to insert the
-                        * request. if no hints, just add it to the back
-                        * of the queue
-                        */
-                       if (req)
-                               insert_here = &req->queue;
-                       break;
-
-               default:
-                       printk("elevator returned crap (%d)\n", el_ret);
-                       BUG();
-       }
-               
-get_rq:
-       if (freereq) {
-               req = freereq;
-               freereq = NULL;
-       } else {
-               /*
-                * See description above __get_request_wait()
-                */
-               if (rw_ahead) {
-                       if (q->rq[rw].count < q->batch_requests) {
-                               spin_unlock_irq(&io_request_lock);
-                               goto end_io;
-                       }
-                       req = get_request(q, rw);
-                       if (req == NULL)
-                               BUG();
-               } else {
-                       req = get_request(q, rw);
-                       if (req == NULL) {
-                               spin_unlock_irq(&io_request_lock);
-                               freereq = __get_request_wait(q, rw);
-                               goto again;
-                       }
-               }
-       }
-
-/* fill up the request-info, and add it to the queue */
-       req->elevator_sequence = latency;
-       req->cmd = rw;
-       req->errors = 0;
-       req->hard_sector = req->sector = sector;
-       req->hard_nr_sectors = req->nr_sectors = count;
-       req->current_nr_sectors = req->hard_cur_sectors = count;
-       req->nr_segments = 1; /* Always 1 for a new request. */
-       req->nr_hw_segments = 1; /* Always 1 for a new request. */
-       req->buffer = bh->b_data;
-       req->waiting = NULL;
-       req->bh = bh;
-       req->bhtail = bh;
-       req->rq_dev = bh->b_rdev;
-       req->start_time = jiffies;
-       req_new_io(req, 0, count);
-       blk_started_io(count);
-       add_request(q, req, insert_here);
-out:
-       if (freereq)
-               blkdev_release_request(freereq);
-       spin_unlock_irq(&io_request_lock);
-       return 0;
-end_io:
-       bh->b_end_io(bh, test_bit(BH_Uptodate, &bh->b_state));
-       return 0;
-}
-
-/**
- * generic_make_request: hand a buffer head to it's device driver for I/O
- * @rw:  READ, WRITE, or READA - what sort of I/O is desired.
- * @bh:  The buffer head describing the location in memory and on the device.
- *
- * generic_make_request() is used to make I/O requests of block
- * devices. It is passed a &struct buffer_head and a &rw value.  The
- * %READ and %WRITE options are (hopefully) obvious in meaning.  The
- * %READA value means that a read is required, but that the driver is
- * free to fail the request if, for example, it cannot get needed
- * resources immediately.
- *
- * generic_make_request() does not return any status.  The
- * success/failure status of the request, along with notification of
- * completion, is delivered asynchronously through the bh->b_end_io
- * function described (one day) else where.
- *
- * The caller of generic_make_request must make sure that b_page,
- * b_addr, b_size are set to describe the memory buffer, that b_rdev
- * and b_rsector are set to describe the device address, and the
- * b_end_io and optionally b_private are set to describe how
- * completion notification should be signaled.  BH_Mapped should also
- * be set (to confirm that b_dev and b_blocknr are valid).
- *
- * generic_make_request and the drivers it calls may use b_reqnext,
- * and may change b_rdev and b_rsector.  So the values of these fields
- * should NOT be depended on after the call to generic_make_request.
- * Because of this, the caller should record the device address
- * information in b_dev and b_blocknr.
- *
- * Apart from those fields mentioned above, no other fields, and in
- * particular, no other flags, are changed by generic_make_request or
- * any lower level drivers.
- * */
-void generic_make_request (int rw, struct buffer_head * bh)
-{
-       int major = MAJOR(bh->b_rdev);
-       int minorsize = 0;
-       request_queue_t *q;
-
-       if (!bh->b_end_io)
-               BUG();
-
-       /* Test device size, when known. */
-       if (blk_size[major])
-               minorsize = blk_size[major][MINOR(bh->b_rdev)];
-       if (minorsize) {
-               unsigned long maxsector = (minorsize << 1) + 1;
-               unsigned long sector = bh->b_rsector;
-               unsigned int count = bh->b_size >> 9;
-
-               if (maxsector < count || maxsector - count < sector) {
-                       /* Yecch */
-                       bh->b_state &= ~(1 << BH_Dirty);
-
-                       /* This may well happen - the kernel calls bread()
-                          without checking the size of the device, e.g.,
-                          when mounting a device. */
-                       printk(KERN_INFO
-                              "attempt to access beyond end of device\n");
-                       printk(KERN_INFO "%s: rw=%d, want=%ld, limit=%d\n",
-                              kdevname(bh->b_rdev), rw,
-                              (sector + count)>>1, minorsize);
-
-                       bh->b_end_io(bh, 0);
-                       return;
-               }
-       }
-
-       /*
-        * Resolve the mapping until finished. (drivers are
-        * still free to implement/resolve their own stacking
-        * by explicitly returning 0)
-        */
-       /* NOTE: we don't repeat the blk_size check for each new device.
-        * Stacking drivers are expected to know what they are doing.
-        */
-       do {
-               q = blk_get_queue(bh->b_rdev);
-               if (!q) {
-                       printk(KERN_ERR
-                              "generic_make_request: Trying to access "
-                              "nonexistent block-device %s (%ld)\n",
-                              kdevname(bh->b_rdev), bh->b_rsector);
-                       buffer_IO_error(bh);
-                       break;
-               }
-       } while (q->make_request_fn(q, rw, bh));
-}
-
-
-/**
- * submit_bh: submit a buffer_head to the block device later for I/O
- * @rw: whether to %READ or %WRITE, or maybe to %READA (read ahead)
- * @bh: The &struct buffer_head which describes the I/O
- *
- * submit_bh() is very similar in purpose to generic_make_request(), and
- * uses that function to do most of the work.
- *
- * The extra functionality provided by submit_bh is to determine
- * b_rsector from b_blocknr and b_size, and to set b_rdev from b_dev.
- * This is is appropriate for IO requests that come from the buffer
- * cache and page cache which (currently) always use aligned blocks.
- */
-void submit_bh(int rw, struct buffer_head * bh)
-{
-       int count = bh->b_size >> 9;
-
-       if (!test_bit(BH_Lock, &bh->b_state))
-               BUG();
-
-       set_bit(BH_Req, &bh->b_state);
-       set_bit(BH_Launder, &bh->b_state);
-
-       /*
-        * First step, 'identity mapping' - RAID or LVM might
-        * further remap this.
-        */
-       bh->b_rdev = bh->b_dev;
-       bh->b_rsector = bh->b_blocknr * count;
-
-       generic_make_request(rw, bh);
-
-       switch (rw) {
-               case WRITE:
-                       kstat.pgpgout += count;
-                       break;
-               default:
-                       kstat.pgpgin += count;
-                       break;
-       }
-}
-
-/**
- * ll_rw_block: low-level access to block devices
- * @rw: whether to %READ or %WRITE or maybe %READA (readahead)
- * @nr: number of &struct buffer_heads in the array
- * @bhs: array of pointers to &struct buffer_head
- *
- * ll_rw_block() takes an array of pointers to &struct buffer_heads,
- * and requests an I/O operation on them, either a %READ or a %WRITE.
- * The third %READA option is described in the documentation for
- * generic_make_request() which ll_rw_block() calls.
- *
- * This function provides extra functionality that is not in
- * generic_make_request() that is relevant to buffers in the buffer
- * cache or page cache.  In particular it drops any buffer that it
- * cannot get a lock on (with the BH_Lock state bit), any buffer that
- * appears to be clean when doing a write request, and any buffer that
- * appears to be up-to-date when doing read request.  Further it marks
- * as clean buffers that are processed for writing (the buffer cache
- * wont assume that they are actually clean until the buffer gets
- * unlocked).
- *
- * ll_rw_block sets b_end_io to simple completion handler that marks
- * the buffer up-to-date (if approriate), unlocks the buffer and wakes
- * any waiters.  As client that needs a more interesting completion
- * routine should call submit_bh() (or generic_make_request())
- * directly.
- *
- * Caveat:
- *  All of the buffers must be for the same device, and must also be
- *  of the current approved size for the device.  */
-
-void ll_rw_block(int rw, int nr, struct buffer_head * bhs[])
-{
-       unsigned int major;
-       int correct_size;
-       int i;
-
-       if (!nr)
-               return;
-
-       major = MAJOR(bhs[0]->b_dev);
-
-       /* Determine correct block size for this device. */
-       correct_size = get_hardsect_size(bhs[0]->b_dev);
-
-       /* Verify requested block sizes. */
-       for (i = 0; i < nr; i++) {
-               struct buffer_head *bh = bhs[i];
-               if (bh->b_size % correct_size) {
-                       printk(KERN_NOTICE "ll_rw_block: device %s: "
-                              "only %d-char blocks implemented (%u)\n",
-                              kdevname(bhs[0]->b_dev),
-                              correct_size, bh->b_size);
-                       goto sorry;
-               }
-       }
-
-       if ((rw & WRITE) && is_read_only(bhs[0]->b_dev)) {
-               printk(KERN_NOTICE "Can't write to read-only device %s\n",
-                      kdevname(bhs[0]->b_dev));
-               goto sorry;
-       }
-
-       for (i = 0; i < nr; i++) {
-               struct buffer_head *bh = bhs[i];
-
-               /* Only one thread can actually submit the I/O. */
-               if (test_and_set_bit(BH_Lock, &bh->b_state))
-                       continue;
-
-               /* We have the buffer lock */
-               atomic_inc(&bh->b_count);
-               bh->b_end_io = end_buffer_io_sync;
-
-               switch(rw) {
-               case WRITE:
-                       if (!atomic_set_buffer_clean(bh))
-                               /* Hmmph! Nothing to write */
-                               goto end_io;
-                       __mark_buffer_clean(bh);
-                       break;
-
-               case READA:
-               case READ:
-                       if (buffer_uptodate(bh))
-                               /* Hmmph! Already have it */
-                               goto end_io;
-                       break;
-               default:
-                       BUG();
-       end_io:
-                       bh->b_end_io(bh, test_bit(BH_Uptodate, &bh->b_state));
-                       continue;
-               }
-
-               submit_bh(rw, bh);
-       }
-       return;
-
-sorry:
-       /* Make sure we don't get infinite dirty retries.. */
-       for (i = 0; i < nr; i++)
-               mark_buffer_clean(bhs[i]);
-}
-
-#ifdef CONFIG_STRAM_SWAP
-extern int stram_device_init (void);
-#endif
-
-
-/**
- * end_that_request_first - end I/O on one buffer.
- * @req:      the request being processed
- * @uptodate: 0 for I/O error
- * @name:     the name printed for an I/O error
- *
- * Description:
- *     Ends I/O on the first buffer attached to @req, and sets it up
- *     for the next buffer_head (if any) in the cluster.
- *     
- * Return:
- *     0 - we are done with this request, call end_that_request_last()
- *     1 - still buffers pending for this request
- *
- * Caveat: 
- *     Drivers implementing their own end_request handling must call
- *     blk_finished_io() appropriately.
- **/
-
-int end_that_request_first (struct request *req, int uptodate, char *name)
-{
-       struct buffer_head * bh;
-       int nsect;
-
-       req->errors = 0;
-       if (!uptodate)
-               printk("end_request: I/O error, dev %s (%s), sector %lu\n",
-                       kdevname(req->rq_dev), name, req->sector);
-
-       if ((bh = req->bh) != NULL) {
-               nsect = bh->b_size >> 9;
-               blk_finished_io(nsect);
-               req->bh = bh->b_reqnext;
-               bh->b_reqnext = NULL;
-               bh->b_end_io(bh, uptodate);
-               if ((bh = req->bh) != NULL) {
-                       req->hard_sector += nsect;
-                       req->hard_nr_sectors -= nsect;
-                       req->sector = req->hard_sector;
-                       req->nr_sectors = req->hard_nr_sectors;
-
-                       req->current_nr_sectors = bh->b_size >> 9;
-                       req->hard_cur_sectors = req->current_nr_sectors;
-                       if (req->nr_sectors < req->current_nr_sectors) {
-                               req->nr_sectors = req->current_nr_sectors;
-                               printk("end_request: buffer-list destroyed\n");
-                       }
-                       req->buffer = bh->b_data;
-                       return 1;
-               }
-       }
-       return 0;
-}
-
-void end_that_request_last(struct request *req)
-{
-       struct completion *waiting = req->waiting;
-
-       req_finished_io(req);
-       blkdev_release_request(req);
-       if (waiting)
-               complete(waiting);
-}
-
-int __init blk_dev_init(void)
-{
-       struct blk_dev_struct *dev;
-
-       request_cachep = kmem_cache_create("blkdev_requests",
-                                          sizeof(struct request),
-                                          0, SLAB_HWCACHE_ALIGN, NULL, NULL);
-
-       if (!request_cachep)
-               panic("Can't create request pool slab cache\n");
-
-       for (dev = blk_dev + MAX_BLKDEV; dev-- != blk_dev;)
-               dev->queue = NULL;
-
-       memset(ro_bits,0,sizeof(ro_bits));
-       memset(max_readahead, 0, sizeof(max_readahead));
-       memset(max_sectors, 0, sizeof(max_sectors));
-
-       blk_max_low_pfn = max_low_pfn - 1;
-       blk_max_pfn = max_pfn - 1;
-
-#ifdef CONFIG_AMIGA_Z2RAM
-       z2_init();
-#endif
-#ifdef CONFIG_STRAM_SWAP
-       stram_device_init();
-#endif
-#ifdef CONFIG_ISP16_CDI
-       isp16_init();
-#endif
-#ifdef CONFIG_BLK_DEV_PS2
-       ps2esdi_init();
-#endif
-#ifdef CONFIG_BLK_DEV_XD
-       xd_init();
-#endif
-#ifdef CONFIG_BLK_DEV_MFM
-       mfm_init();
-#endif
-#ifdef CONFIG_PARIDE
-       { extern void paride_init(void); paride_init(); };
-#endif
-#ifdef CONFIG_MAC_FLOPPY
-       swim3_init();
-#endif
-#ifdef CONFIG_BLK_DEV_SWIM_IOP
-       swimiop_init();
-#endif
-#ifdef CONFIG_AMIGA_FLOPPY
-       amiga_floppy_init();
-#endif
-#ifdef CONFIG_ATARI_FLOPPY
-       atari_floppy_init();
-#endif
-#ifdef CONFIG_BLK_DEV_FD
-       floppy_init();
-#else
-#if defined(__i386__) && !defined(CONFIG_XENO) /* Do we even need this? */
-       outb_p(0xc, 0x3f2);
-#endif
-#endif
-#ifdef CONFIG_CDU31A
-       cdu31a_init();
-#endif
-#ifdef CONFIG_ATARI_ACSI
-       acsi_init();
-#endif
-#ifdef CONFIG_MCD
-       mcd_init();
-#endif
-#ifdef CONFIG_MCDX
-       mcdx_init();
-#endif
-#ifdef CONFIG_SBPCD
-       sbpcd_init();
-#endif
-#ifdef CONFIG_AZTCD
-       aztcd_init();
-#endif
-#ifdef CONFIG_CDU535
-       sony535_init();
-#endif
-#ifdef CONFIG_GSCD
-       gscd_init();
-#endif
-#ifdef CONFIG_CM206
-       cm206_init();
-#endif
-#ifdef CONFIG_OPTCD
-       optcd_init();
-#endif
-#ifdef CONFIG_SJCD
-       sjcd_init();
-#endif
-#ifdef CONFIG_APBLOCK
-       ap_init();
-#endif
-#ifdef CONFIG_DDV
-       ddv_init();
-#endif
-#ifdef CONFIG_MDISK
-       mdisk_init();
-#endif
-#ifdef CONFIG_DASD
-       dasd_init();
-#endif
-#if defined(CONFIG_S390_TAPE) && defined(CONFIG_S390_TAPE_BLOCK)
-       tapeblock_init();
-#endif
-#ifdef CONFIG_BLK_DEV_XPRAM
-        xpram_init();
-#endif
-
-#ifdef CONFIG_SUN_JSFLASH
-       jsfd_init();
-#endif
-
-#ifdef CONFIG_XENOLINUX_BLOCK
-    xlblk_init();
-    xlseg_init();
-    xlseg_proc_init();
-#endif
-
-       return 0;
-};
-
-EXPORT_SYMBOL(io_request_lock);
-EXPORT_SYMBOL(end_that_request_first);
-EXPORT_SYMBOL(end_that_request_last);
-EXPORT_SYMBOL(blk_grow_request_list);
-EXPORT_SYMBOL(blk_init_queue);
-EXPORT_SYMBOL(blk_get_queue);
-EXPORT_SYMBOL(blk_cleanup_queue);
-EXPORT_SYMBOL(blk_queue_headactive);
-EXPORT_SYMBOL(blk_queue_make_request);
-EXPORT_SYMBOL(generic_make_request);
-EXPORT_SYMBOL(blkdev_release_request);
-EXPORT_SYMBOL(generic_unplug_device);
-EXPORT_SYMBOL(blk_queue_bounce_limit);
-EXPORT_SYMBOL(blk_max_low_pfn);
-EXPORT_SYMBOL(blk_max_pfn);
-EXPORT_SYMBOL(blk_seg_merge_ok);
-EXPORT_SYMBOL(blk_nohighio);
diff --git a/xenolinux-2.4.21-sparse/drivers/char/mem.c b/xenolinux-2.4.21-sparse/drivers/char/mem.c
deleted file mode 100644 (file)
index bb0ab61..0000000
+++ /dev/null
@@ -1,807 +0,0 @@
-/*
- *  linux/drivers/char/mem.c
- *
- *  Copyright (C) 1991, 1992  Linus Torvalds
- *
- *  Added devfs support. 
- *    Jan-11-1998, C. Scott Ananian <cananian@alumni.princeton.edu>
- *  Shared /dev/zero mmaping support, Feb 2000, Kanoj Sarcar <kanoj@sgi.com>
- *
- *  MODIFIED FOR XENOLINUX by Keir Fraser, 10th July 2003.
- *  Xenolinux has strange semantics for /dev/mem and /dev/kmem!!
- *   1. mmap will not work on /dev/kmem
- *   2. mmap on /dev/mem interprets the 'file offset' as a machine address
- *      rather than a physical address.
- *  I don't believe anyone sane mmaps /dev/kmem, but /dev/mem is mmapped
- *  to get at memory-mapped I/O spaces (eg. the VESA X server does this).
- *  For this to work at all we need to expect machine addresses.
- *  Reading/writing of /dev/kmem expects kernel virtual addresses, as usual.
- *  Reading/writing of /dev/mem expects 'physical addresses' as usual -- this
- *  is because /dev/mem can only read/write existing kernel mappings, which
- *  will be normal RAM, and we should present pseudo-physical layout for all
- *  except I/O (which is the sticky case that mmap is hacked to deal with).
- */
-
-#include <linux/config.h>
-#include <linux/mm.h>
-#include <linux/miscdevice.h>
-#include <linux/tpqic02.h>
-#include <linux/ftape.h>
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
-#include <linux/mman.h>
-#include <linux/random.h>
-#include <linux/init.h>
-#include <linux/raw.h>
-#include <linux/tty.h>
-#include <linux/capability.h>
-
-#include <asm/uaccess.h>
-#include <asm/io.h>
-#include <asm/pgalloc.h>
-
-#ifdef CONFIG_I2C
-extern int i2c_init_all(void);
-#endif
-#ifdef CONFIG_FB
-extern void fbmem_init(void);
-#endif
-#ifdef CONFIG_PROM_CONSOLE
-extern void prom_con_init(void);
-#endif
-#ifdef CONFIG_MDA_CONSOLE
-extern void mda_console_init(void);
-#endif
-#if defined(CONFIG_S390_TAPE) && defined(CONFIG_S390_TAPE_CHAR)
-extern void tapechar_init(void);
-#endif
-     
-static ssize_t do_write_mem(struct file * file, void *p, unsigned long realp,
-                           const char * buf, size_t count, loff_t *ppos)
-{
-       ssize_t written;
-
-       written = 0;
-#if defined(__sparc__) || defined(__mc68000__)
-       /* we don't have page 0 mapped on sparc and m68k.. */
-       if (realp < PAGE_SIZE) {
-               unsigned long sz = PAGE_SIZE-realp;
-               if (sz > count) sz = count; 
-               /* Hmm. Do something? */
-               buf+=sz;
-               p+=sz;
-               count-=sz;
-               written+=sz;
-       }
-#endif
-       if (copy_from_user(p, buf, count))
-               return -EFAULT;
-       written += count;
-       *ppos += written;
-       return written;
-}
-
-
-/*
- * This funcion reads the *physical* memory. The f_pos points directly to the 
- * memory location. 
- */
-static ssize_t read_mem(struct file * file, char * buf,
-                       size_t count, loff_t *ppos)
-{
-       unsigned long p = *ppos;
-       unsigned long end_mem;
-       ssize_t read;
-       
-       end_mem = __pa(high_memory);
-       if (p >= end_mem)
-               return 0;
-       if (count > end_mem - p)
-               count = end_mem - p;
-       read = 0;
-#if defined(__sparc__) || defined(__mc68000__)
-       /* we don't have page 0 mapped on sparc and m68k.. */
-       if (p < PAGE_SIZE) {
-               unsigned long sz = PAGE_SIZE-p;
-               if (sz > count) 
-                       sz = count; 
-               if (sz > 0) {
-                       if (clear_user(buf, sz))
-                               return -EFAULT;
-                       buf += sz; 
-                       p += sz; 
-                       count -= sz; 
-                       read += sz; 
-               }
-       }
-#endif
-       if (copy_to_user(buf, __va(p), count))
-               return -EFAULT;
-       read += count;
-       *ppos += read;
-       return read;
-}
-
-static ssize_t write_mem(struct file * file, const char * buf, 
-                        size_t count, loff_t *ppos)
-{
-       unsigned long p = *ppos;
-       unsigned long end_mem;
-
-       end_mem = __pa(high_memory);
-       if (p >= end_mem)
-               return 0;
-       if (count > end_mem - p)
-               count = end_mem - p;
-       return do_write_mem(file, __va(p), p, buf, count, ppos);
-}
-
-#ifndef pgprot_noncached
-
-/*
- * This should probably be per-architecture in <asm/pgtable.h>
- */
-static inline pgprot_t pgprot_noncached(pgprot_t _prot)
-{
-       unsigned long prot = pgprot_val(_prot);
-
-#if defined(__i386__) || defined(__x86_64__)
-       /* On PPro and successors, PCD alone doesn't always mean 
-           uncached because of interactions with the MTRRs. PCD | PWT
-           means definitely uncached. */ 
-       if (boot_cpu_data.x86 > 3)
-               prot |= _PAGE_PCD | _PAGE_PWT;
-#elif defined(__powerpc__)
-       prot |= _PAGE_NO_CACHE | _PAGE_GUARDED;
-#elif defined(__mc68000__)
-#ifdef SUN3_PAGE_NOCACHE
-       if (MMU_IS_SUN3)
-               prot |= SUN3_PAGE_NOCACHE;
-       else
-#endif
-       if (MMU_IS_851 || MMU_IS_030)
-               prot |= _PAGE_NOCACHE030;
-       /* Use no-cache mode, serialized */
-       else if (MMU_IS_040 || MMU_IS_060)
-               prot = (prot & _CACHEMASK040) | _PAGE_NOCACHE_S;
-#endif
-
-       return __pgprot(prot);
-}
-
-#endif /* !pgprot_noncached */
-
-/*
- * Architectures vary in how they handle caching for addresses 
- * outside of main memory.
- */
-static inline int noncached_address(unsigned long addr)
-{
-#if defined(__i386__)
-       /* 
-        * On the PPro and successors, the MTRRs are used to set
-        * memory types for physical addresses outside main memory, 
-        * so blindly setting PCD or PWT on those pages is wrong.
-        * For Pentiums and earlier, the surround logic should disable 
-        * caching for the high addresses through the KEN pin, but
-        * we maintain the tradition of paranoia in this code.
-        */
-       return !( test_bit(X86_FEATURE_MTRR, &boot_cpu_data.x86_capability) ||
-                 test_bit(X86_FEATURE_K6_MTRR, &boot_cpu_data.x86_capability) ||
-                 test_bit(X86_FEATURE_CYRIX_ARR, &boot_cpu_data.x86_capability) ||
-                 test_bit(X86_FEATURE_CENTAUR_MCR, &boot_cpu_data.x86_capability) )
-         && addr >= __pa(high_memory);
-#else
-       return addr >= __pa(high_memory);
-#endif
-}
-
-static int mmap_mem(struct file * file, struct vm_area_struct * vma)
-{
-       unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
-
-#if defined(CONFIG_XENO) && defined(CONFIG_XENO_PRIV)
-       if (!(start_info.flags & SIF_PRIVILEGED))
-               return -ENXIO;
-
-       /* DONTCOPY is essential for Xenolinux as copy_page_range is broken. */
-       vma->vm_flags |= VM_RESERVED | VM_IO | VM_DONTCOPY;
-       vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
-       if (direct_remap_area_pages(vma->vm_mm, vma->vm_start, offset, 
-                            vma->vm_end-vma->vm_start, vma->vm_page_prot))
-               return -EAGAIN;
-       return 0;
-#elif defined(CONFIG_XENO)
-       return -ENXIO;
-#else
-       /*
-        * Accessing memory above the top the kernel knows about or
-        * through a file pointer that was marked O_SYNC will be
-        * done non-cached.
-        */
-       if (noncached_address(offset) || (file->f_flags & O_SYNC))
-               vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
-
-       /* Don't try to swap out physical pages.. */
-       vma->vm_flags |= VM_RESERVED;
-
-       /*
-        * Don't dump addresses that are not real memory to a core file.
-        */
-       if (offset >= __pa(high_memory) || (file->f_flags & O_SYNC))
-               vma->vm_flags |= VM_IO;
-
-       if (remap_page_range(vma->vm_start, offset, vma->vm_end-vma->vm_start,
-                            vma->vm_page_prot))
-               return -EAGAIN;
-       return 0;
-#endif
-}
-
-/*
- * This function reads the *virtual* memory as seen by the kernel.
- */
-static ssize_t read_kmem(struct file *file, char *buf, 
-                        size_t count, loff_t *ppos)
-{
-       unsigned long p = *ppos;
-       ssize_t read = 0;
-       ssize_t virtr = 0;
-       char * kbuf; /* k-addr because vread() takes vmlist_lock rwlock */
-               
-       if (p < (unsigned long) high_memory) {
-               read = count;
-               if (count > (unsigned long) high_memory - p)
-                       read = (unsigned long) high_memory - p;
-
-#if defined(__sparc__) || defined(__mc68000__)
-               /* we don't have page 0 mapped on sparc and m68k.. */
-               if (p < PAGE_SIZE && read > 0) {
-                       size_t tmp = PAGE_SIZE - p;
-                       if (tmp > read) tmp = read;
-                       if (clear_user(buf, tmp))
-                               return -EFAULT;
-                       buf += tmp;
-                       p += tmp;
-                       read -= tmp;
-                       count -= tmp;
-               }
-#endif
-               if (copy_to_user(buf, (char *)p, read))
-                       return -EFAULT;
-               p += read;
-               buf += read;
-               count -= read;
-       }
-
-       if (count > 0) {
-               kbuf = (char *)__get_free_page(GFP_KERNEL);
-               if (!kbuf)
-                       return -ENOMEM;
-               while (count > 0) {
-                       int len = count;
-
-                       if (len > PAGE_SIZE)
-                               len = PAGE_SIZE;
-                       len = vread(kbuf, (char *)p, len);
-                       if (!len)
-                               break;
-                       if (copy_to_user(buf, kbuf, len)) {
-                               free_page((unsigned long)kbuf);
-                               return -EFAULT;
-                       }
-                       count -= len;
-                       buf += len;
-                       virtr += len;
-                       p += len;
-               }
-               free_page((unsigned long)kbuf);
-       }
-       *ppos = p;
-       return virtr + read;
-}
-
-extern long vwrite(char *buf, char *addr, unsigned long count);
-
-/*
- * This function writes to the *virtual* memory as seen by the kernel.
- */
-static ssize_t write_kmem(struct file * file, const char * buf, 
-                         size_t count, loff_t *ppos)
-{
-       unsigned long p = *ppos;
-       ssize_t wrote = 0;
-       ssize_t virtr = 0;
-       char * kbuf; /* k-addr because vwrite() takes vmlist_lock rwlock */
-
-       if (p < (unsigned long) high_memory) {
-               wrote = count;
-               if (count > (unsigned long) high_memory - p)
-                       wrote = (unsigned long) high_memory - p;
-
-               wrote = do_write_mem(file, (void*)p, p, buf, wrote, ppos);
-
-               p += wrote;
-               buf += wrote;
-               count -= wrote;
-       }
-
-       if (count > 0) {
-               kbuf = (char *)__get_free_page(GFP_KERNEL);
-               if (!kbuf)
-                       return -ENOMEM;
-               while (count > 0) {
-                       int len = count;
-
-                       if (len > PAGE_SIZE)
-                               len = PAGE_SIZE;
-                       if (len && copy_from_user(kbuf, buf, len)) {
-                               free_page((unsigned long)kbuf);
-                               return -EFAULT;
-                       }
-                       len = vwrite(kbuf, (char *)p, len);
-                       count -= len;
-                       buf += len;
-                       virtr += len;
-                       p += len;
-               }
-               free_page((unsigned long)kbuf);
-       }
-
-       *ppos = p;
-       return virtr + wrote;
-}
-
-#if defined(CONFIG_ISA) || !defined(__mc68000__)
-static ssize_t read_port(struct file * file, char * buf,
-                        size_t count, loff_t *ppos)
-{
-       unsigned long i = *ppos;
-       char *tmp = buf;
-
-       if (verify_area(VERIFY_WRITE,buf,count))
-               return -EFAULT; 
-       while (count-- > 0 && i < 65536) {
-               if (__put_user(inb(i),tmp) < 0) 
-                       return -EFAULT;  
-               i++;
-               tmp++;
-       }
-       *ppos = i;
-       return tmp-buf;
-}
-
-static ssize_t write_port(struct file * file, const char * buf,
-                         size_t count, loff_t *ppos)
-{
-       unsigned long i = *ppos;
-       const char * tmp = buf;
-
-       if (verify_area(VERIFY_READ,buf,count))
-               return -EFAULT;
-       while (count-- > 0 && i < 65536) {
-               char c;
-               if (__get_user(c, tmp)) 
-                       return -EFAULT; 
-               outb(c,i);
-               i++;
-               tmp++;
-       }
-       *ppos = i;
-       return tmp-buf;
-}
-#endif
-
-static ssize_t read_null(struct file * file, char * buf,
-                        size_t count, loff_t *ppos)
-{
-       return 0;
-}
-
-static ssize_t write_null(struct file * file, const char * buf,
-                         size_t count, loff_t *ppos)
-{
-       return count;
-}
-
-/*
- * For fun, we are using the MMU for this.
- */
-static inline size_t read_zero_pagealigned(char * buf, size_t size)
-{
-       struct mm_struct *mm;
-       struct vm_area_struct * vma;
-       unsigned long addr=(unsigned long)buf;
-
-       mm = current->mm;
-       /* Oops, this was forgotten before. -ben */
-       down_read(&mm->mmap_sem);
-
-       /* For private mappings, just map in zero pages. */
-       for (vma = find_vma(mm, addr); vma; vma = vma->vm_next) {
-               unsigned long count;
-
-               if (vma->vm_start > addr || (vma->vm_flags & VM_WRITE) == 0)
-                       goto out_up;
-               if (vma->vm_flags & VM_SHARED)
-                       break;
-#if defined(CONFIG_XENO_PRIV)
-               if (vma->vm_flags & VM_IO)
-                       break;
-#endif
-               count = vma->vm_end - addr;
-               if (count > size)
-                       count = size;
-
-               zap_page_range(mm, addr, count);
-               zeromap_page_range(addr, count, PAGE_COPY);
-
-               size -= count;
-               buf += count;
-               addr += count;
-               if (size == 0)
-                       goto out_up;
-       }
-
-       up_read(&mm->mmap_sem);
-       
-       /* The shared case is hard. Let's do the conventional zeroing. */ 
-       do {
-               unsigned long unwritten = clear_user(buf, PAGE_SIZE);
-               if (unwritten)
-                       return size + unwritten - PAGE_SIZE;
-               if (current->need_resched)
-                       schedule();
-               buf += PAGE_SIZE;
-               size -= PAGE_SIZE;
-       } while (size);
-
-       return size;
-out_up:
-       up_read(&mm->mmap_sem);
-       return size;
-}
-
-static ssize_t read_zero(struct file * file, char * buf, 
-                        size_t count, loff_t *ppos)
-{
-       unsigned long left, unwritten, written = 0;
-
-       if (!count)
-               return 0;
-
-       if (!access_ok(VERIFY_WRITE, buf, count))
-               return -EFAULT;
-
-       left = count;
-
-       /* do we want to be clever? Arbitrary cut-off */
-       if (count >= PAGE_SIZE*4) {
-               unsigned long partial;
-
-               /* How much left of the page? */
-               partial = (PAGE_SIZE-1) & -(unsigned long) buf;
-               unwritten = clear_user(buf, partial);
-               written = partial - unwritten;
-               if (unwritten)
-                       goto out;
-               left -= partial;
-               buf += partial;
-               unwritten = read_zero_pagealigned(buf, left & PAGE_MASK);
-               written += (left & PAGE_MASK) - unwritten;
-               if (unwritten)
-                       goto out;
-               buf += left & PAGE_MASK;
-               left &= ~PAGE_MASK;
-       }
-       unwritten = clear_user(buf, left);
-       written += left - unwritten;
-out:
-       return written ? written : -EFAULT;
-}
-
-static int mmap_zero(struct file * file, struct vm_area_struct * vma)
-{
-       if (vma->vm_flags & VM_SHARED)
-               return shmem_zero_setup(vma);
-       if (zeromap_page_range(vma->vm_start, vma->vm_end - vma->vm_start, vma->vm_page_prot))
-               return -EAGAIN;
-       return 0;
-}
-
-static ssize_t write_full(struct file * file, const char * buf,
-                         size_t count, loff_t *ppos)
-{
-       return -ENOSPC;
-}
-
-/*
- * Special lseek() function for /dev/null and /dev/zero.  Most notably, you
- * can fopen() both devices with "a" now.  This was previously impossible.
- * -- SRB.
- */
-
-static loff_t null_lseek(struct file * file, loff_t offset, int orig)
-{
-       return file->f_pos = 0;
-}
-
-/*
- * The memory devices use the full 32/64 bits of the offset, and so we cannot
- * check against negative addresses: they are ok. The return value is weird,
- * though, in that case (0).
- *
- * also note that seeking relative to the "end of file" isn't supported:
- * it has no meaning, so it returns -EINVAL.
- */
-static loff_t memory_lseek(struct file * file, loff_t offset, int orig)
-{
-       switch (orig) {
-               case 0:
-                       file->f_pos = offset;
-                       return file->f_pos;
-               case 1:
-                       file->f_pos += offset;
-                       return file->f_pos;
-               default:
-                       return -EINVAL;
-       }
-}
-
-static int open_port(struct inode * inode, struct file * filp)
-{
-       return capable(CAP_SYS_RAWIO) ? 0 : -EPERM;
-}
-
-struct page *kmem_vm_nopage(struct vm_area_struct *vma, unsigned long address, int write)
-{
-       unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
-       unsigned long kaddr;
-       pgd_t *pgd;
-       pmd_t *pmd;
-       pte_t *ptep, pte;
-       struct page *page = NULL;
-
-       /* address is user VA; convert to kernel VA of desired page */
-       kaddr = (address - vma->vm_start) + offset;
-       kaddr = VMALLOC_VMADDR(kaddr);
-
-       spin_lock(&init_mm.page_table_lock);
-
-       /* Lookup page structure for kernel VA */
-       pgd = pgd_offset(&init_mm, kaddr);
-       if (pgd_none(*pgd) || pgd_bad(*pgd))
-               goto out;
-       pmd = pmd_offset(pgd, kaddr);
-       if (pmd_none(*pmd) || pmd_bad(*pmd))
-               goto out;
-       ptep = pte_offset(pmd, kaddr);
-       if (!ptep)
-               goto out;
-       pte = *ptep;
-       if (!pte_present(pte))
-               goto out;
-       if (write && !pte_write(pte))
-               goto out;
-       page = pte_page(pte);
-       if (!VALID_PAGE(page)) {
-               page = NULL;
-               goto out;
-       }
-
-       /* Increment reference count on page */
-       get_page(page);
-
-out:
-       spin_unlock(&init_mm.page_table_lock);
-
-       return page;
-}
-
-struct vm_operations_struct kmem_vm_ops = {
-       nopage:         kmem_vm_nopage,
-};
-
-static int mmap_kmem(struct file * file, struct vm_area_struct * vma)
-{
-       unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
-       unsigned long size = vma->vm_end - vma->vm_start;
-
-#if defined(CONFIG_XENO)
-       return -ENXIO;
-#endif
-
-       /*
-        * If the user is not attempting to mmap a high memory address then
-        * the standard mmap_mem mechanism will work.  High memory addresses
-        * need special handling, as remap_page_range expects a physically-
-        * contiguous range of kernel addresses (such as obtained in kmalloc).
-        */
-       if ((offset + size) < (unsigned long) high_memory)
-               return mmap_mem(file, vma);
-
-       /*
-        * Accessing memory above the top the kernel knows about or
-        * through a file pointer that was marked O_SYNC will be
-        * done non-cached.
-        */
-       if (noncached_address(offset) || (file->f_flags & O_SYNC))
-               vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
-
-       /* Don't do anything here; "nopage" will fill the holes */
-       vma->vm_ops = &kmem_vm_ops;
-
-       /* Don't try to swap out physical pages.. */
-       vma->vm_flags |= VM_RESERVED;
-
-       /*
-        * Don't dump addresses that are not real memory to a core file.
-        */
-       vma->vm_flags |= VM_IO;
-
-       return 0;
-}
-
-#define zero_lseek     null_lseek
-#define full_lseek      null_lseek
-#define write_zero     write_null
-#define read_full       read_zero
-#define open_mem       open_port
-#define open_kmem      open_mem
-
-static struct file_operations mem_fops = {
-       llseek:         memory_lseek,
-       read:           read_mem,
-       write:          write_mem,
-       mmap:           mmap_mem,
-       open:           open_mem,
-};
-
-static struct file_operations kmem_fops = {
-       llseek:         memory_lseek,
-       read:           read_kmem,
-       write:          write_kmem,
-       mmap:           mmap_kmem,
-       open:           open_kmem,
-};
-
-static struct file_operations null_fops = {
-       llseek:         null_lseek,
-       read:           read_null,
-       write:          write_null,
-};
-
-#if defined(CONFIG_ISA) || !defined(__mc68000__)
-static struct file_operations port_fops = {
-       llseek:         memory_lseek,
-       read:           read_port,
-       write:          write_port,
-       open:           open_port,
-};
-#endif
-
-static struct file_operations zero_fops = {
-       llseek:         zero_lseek,
-       read:           read_zero,
-       write:          write_zero,
-       mmap:           mmap_zero,
-};
-
-static struct file_operations full_fops = {
-       llseek:         full_lseek,
-       read:           read_full,
-       write:          write_full,
-};
-
-static int memory_open(struct inode * inode, struct file * filp)
-{
-       switch (MINOR(inode->i_rdev)) {
-               case 1:
-                       filp->f_op = &mem_fops;
-                       break;
-               case 2:
-                       filp->f_op = &kmem_fops;
-                       break;
-               case 3:
-                       filp->f_op = &null_fops;
-                       break;
-#if defined(CONFIG_ISA) || !defined(__mc68000__)
-               case 4:
-#if defined(CONFIG_XENO)
-#if defined(CONFIG_XENO_PRIV)
-                       if (!(start_info.flags & SIF_PRIVILEGED))
-#endif
-                               return -ENXIO;
-#endif
-                       filp->f_op = &port_fops;
-                       break;
-#endif
-               case 5:
-                       filp->f_op = &zero_fops;
-                       break;
-               case 7:
-                       filp->f_op = &full_fops;
-                       break;
-               case 8:
-                       filp->f_op = &random_fops;
-                       break;
-               case 9:
-                       filp->f_op = &urandom_fops;
-                       break;
-               default:
-                       return -ENXIO;
-       }
-       if (filp->f_op && filp->f_op->open)
-               return filp->f_op->open(inode,filp);
-       return 0;
-}
-
-void __init memory_devfs_register (void)
-{
-    /*  These are never unregistered  */
-    static const struct {
-       unsigned short minor;
-       char *name;
-       umode_t mode;
-       struct file_operations *fops;
-    } list[] = { /* list of minor devices */
-       {1, "mem",     S_IRUSR | S_IWUSR | S_IRGRP, &mem_fops},
-       {2, "kmem",    S_IRUSR | S_IWUSR | S_IRGRP, &kmem_fops},
-       {3, "null",    S_IRUGO | S_IWUGO,           &null_fops},
-#if defined(CONFIG_ISA) || !defined(__mc68000__)
-       {4, "port",    S_IRUSR | S_IWUSR | S_IRGRP, &port_fops},
-#endif
-       {5, "zero",    S_IRUGO | S_IWUGO,           &zero_fops},
-       {7, "full",    S_IRUGO | S_IWUGO,           &full_fops},
-       {8, "random",  S_IRUGO | S_IWUSR,           &random_fops},
-       {9, "urandom", S_IRUGO | S_IWUSR,           &urandom_fops}
-    };
-    int i;
-
-    for (i=0; i<(sizeof(list)/sizeof(*list)); i++)
-       devfs_register (NULL, list[i].name, DEVFS_FL_NONE,
-                       MEM_MAJOR, list[i].minor,
-                       list[i].mode | S_IFCHR,
-                       list[i].fops, NULL);
-}
-
-static struct file_operations memory_fops = {
-       open:           memory_open,    /* just a selector for the real open */
-};
-
-int __init chr_dev_init(void)
-{
-       if (devfs_register_chrdev(MEM_MAJOR,"mem",&memory_fops))
-               printk("unable to get major %d for memory devs\n", MEM_MAJOR);
-       memory_devfs_register();
-       rand_initialize();
-#ifdef CONFIG_I2C
-       i2c_init_all();
-#endif
-#if defined (CONFIG_FB)
-       fbmem_init();
-#endif
-#if defined (CONFIG_PROM_CONSOLE)
-       prom_con_init();
-#endif
-#if defined (CONFIG_MDA_CONSOLE)
-       mda_console_init();
-#endif
-       tty_init();
-#ifdef CONFIG_M68K_PRINTER
-       lp_m68k_init();
-#endif
-       misc_init();
-#if CONFIG_QIC02_TAPE
-       qic02_tape_init();
-#endif
-#ifdef CONFIG_FTAPE
-       ftape_init();
-#endif
-#if defined(CONFIG_S390_TAPE) && defined(CONFIG_S390_TAPE_CHAR)
-       tapechar_init();
-#endif
-       return 0;
-}
-
-__initcall(chr_dev_init);
diff --git a/xenolinux-2.4.21-sparse/drivers/char/tty_io.c b/xenolinux-2.4.21-sparse/drivers/char/tty_io.c
deleted file mode 100644 (file)
index 5e9e3c1..0000000
+++ /dev/null
@@ -1,2452 +0,0 @@
-/*
- *  linux/drivers/char/tty_io.c
- *
- *  Copyright (C) 1991, 1992  Linus Torvalds
- */
-
-/*
- * 'tty_io.c' gives an orthogonal feeling to tty's, be they consoles
- * or rs-channels. It also implements echoing, cooked mode etc.
- *
- * Kill-line thanks to John T Kohl, who also corrected VMIN = VTIME = 0.
- *
- * Modified by Theodore Ts'o, 9/14/92, to dynamically allocate the
- * tty_struct and tty_queue structures.  Previously there was an array
- * of 256 tty_struct's which was statically allocated, and the
- * tty_queue structures were allocated at boot time.  Both are now
- * dynamically allocated only when the tty is open.
- *
- * Also restructured routines so that there is more of a separation
- * between the high-level tty routines (tty_io.c and tty_ioctl.c) and
- * the low-level tty routines (serial.c, pty.c, console.c).  This
- * makes for cleaner and more compact code.  -TYT, 9/17/92 
- *
- * Modified by Fred N. van Kempen, 01/29/93, to add line disciplines
- * which can be dynamically activated and de-activated by the line
- * discipline handling modules (like SLIP).
- *
- * NOTE: pay no attention to the line discipline code (yet); its
- * interface is still subject to change in this version...
- * -- TYT, 1/31/92
- *
- * Added functionality to the OPOST tty handling.  No delays, but all
- * other bits should be there.
- *     -- Nick Holloway <alfie@dcs.warwick.ac.uk>, 27th May 1993.
- *
- * Rewrote canonical mode and added more termios flags.
- *     -- julian@uhunix.uhcc.hawaii.edu (J. Cowley), 13Jan94
- *
- * Reorganized FASYNC support so mouse code can share it.
- *     -- ctm@ardi.com, 9Sep95
- *
- * New TIOCLINUX variants added.
- *     -- mj@k332.feld.cvut.cz, 19-Nov-95
- * 
- * Restrict vt switching via ioctl()
- *      -- grif@cs.ucr.edu, 5-Dec-95
- *
- * Move console and virtual terminal code to more appropriate files,
- * implement CONFIG_VT and generalize console device interface.
- *     -- Marko Kohtala <Marko.Kohtala@hut.fi>, March 97
- *
- * Rewrote init_dev and release_dev to eliminate races.
- *     -- Bill Hawes <whawes@star.net>, June 97
- *
- * Added devfs support.
- *      -- C. Scott Ananian <cananian@alumni.princeton.edu>, 13-Jan-1998
- *
- * Added support for a Unix98-style ptmx device.
- *      -- C. Scott Ananian <cananian@alumni.princeton.edu>, 14-Jan-1998
- *
- * Reduced memory usage for older ARM systems
- *      -- Russell King <rmk@arm.linux.org.uk>
- *
- * Move do_SAK() into process context.  Less stack use in devfs functions.
- * alloc_tty_struct() always uses kmalloc() -- Andrew Morton <andrewm@uow.edu.eu> 17Mar01
- */
-
-#include <linux/config.h>
-#include <linux/types.h>
-#include <linux/major.h>
-#include <linux/errno.h>
-#include <linux/signal.h>
-#include <linux/fcntl.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/tty.h>
-#include <linux/tty_driver.h>
-#include <linux/tty_flip.h>
-#include <linux/devpts_fs.h>
-#include <linux/file.h>
-#include <linux/console.h>
-#include <linux/timer.h>
-#include <linux/ctype.h>
-#include <linux/kd.h>
-#include <linux/mm.h>
-#include <linux/string.h>
-#include <linux/slab.h>
-#include <linux/poll.h>
-#include <linux/proc_fs.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/smp_lock.h>
-
-#include <asm/uaccess.h>
-#include <asm/system.h>
-#include <asm/bitops.h>
-
-#include <linux/kbd_kern.h>
-#include <linux/vt_kern.h>
-#include <linux/selection.h>
-#include <linux/devfs_fs_kernel.h>
-
-#include <linux/kmod.h>
-
-#ifdef CONFIG_XEN_CONSOLE
-extern void xen_console_init(void);
-#endif
-
-#ifdef CONFIG_VT
-extern void con_init_devfs (void);
-#endif
-
-extern void disable_early_printk(void);
-
-#define CONSOLE_DEV MKDEV(TTY_MAJOR,0)
-#define TTY_DEV MKDEV(TTYAUX_MAJOR,0)
-#define SYSCONS_DEV MKDEV(TTYAUX_MAJOR,1)
-#define PTMX_DEV MKDEV(TTYAUX_MAJOR,2)
-
-#undef TTY_DEBUG_HANGUP
-
-#define TTY_PARANOIA_CHECK 1
-#define CHECK_TTY_COUNT 1
-
-struct termios tty_std_termios;                /* for the benefit of tty drivers  */
-struct tty_driver *tty_drivers;                /* linked list of tty drivers */
-struct tty_ldisc ldiscs[NR_LDISCS];    /* line disc dispatch table     */
-
-#ifdef CONFIG_UNIX98_PTYS
-extern struct tty_driver ptm_driver[]; /* Unix98 pty masters; for /dev/ptmx */
-extern struct tty_driver pts_driver[]; /* Unix98 pty slaves;  for /dev/ptmx */
-#endif
-
-static void initialize_tty_struct(struct tty_struct *tty);
-
-static ssize_t tty_read(struct file *, char *, size_t, loff_t *);
-static ssize_t tty_write(struct file *, const char *, size_t, loff_t *);
-static unsigned int tty_poll(struct file *, poll_table *);
-static int tty_open(struct inode *, struct file *);
-static int tty_release(struct inode *, struct file *);
-int tty_ioctl(struct inode * inode, struct file * file,
-             unsigned int cmd, unsigned long arg);
-static int tty_fasync(int fd, struct file * filp, int on);
-extern int vme_scc_init (void);
-extern long vme_scc_console_init(void);
-extern int serial167_init(void);
-extern long serial167_console_init(void);
-extern void console_8xx_init(void);
-extern int rs_8xx_init(void);
-extern void mac_scc_console_init(void);
-extern void hwc_console_init(void);
-extern void hwc_tty_init(void);
-extern void con3215_init(void);
-extern void tty3215_init(void);
-extern void tub3270_con_init(void);
-extern void tub3270_init(void);
-extern void rs285_console_init(void);
-extern void sa1100_rs_console_init(void);
-extern void sgi_serial_console_init(void);
-extern void sci_console_init(void);
-extern void tx3912_console_init(void);
-extern void tx3912_rs_init(void);
-extern void txx927_console_init(void);
-extern void sb1250_serial_console_init(void);
-
-#ifndef MIN
-#define MIN(a,b)       ((a) < (b) ? (a) : (b))
-#endif
-#ifndef MAX
-#define MAX(a,b)       ((a) < (b) ? (b) : (a))
-#endif
-
-static struct tty_struct *alloc_tty_struct(void)
-{
-       struct tty_struct *tty;
-
-       tty = kmalloc(sizeof(struct tty_struct), GFP_KERNEL);
-       if (tty)
-               memset(tty, 0, sizeof(struct tty_struct));
-       return tty;
-}
-
-static inline void free_tty_struct(struct tty_struct *tty)
-{
-       kfree(tty);
-}
-
-/*
- * This routine returns the name of tty.
- */
-static char *
-_tty_make_name(struct tty_struct *tty, const char *name, char *buf)
-{
-       int idx = (tty)?MINOR(tty->device) - tty->driver.minor_start:0;
-
-       if (!tty) /* Hmm.  NULL pointer.  That's fun. */
-               strcpy(buf, "NULL tty");
-       else
-               sprintf(buf, name,
-                       idx + tty->driver.name_base);
-               
-       return buf;
-}
-
-#define TTY_NUMBER(tty) (MINOR((tty)->device) - (tty)->driver.minor_start + \
-                        (tty)->driver.name_base)
-
-char *tty_name(struct tty_struct *tty, char *buf)
-{
-       return _tty_make_name(tty, (tty)?tty->driver.name:NULL, buf);
-}
-
-inline int tty_paranoia_check(struct tty_struct *tty, kdev_t device,
-                             const char *routine)
-{
-#ifdef TTY_PARANOIA_CHECK
-       static const char badmagic[] = KERN_WARNING
-               "Warning: bad magic number for tty struct (%s) in %s\n";
-       static const char badtty[] = KERN_WARNING
-               "Warning: null TTY for (%s) in %s\n";
-
-       if (!tty) {
-               printk(badtty, kdevname(device), routine);
-               return 1;
-       }
-       if (tty->magic != TTY_MAGIC) {
-               printk(badmagic, kdevname(device), routine);
-               return 1;
-       }
-#endif
-       return 0;
-}
-
-static int check_tty_count(struct tty_struct *tty, const char *routine)
-{
-#ifdef CHECK_TTY_COUNT
-       struct list_head *p;
-       int count = 0;
-       
-       file_list_lock();
-       for(p = tty->tty_files.next; p != &tty->tty_files; p = p->next) {
-               if(list_entry(p, struct file, f_list)->private_data == tty)
-                       count++;
-       }
-       file_list_unlock();
-       if (tty->driver.type == TTY_DRIVER_TYPE_PTY &&
-           tty->driver.subtype == PTY_TYPE_SLAVE &&
-           tty->link && tty->link->count)
-               count++;
-       if (tty->count != count) {
-               printk(KERN_WARNING "Warning: dev (%s) tty->count(%d) "
-                                   "!= #fd's(%d) in %s\n",
-                      kdevname(tty->device), tty->count, count, routine);
-               return count;
-       }       
-#endif
-       return 0;
-}
-
-int tty_register_ldisc(int disc, struct tty_ldisc *new_ldisc)
-{
-       if (disc < N_TTY || disc >= NR_LDISCS)
-               return -EINVAL;
-       
-       if (new_ldisc) {
-               ldiscs[disc] = *new_ldisc;
-               ldiscs[disc].flags |= LDISC_FLAG_DEFINED;
-               ldiscs[disc].num = disc;
-       } else
-               memset(&ldiscs[disc], 0, sizeof(struct tty_ldisc));
-       
-       return 0;
-}
-
-EXPORT_SYMBOL(tty_register_ldisc);
-
-/* Set the discipline of a tty line. */
-static int tty_set_ldisc(struct tty_struct *tty, int ldisc)
-{
-       int     retval = 0;
-       struct  tty_ldisc o_ldisc;
-       char buf[64];
-
-       if ((ldisc < N_TTY) || (ldisc >= NR_LDISCS))
-               return -EINVAL;
-       /* Eduardo Blanco <ejbs@cs.cs.com.uy> */
-       /* Cyrus Durgin <cider@speakeasy.org> */
-       if (!(ldiscs[ldisc].flags & LDISC_FLAG_DEFINED)) {
-               char modname [20];
-               sprintf(modname, "tty-ldisc-%d", ldisc);
-               request_module (modname);
-       }
-       if (!(ldiscs[ldisc].flags & LDISC_FLAG_DEFINED))
-               return -EINVAL;
-
-       if (tty->ldisc.num == ldisc)
-               return 0;       /* We are already in the desired discipline */
-       o_ldisc = tty->ldisc;
-
-       tty_wait_until_sent(tty, 0);
-       
-       /* Shutdown the current discipline. */
-       if (tty->ldisc.close)
-               (tty->ldisc.close)(tty);
-
-       /* Now set up the new line discipline. */
-       tty->ldisc = ldiscs[ldisc];
-       tty->termios->c_line = ldisc;
-       if (tty->ldisc.open)
-               retval = (tty->ldisc.open)(tty);
-       if (retval < 0) {
-               tty->ldisc = o_ldisc;
-               tty->termios->c_line = tty->ldisc.num;
-               if (tty->ldisc.open && (tty->ldisc.open(tty) < 0)) {
-                       tty->ldisc = ldiscs[N_TTY];
-                       tty->termios->c_line = N_TTY;
-                       if (tty->ldisc.open) {
-                               int r = tty->ldisc.open(tty);
-
-                               if (r < 0)
-                                       panic("Couldn't open N_TTY ldisc for "
-                                             "%s --- error %d.",
-                                             tty_name(tty, buf), r);
-                       }
-               }
-       }
-       if (tty->ldisc.num != o_ldisc.num && tty->driver.set_ldisc)
-               tty->driver.set_ldisc(tty);
-       return retval;
-}
-
-/*
- * This routine returns a tty driver structure, given a device number
- */
-struct tty_driver *get_tty_driver(kdev_t device)
-{
-       int     major, minor;
-       struct tty_driver *p;
-       
-       minor = MINOR(device);
-       major = MAJOR(device);
-
-       for (p = tty_drivers; p; p = p->next) {
-               if (p->major != major)
-                       continue;
-               if (minor < p->minor_start)
-                       continue;
-               if (minor >= p->minor_start + p->num)
-                       continue;
-               return p;
-       }
-       return NULL;
-}
-
-/*
- * If we try to write to, or set the state of, a terminal and we're
- * not in the foreground, send a SIGTTOU.  If the signal is blocked or
- * ignored, go ahead and perform the operation.  (POSIX 7.2)
- */
-int tty_check_change(struct tty_struct * tty)
-{
-       if (current->tty != tty)
-               return 0;
-       if (tty->pgrp <= 0) {
-               printk(KERN_WARNING "tty_check_change: tty->pgrp <= 0!\n");
-               return 0;
-       }
-       if (current->pgrp == tty->pgrp)
-               return 0;
-       if (is_ignored(SIGTTOU))
-               return 0;
-       if (is_orphaned_pgrp(current->pgrp))
-               return -EIO;
-       (void) kill_pg(current->pgrp,SIGTTOU,1);
-       return -ERESTARTSYS;
-}
-
-static ssize_t hung_up_tty_read(struct file * file, char * buf,
-                               size_t count, loff_t *ppos)
-{
-       /* Can't seek (pread) on ttys.  */
-       if (ppos != &file->f_pos)
-               return -ESPIPE;
-       return 0;
-}
-
-static ssize_t hung_up_tty_write(struct file * file, const char * buf,
-                                size_t count, loff_t *ppos)
-{
-       /* Can't seek (pwrite) on ttys.  */
-       if (ppos != &file->f_pos)
-               return -ESPIPE;
-       return -EIO;
-}
-
-/* No kernel lock held - none needed ;) */
-static unsigned int hung_up_tty_poll(struct file * filp, poll_table * wait)
-{
-       return POLLIN | POLLOUT | POLLERR | POLLHUP | POLLRDNORM | POLLWRNORM;
-}
-
-static int hung_up_tty_ioctl(struct inode * inode, struct file * file,
-                            unsigned int cmd, unsigned long arg)
-{
-       return cmd == TIOCSPGRP ? -ENOTTY : -EIO;
-}
-
-static struct file_operations tty_fops = {
-       llseek:         no_llseek,
-       read:           tty_read,
-       write:          tty_write,
-       poll:           tty_poll,
-       ioctl:          tty_ioctl,
-       open:           tty_open,
-       release:        tty_release,
-       fasync:         tty_fasync,
-};
-
-static struct file_operations hung_up_tty_fops = {
-       llseek:         no_llseek,
-       read:           hung_up_tty_read,
-       write:          hung_up_tty_write,
-       poll:           hung_up_tty_poll,
-       ioctl:          hung_up_tty_ioctl,
-       release:        tty_release,
-};
-
-static spinlock_t redirect_lock = SPIN_LOCK_UNLOCKED;
-static struct file *redirect;
-/*
- * This can be called by the "eventd" kernel thread.  That is process synchronous,
- * but doesn't hold any locks, so we need to make sure we have the appropriate
- * locks for what we're doing..
- */
-void do_tty_hangup(void *data)
-{
-       struct tty_struct *tty = (struct tty_struct *) data;
-       struct file * cons_filp = NULL;
-       struct file *f = NULL;
-       struct task_struct *p;
-       struct list_head *l;
-       int    closecount = 0, n;
-
-       if (!tty)
-               return;
-
-       /* inuse_filps is protected by the single kernel lock */
-       lock_kernel();
-
-       spin_lock(&redirect_lock);
-       if (redirect && redirect->private_data == tty) {
-               f = redirect;
-               redirect = NULL;
-       }
-       spin_unlock(&redirect_lock);
-       if (f)
-               fput(f);
-       
-       check_tty_count(tty, "do_tty_hangup");
-       file_list_lock();
-       for (l = tty->tty_files.next; l != &tty->tty_files; l = l->next) {
-               struct file * filp = list_entry(l, struct file, f_list);
-               if (filp->f_dentry->d_inode->i_rdev == CONSOLE_DEV ||
-                   filp->f_dentry->d_inode->i_rdev == SYSCONS_DEV) {
-                       cons_filp = filp;
-                       continue;
-               }
-               if (filp->f_op != &tty_fops)
-                       continue;
-               closecount++;
-               tty_fasync(-1, filp, 0);        /* can't block */
-               filp->f_op = &hung_up_tty_fops;
-       }
-       file_list_unlock();
-       
-       /* FIXME! What are the locking issues here? This may me overdoing things.. */
-       {
-               unsigned long flags;
-
-               save_flags(flags); cli();
-               if (tty->ldisc.flush_buffer)
-                       tty->ldisc.flush_buffer(tty);
-               if (tty->driver.flush_buffer)
-                       tty->driver.flush_buffer(tty);
-               if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) &&
-                   tty->ldisc.write_wakeup)
-                       (tty->ldisc.write_wakeup)(tty);
-               restore_flags(flags);
-       }
-
-       wake_up_interruptible(&tty->write_wait);
-       wake_up_interruptible(&tty->read_wait);
-
-       /*
-        * Shutdown the current line discipline, and reset it to
-        * N_TTY.
-        */
-       if (tty->driver.flags & TTY_DRIVER_RESET_TERMIOS)
-               *tty->termios = tty->driver.init_termios;
-       if (tty->ldisc.num != ldiscs[N_TTY].num) {
-               if (tty->ldisc.close)
-                       (tty->ldisc.close)(tty);
-               tty->ldisc = ldiscs[N_TTY];
-               tty->termios->c_line = N_TTY;
-               if (tty->ldisc.open) {
-                       int i = (tty->ldisc.open)(tty);
-                       if (i < 0)
-                               printk(KERN_ERR "do_tty_hangup: N_TTY open: "
-                                               "error %d\n", -i);
-               }
-       }
-       
-       read_lock(&tasklist_lock);
-       for_each_task(p) {
-               if ((tty->session > 0) && (p->session == tty->session) &&
-                   p->leader) {
-                       send_sig(SIGHUP,p,1);
-                       send_sig(SIGCONT,p,1);
-                       if (tty->pgrp > 0)
-                               p->tty_old_pgrp = tty->pgrp;
-               }
-               if (p->tty == tty)
-                       p->tty = NULL;
-       }
-       read_unlock(&tasklist_lock);
-
-       tty->flags = 0;
-       tty->session = 0;
-       tty->pgrp = -1;
-       tty->ctrl_status = 0;
-       /*
-        *      If one of the devices matches a console pointer, we
-        *      cannot just call hangup() because that will cause
-        *      tty->count and state->count to go out of sync.
-        *      So we just call close() the right number of times.
-        */
-       if (cons_filp) {
-               if (tty->driver.close)
-                       for (n = 0; n < closecount; n++)
-                               tty->driver.close(tty, cons_filp);
-       } else if (tty->driver.hangup)
-               (tty->driver.hangup)(tty);
-       unlock_kernel();
-}
-
-void tty_hangup(struct tty_struct * tty)
-{
-#ifdef TTY_DEBUG_HANGUP
-       char    buf[64];
-       
-       printk(KERN_DEBUG "%s hangup...\n", tty_name(tty, buf));
-#endif
-       schedule_task(&tty->tq_hangup);
-}
-
-void tty_vhangup(struct tty_struct * tty)
-{
-#ifdef TTY_DEBUG_HANGUP
-       char    buf[64];
-
-       printk(KERN_DEBUG "%s vhangup...\n", tty_name(tty, buf));
-#endif
-       do_tty_hangup((void *) tty);
-}
-
-int tty_hung_up_p(struct file * filp)
-{
-       return (filp->f_op == &hung_up_tty_fops);
-}
-
-/*
- * This function is typically called only by the session leader, when
- * it wants to disassociate itself from its controlling tty.
- *
- * It performs the following functions:
- *     (1)  Sends a SIGHUP and SIGCONT to the foreground process group
- *     (2)  Clears the tty from being controlling the session
- *     (3)  Clears the controlling tty for all processes in the
- *             session group.
- *
- * The argument on_exit is set to 1 if called when a process is
- * exiting; it is 0 if called by the ioctl TIOCNOTTY.
- */
-void disassociate_ctty(int on_exit)
-{
-       struct tty_struct *tty = current->tty;
-       struct task_struct *p;
-       int tty_pgrp = -1;
-
-       if (tty) {
-               tty_pgrp = tty->pgrp;
-               if (on_exit && tty->driver.type != TTY_DRIVER_TYPE_PTY)
-                       tty_vhangup(tty);
-       } else {
-               if (current->tty_old_pgrp) {
-                       kill_pg(current->tty_old_pgrp, SIGHUP, on_exit);
-                       kill_pg(current->tty_old_pgrp, SIGCONT, on_exit);
-               }
-               return;
-       }
-       if (tty_pgrp > 0) {
-               kill_pg(tty_pgrp, SIGHUP, on_exit);
-               if (!on_exit)
-                       kill_pg(tty_pgrp, SIGCONT, on_exit);
-       }
-
-       current->tty_old_pgrp = 0;
-       tty->session = 0;
-       tty->pgrp = -1;
-
-       read_lock(&tasklist_lock);
-       for_each_task(p)
-               if (p->session == current->session)
-                       p->tty = NULL;
-       read_unlock(&tasklist_lock);
-}
-
-void stop_tty(struct tty_struct *tty)
-{
-       if (tty->stopped)
-               return;
-       tty->stopped = 1;
-       if (tty->link && tty->link->packet) {
-               tty->ctrl_status &= ~TIOCPKT_START;
-               tty->ctrl_status |= TIOCPKT_STOP;
-               wake_up_interruptible(&tty->link->read_wait);
-       }
-       if (tty->driver.stop)
-               (tty->driver.stop)(tty);
-}
-
-void start_tty(struct tty_struct *tty)
-{
-       if (!tty->stopped || tty->flow_stopped)
-               return;
-       tty->stopped = 0;
-       if (tty->link && tty->link->packet) {
-               tty->ctrl_status &= ~TIOCPKT_STOP;
-               tty->ctrl_status |= TIOCPKT_START;
-               wake_up_interruptible(&tty->link->read_wait);
-       }
-       if (tty->driver.start)
-               (tty->driver.start)(tty);
-       if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) &&
-           tty->ldisc.write_wakeup)
-               (tty->ldisc.write_wakeup)(tty);
-       wake_up_interruptible(&tty->write_wait);
-}
-
-static ssize_t tty_read(struct file * file, char * buf, size_t count, 
-                       loff_t *ppos)
-{
-       int i;
-       struct tty_struct * tty;
-       struct inode *inode;
-
-       /* Can't seek (pread) on ttys.  */
-       if (ppos != &file->f_pos)
-               return -ESPIPE;
-
-       tty = (struct tty_struct *)file->private_data;
-       inode = file->f_dentry->d_inode;
-       if (tty_paranoia_check(tty, inode->i_rdev, "tty_read"))
-               return -EIO;
-       if (!tty || (test_bit(TTY_IO_ERROR, &tty->flags)))
-               return -EIO;
-
-       /* This check not only needs to be done before reading, but also
-          whenever read_chan() gets woken up after sleeping, so I've
-          moved it to there.  This should only be done for the N_TTY
-          line discipline, anyway.  Same goes for write_chan(). -- jlc. */
-#if 0
-       if ((inode->i_rdev != CONSOLE_DEV) && /* don't stop on /dev/console */
-           (tty->pgrp > 0) &&
-           (current->tty == tty) &&
-           (tty->pgrp != current->pgrp))
-               if (is_ignored(SIGTTIN) || is_orphaned_pgrp(current->pgrp))
-                       return -EIO;
-               else {
-                       (void) kill_pg(current->pgrp, SIGTTIN, 1);
-                       return -ERESTARTSYS;
-               }
-#endif
-       lock_kernel();
-       if (tty->ldisc.read)
-               i = (tty->ldisc.read)(tty,file,buf,count);
-       else
-               i = -EIO;
-       unlock_kernel();
-       if (i > 0)
-               inode->i_atime = CURRENT_TIME;
-       return i;
-}
-
-/*
- * Split writes up in sane blocksizes to avoid
- * denial-of-service type attacks
- */
-static inline ssize_t do_tty_write(
-       ssize_t (*write)(struct tty_struct *, struct file *, const unsigned char *, size_t),
-       struct tty_struct *tty,
-       struct file *file,
-       const unsigned char *buf,
-       size_t count)
-{
-       ssize_t ret = 0, written = 0;
-       
-       if (file->f_flags & O_NONBLOCK) {
-               if (down_trylock(&tty->atomic_write))
-                       return -EAGAIN;
-       }
-       else {
-               if (down_interruptible(&tty->atomic_write))
-                       return -ERESTARTSYS;
-       }
-       if ( test_bit(TTY_NO_WRITE_SPLIT, &tty->flags) ) {
-               lock_kernel();
-               written = write(tty, file, buf, count);
-               unlock_kernel();
-       } else {
-               for (;;) {
-                       unsigned long size = MAX(PAGE_SIZE*2,16384);
-                       if (size > count)
-                               size = count;
-                       lock_kernel();
-                       ret = write(tty, file, buf, size);
-                       unlock_kernel();
-                       if (ret <= 0)
-                               break;
-                       written += ret;
-                       buf += ret;
-                       count -= ret;
-                       if (!count)
-                               break;
-                       ret = -ERESTARTSYS;
-                       if (signal_pending(current))
-                               break;
-                       if (current->need_resched)
-                               schedule();
-               }
-       }
-       if (written) {
-               file->f_dentry->d_inode->i_mtime = CURRENT_TIME;
-               ret = written;
-       }
-       up(&tty->atomic_write);
-       return ret;
-}
-
-
-static ssize_t tty_write(struct file * file, const char * buf, size_t count,
-                        loff_t *ppos)
-{
-       int is_console;
-       struct tty_struct * tty;
-       struct inode *inode = file->f_dentry->d_inode;
-
-       /* Can't seek (pwrite) on ttys.  */
-       if (ppos != &file->f_pos)
-               return -ESPIPE;
-
-       /*
-        *      For now, we redirect writes from /dev/console as
-        *      well as /dev/tty0.
-        */
-       inode = file->f_dentry->d_inode;
-       is_console = (inode->i_rdev == SYSCONS_DEV ||
-                     inode->i_rdev == CONSOLE_DEV);
-
-       if (is_console) {
-               struct file *p = NULL;
-
-               spin_lock(&redirect_lock);
-               if (redirect) {
-                       get_file(redirect);
-                       p = redirect;
-               }
-               spin_unlock(&redirect_lock);
-
-               if (p) {
-                       ssize_t res = p->f_op->write(p, buf, count, &p->f_pos);
-                       fput(p);
-                       return res;
-               }
-       }
-
-       tty = (struct tty_struct *)file->private_data;
-       if (tty_paranoia_check(tty, inode->i_rdev, "tty_write"))
-               return -EIO;
-       if (!tty || !tty->driver.write || (test_bit(TTY_IO_ERROR, &tty->flags)))
-               return -EIO;
-#if 0
-       if (!is_console && L_TOSTOP(tty) && (tty->pgrp > 0) &&
-           (current->tty == tty) && (tty->pgrp != current->pgrp)) {
-               if (is_orphaned_pgrp(current->pgrp))
-                       return -EIO;
-               if (!is_ignored(SIGTTOU)) {
-                       (void) kill_pg(current->pgrp, SIGTTOU, 1);
-                       return -ERESTARTSYS;
-               }
-       }
-#endif
-       if (!tty->ldisc.write)
-               return -EIO;
-       return do_tty_write(tty->ldisc.write, tty, file,
-                           (const unsigned char *)buf, count);
-}
-
-/* Semaphore to protect creating and releasing a tty */
-static DECLARE_MUTEX(tty_sem);
-
-static void down_tty_sem(int index)
-{
-       down(&tty_sem);
-}
-
-static void up_tty_sem(int index)
-{
-       up(&tty_sem);
-}
-
-static void release_mem(struct tty_struct *tty, int idx);
-
-/*
- * WSH 06/09/97: Rewritten to remove races and properly clean up after a
- * failed open.  The new code protects the open with a semaphore, so it's
- * really quite straightforward.  The semaphore locking can probably be
- * relaxed for the (most common) case of reopening a tty.
- */
-static int init_dev(kdev_t device, struct tty_struct **ret_tty)
-{
-       struct tty_struct *tty, *o_tty;
-       struct termios *tp, **tp_loc, *o_tp, **o_tp_loc;
-       struct termios *ltp, **ltp_loc, *o_ltp, **o_ltp_loc;
-       struct tty_driver *driver;      
-       int retval=0;
-       int idx;
-
-       driver = get_tty_driver(device);
-       if (!driver) {
-         return -ENODEV;
-       }
-
-       idx = MINOR(device) - driver->minor_start;
-
-       /* 
-        * Check whether we need to acquire the tty semaphore to avoid
-        * race conditions.  For now, play it safe.
-        */
-       down_tty_sem(idx);
-
-       /* check whether we're reopening an existing tty */
-       tty = driver->table[idx];
-       if (tty) goto fast_track;
-
-       /*
-        * First time open is complex, especially for PTY devices.
-        * This code guarantees that either everything succeeds and the
-        * TTY is ready for operation, or else the table slots are vacated
-        * and the allocated memory released.  (Except that the termios 
-        * and locked termios may be retained.)
-        */
-
-       o_tty = NULL;
-       tp = o_tp = NULL;
-       ltp = o_ltp = NULL;
-
-       tty = alloc_tty_struct();
-       if(!tty)
-               goto fail_no_mem;
-       initialize_tty_struct(tty);
-       tty->device = device;
-       tty->driver = *driver;
-
-       tp_loc = &driver->termios[idx];
-       if (!*tp_loc) {
-               tp = (struct termios *) kmalloc(sizeof(struct termios),
-                                               GFP_KERNEL);
-               if (!tp)
-                       goto free_mem_out;
-               *tp = driver->init_termios;
-       }
-
-       ltp_loc = &driver->termios_locked[idx];
-       if (!*ltp_loc) {
-               ltp = (struct termios *) kmalloc(sizeof(struct termios),
-                                                GFP_KERNEL);
-               if (!ltp)
-                       goto free_mem_out;
-               memset(ltp, 0, sizeof(struct termios));
-       }
-
-       if (driver->type == TTY_DRIVER_TYPE_PTY) {
-               o_tty = alloc_tty_struct();
-               if (!o_tty)
-                       goto free_mem_out;
-               initialize_tty_struct(o_tty);
-               o_tty->device = (kdev_t) MKDEV(driver->other->major,
-                                       driver->other->minor_start + idx);
-               o_tty->driver = *driver->other;
-
-               o_tp_loc  = &driver->other->termios[idx];
-               if (!*o_tp_loc) {
-                       o_tp = (struct termios *)
-                               kmalloc(sizeof(struct termios), GFP_KERNEL);
-                       if (!o_tp)
-                               goto free_mem_out;
-                       *o_tp = driver->other->init_termios;
-               }
-
-               o_ltp_loc = &driver->other->termios_locked[idx];
-               if (!*o_ltp_loc) {
-                       o_ltp = (struct termios *)
-                               kmalloc(sizeof(struct termios), GFP_KERNEL);
-                       if (!o_ltp)
-                               goto free_mem_out;
-                       memset(o_ltp, 0, sizeof(struct termios));
-               }
-
-               /*
-                * Everything allocated ... set up the o_tty structure.
-                */
-               driver->other->table[idx] = o_tty;
-               if (!*o_tp_loc)
-                       *o_tp_loc = o_tp;
-               if (!*o_ltp_loc)
-                       *o_ltp_loc = o_ltp;
-               o_tty->termios = *o_tp_loc;
-               o_tty->termios_locked = *o_ltp_loc;
-               (*driver->other->refcount)++;
-               if (driver->subtype == PTY_TYPE_MASTER)
-                       o_tty->count++;
-
-               /* Establish the links in both directions */
-               tty->link   = o_tty;
-               o_tty->link = tty;
-       }
-
-       /* 
-        * All structures have been allocated, so now we install them.
-        * Failures after this point use release_mem to clean up, so 
-        * there's no need to null out the local pointers.
-        */
-       driver->table[idx] = tty;
-       
-       if (!*tp_loc)
-               *tp_loc = tp;
-       if (!*ltp_loc)
-               *ltp_loc = ltp;
-       tty->termios = *tp_loc;
-       tty->termios_locked = *ltp_loc;
-       (*driver->refcount)++;
-       tty->count++;
-
-       /* 
-        * Structures all installed ... call the ldisc open routines.
-        * If we fail here just call release_mem to clean up.  No need
-        * to decrement the use counts, as release_mem doesn't care.
-        */
-       if (tty->ldisc.open) {
-               retval = (tty->ldisc.open)(tty);
-               if (retval)
-                       goto release_mem_out;
-       }
-       if (o_tty && o_tty->ldisc.open) {
-               retval = (o_tty->ldisc.open)(o_tty);
-               if (retval) {
-                       if (tty->ldisc.close)
-                               (tty->ldisc.close)(tty);
-                       goto release_mem_out;
-               }
-       }
-       goto success;
-
-       /*
-        * This fast open can be used if the tty is already open.
-        * No memory is allocated, and the only failures are from
-        * attempting to open a closing tty or attempting multiple
-        * opens on a pty master.
-        */
-fast_track:
-       if (test_bit(TTY_CLOSING, &tty->flags)) {
-               retval = -EIO;
-               goto end_init;
-       }
-       if (driver->type == TTY_DRIVER_TYPE_PTY &&
-           driver->subtype == PTY_TYPE_MASTER) {
-               /*
-                * special case for PTY masters: only one open permitted, 
-                * and the slave side open count is incremented as well.
-                */
-               if (tty->count) {
-                       retval = -EIO;
-                       goto end_init;
-               }
-               tty->link->count++;
-       }
-       tty->count++;
-       tty->driver = *driver; /* N.B. why do this every time?? */
-
-success:
-       *ret_tty = tty;
-       
-       /* All paths come through here to release the semaphore */
-end_init:
-       up_tty_sem(idx);
-       return retval;
-
-       /* Release locally allocated memory ... nothing placed in slots */
-free_mem_out:
-       if (o_tp)
-               kfree(o_tp);
-       if (o_tty)
-               free_tty_struct(o_tty);
-       if (ltp)
-               kfree(ltp);
-       if (tp)
-               kfree(tp);
-       free_tty_struct(tty);
-
-fail_no_mem:
-       retval = -ENOMEM;
-       goto end_init;
-
-       /* call the tty release_mem routine to clean out this slot */
-release_mem_out:
-       printk(KERN_INFO "init_dev: ldisc open failed, "
-                        "clearing slot %d\n", idx);
-       release_mem(tty, idx);
-       goto end_init;
-}
-
-/*
- * Releases memory associated with a tty structure, and clears out the
- * driver table slots.
- */
-static void release_mem(struct tty_struct *tty, int idx)
-{
-       struct tty_struct *o_tty;
-       struct termios *tp;
-
-       if ((o_tty = tty->link) != NULL) {
-               o_tty->driver.table[idx] = NULL;
-               if (o_tty->driver.flags & TTY_DRIVER_RESET_TERMIOS) {
-                       tp = o_tty->driver.termios[idx];
-                       o_tty->driver.termios[idx] = NULL;
-                       kfree(tp);
-               }
-               o_tty->magic = 0;
-               (*o_tty->driver.refcount)--;
-               list_del(&o_tty->tty_files);
-               free_tty_struct(o_tty);
-       }
-
-       tty->driver.table[idx] = NULL;
-       if (tty->driver.flags & TTY_DRIVER_RESET_TERMIOS) {
-               tp = tty->driver.termios[idx];
-               tty->driver.termios[idx] = NULL;
-               kfree(tp);
-       }
-       tty->magic = 0;
-       (*tty->driver.refcount)--;
-       list_del(&tty->tty_files);
-       free_tty_struct(tty);
-}
-
-/*
- * Even releasing the tty structures is a tricky business.. We have
- * to be very careful that the structures are all released at the
- * same time, as interrupts might otherwise get the wrong pointers.
- *
- * WSH 09/09/97: rewritten to avoid some nasty race conditions that could
- * lead to double frees or releasing memory still in use.
- */
-static void release_dev(struct file * filp)
-{
-       struct tty_struct *tty, *o_tty;
-       int     pty_master, tty_closing, o_tty_closing, do_sleep;
-       int     idx;
-       char    buf[64];
-       
-       tty = (struct tty_struct *)filp->private_data;
-       if (tty_paranoia_check(tty, filp->f_dentry->d_inode->i_rdev, "release_dev"))
-               return;
-
-       check_tty_count(tty, "release_dev");
-
-       tty_fasync(-1, filp, 0);
-
-       idx = MINOR(tty->device) - tty->driver.minor_start;
-       pty_master = (tty->driver.type == TTY_DRIVER_TYPE_PTY &&
-                     tty->driver.subtype == PTY_TYPE_MASTER);
-       o_tty = tty->link;
-
-#ifdef TTY_PARANOIA_CHECK
-       if (idx < 0 || idx >= tty->driver.num) {
-               printk(KERN_DEBUG "release_dev: bad idx when trying to "
-                                 "free (%s)\n", kdevname(tty->device));
-               return;
-       }
-       if (tty != tty->driver.table[idx]) {
-               printk(KERN_DEBUG "release_dev: driver.table[%d] not tty "
-                                 "for (%s)\n", idx, kdevname(tty->device));
-               return;
-       }
-       if (tty->termios != tty->driver.termios[idx]) {
-               printk(KERN_DEBUG "release_dev: driver.termios[%d] not termios "
-                      "for (%s)\n",
-                      idx, kdevname(tty->device));
-               return;
-       }
-       if (tty->termios_locked != tty->driver.termios_locked[idx]) {
-               printk(KERN_DEBUG "release_dev: driver.termios_locked[%d] not "
-                      "termios_locked for (%s)\n",
-                      idx, kdevname(tty->device));
-               return;
-       }
-#endif
-
-#ifdef TTY_DEBUG_HANGUP
-       printk(KERN_DEBUG "release_dev of %s (tty count=%d)...",
-              tty_name(tty, buf), tty->count);
-#endif
-
-#ifdef TTY_PARANOIA_CHECK
-       if (tty->driver.other) {
-               if (o_tty != tty->driver.other->table[idx]) {
-                       printk(KERN_DEBUG "release_dev: other->table[%d] "
-                                         "not o_tty for (%s)\n",
-                              idx, kdevname(tty->device));
-                       return;
-               }
-               if (o_tty->termios != tty->driver.other->termios[idx]) {
-                       printk(KERN_DEBUG "release_dev: other->termios[%d] "
-                                         "not o_termios for (%s)\n",
-                              idx, kdevname(tty->device));
-                       return;
-               }
-               if (o_tty->termios_locked != 
-                     tty->driver.other->termios_locked[idx]) {
-                       printk(KERN_DEBUG "release_dev: other->termios_locked["
-                                         "%d] not o_termios_locked for (%s)\n",
-                              idx, kdevname(tty->device));
-                       return;
-               }
-               if (o_tty->link != tty) {
-                       printk(KERN_DEBUG "release_dev: bad pty pointers\n");
-                       return;
-               }
-       }
-#endif
-
-       if (tty->driver.close)
-               tty->driver.close(tty, filp);
-
-       /*
-        * Sanity check: if tty->count is going to zero, there shouldn't be
-        * any waiters on tty->read_wait or tty->write_wait.  We test the
-        * wait queues and kick everyone out _before_ actually starting to
-        * close.  This ensures that we won't block while releasing the tty
-        * structure.
-        *
-        * The test for the o_tty closing is necessary, since the master and
-        * slave sides may close in any order.  If the slave side closes out
-        * first, its count will be one, since the master side holds an open.
-        * Thus this test wouldn't be triggered at the time the slave closes,
-        * so we do it now.
-        *
-        * Note that it's possible for the tty to be opened again while we're
-        * flushing out waiters.  By recalculating the closing flags before
-        * each iteration we avoid any problems.
-        */
-       while (1) {
-               tty_closing = tty->count <= 1;
-               o_tty_closing = o_tty &&
-                       (o_tty->count <= (pty_master ? 1 : 0));
-               do_sleep = 0;
-
-               if (tty_closing) {
-                       if (waitqueue_active(&tty->read_wait)) {
-                               wake_up(&tty->read_wait);
-                               do_sleep++;
-                       }
-                       if (waitqueue_active(&tty->write_wait)) {
-                               wake_up(&tty->write_wait);
-                               do_sleep++;
-                       }
-               }
-               if (o_tty_closing) {
-                       if (waitqueue_active(&o_tty->read_wait)) {
-                               wake_up(&o_tty->read_wait);
-                               do_sleep++;
-                       }
-                       if (waitqueue_active(&o_tty->write_wait)) {
-                               wake_up(&o_tty->write_wait);
-                               do_sleep++;
-                       }
-               }
-               if (!do_sleep)
-                       break;
-
-               printk(KERN_WARNING "release_dev: %s: read/write wait queue "
-                                   "active!\n", tty_name(tty, buf));
-               schedule();
-       }       
-
-       /*
-        * The closing flags are now consistent with the open counts on 
-        * both sides, and we've completed the last operation that could 
-        * block, so it's safe to proceed with closing.
-        */
-       if (pty_master) {
-               if (--o_tty->count < 0) {
-                       printk(KERN_WARNING "release_dev: bad pty slave count "
-                                           "(%d) for %s\n",
-                              o_tty->count, tty_name(o_tty, buf));
-                       o_tty->count = 0;
-               }
-       }
-       if (--tty->count < 0) {
-               printk(KERN_WARNING "release_dev: bad tty->count (%d) for %s\n",
-                      tty->count, tty_name(tty, buf));
-               tty->count = 0;
-       }
-
-       /*
-        * We've decremented tty->count, so we should zero out
-        * filp->private_data, to break the link between the tty and
-        * the file descriptor.  Otherwise if filp_close() blocks before
-        * the file descriptor is removed from the inuse_filp
-        * list, check_tty_count() could observe a discrepancy and
-        * printk a warning message to the user.
-        */
-       filp->private_data = 0;
-
-       /*
-        * Perform some housekeeping before deciding whether to return.
-        *
-        * Set the TTY_CLOSING flag if this was the last open.  In the
-        * case of a pty we may have to wait around for the other side
-        * to close, and TTY_CLOSING makes sure we can't be reopened.
-        */
-       if(tty_closing)
-               set_bit(TTY_CLOSING, &tty->flags);
-       if(o_tty_closing)
-               set_bit(TTY_CLOSING, &o_tty->flags);
-
-       /*
-        * If _either_ side is closing, make sure there aren't any
-        * processes that still think tty or o_tty is their controlling
-        * tty.
-        */
-       if (tty_closing || o_tty_closing) {
-               struct task_struct *p;
-
-               read_lock(&tasklist_lock);
-               for_each_task(p) {
-                       if (p->tty == tty || (o_tty && p->tty == o_tty))
-                               p->tty = NULL;
-               }
-               read_unlock(&tasklist_lock);
-       }
-
-       /* check whether both sides are closing ... */
-       if (!tty_closing || (o_tty && !o_tty_closing))
-               return;
-       
-#ifdef TTY_DEBUG_HANGUP
-       printk(KERN_DEBUG "freeing tty structure...");
-#endif
-
-       /*
-        * Shutdown the current line discipline, and reset it to N_TTY.
-        * N.B. why reset ldisc when we're releasing the memory??
-        */
-       if (tty->ldisc.close)
-               (tty->ldisc.close)(tty);
-       tty->ldisc = ldiscs[N_TTY];
-       tty->termios->c_line = N_TTY;
-       if (o_tty) {
-               if (o_tty->ldisc.close)
-                       (o_tty->ldisc.close)(o_tty);
-               o_tty->ldisc = ldiscs[N_TTY];
-       }
-       
-       /*
-        * Make sure that the tty's task queue isn't activated. 
-        */
-       run_task_queue(&tq_timer);
-       flush_scheduled_tasks();
-
-       /* 
-        * The release_mem function takes care of the details of clearing
-        * the slots and preserving the termios structure.
-        */
-       release_mem(tty, idx);
-}
-
-/*
- * tty_open and tty_release keep up the tty count that contains the
- * number of opens done on a tty. We cannot use the inode-count, as
- * different inodes might point to the same tty.
- *
- * Open-counting is needed for pty masters, as well as for keeping
- * track of serial lines: DTR is dropped when the last close happens.
- * (This is not done solely through tty->count, now.  - Ted 1/27/92)
- *
- * The termios state of a pty is reset on first open so that
- * settings don't persist across reuse.
- */
-static int tty_open(struct inode * inode, struct file * filp)
-{
-       struct tty_struct *tty;
-       int noctty, retval;
-       kdev_t device;
-       unsigned short saved_flags;
-       char    buf[64];
-
-       saved_flags = filp->f_flags;
-retry_open:
-       noctty = filp->f_flags & O_NOCTTY;
-       device = inode->i_rdev;
-       if (device == TTY_DEV) {
-               if (!current->tty)
-                       return -ENXIO;
-               device = current->tty->device;
-               filp->f_flags |= O_NONBLOCK; /* Don't let /dev/tty block */
-               /* noctty = 1; */
-       }
-#ifdef CONFIG_VT
-       if (device == CONSOLE_DEV) {
-               extern int fg_console;
-               device = MKDEV(TTY_MAJOR, fg_console + 1);
-               noctty = 1;
-       }
-#endif
-       if (device == SYSCONS_DEV) {
-               struct console *c = console_drivers;
-               while(c && !c->device)
-                       c = c->next;
-               if (!c)
-                        return -ENODEV;
-                device = c->device(c);
-               filp->f_flags |= O_NONBLOCK; /* Don't let /dev/console block */
-               noctty = 1;
-       }
-
-       if (device == PTMX_DEV) {
-#ifdef CONFIG_UNIX98_PTYS
-
-               /* find a free pty. */
-               int major, minor;
-               struct tty_driver *driver;
-
-               /* find a device that is not in use. */
-               retval = -1;
-               for ( major = 0 ; major < UNIX98_NR_MAJORS ; major++ ) {
-                       driver = &ptm_driver[major];
-                       for (minor = driver->minor_start ;
-                            minor < driver->minor_start + driver->num ;
-                            minor++) {
-                               device = MKDEV(driver->major, minor);
-                               if (!init_dev(device, &tty)) goto ptmx_found; /* ok! */
-                       }
-               }
-               return -EIO; /* no free ptys */
-       ptmx_found:
-               set_bit(TTY_PTY_LOCK, &tty->flags); /* LOCK THE SLAVE */
-               minor -= driver->minor_start;
-               devpts_pty_new(driver->other->name_base + minor, MKDEV(driver->other->major, minor + driver->other->minor_start));
-               tty_register_devfs(&pts_driver[major], DEVFS_FL_DEFAULT,
-                                  pts_driver[major].minor_start + minor);
-               noctty = 1;
-               goto init_dev_done;
-
-#else   /* CONFIG_UNIX_98_PTYS */
-
-               return -ENODEV;
-
-#endif  /* CONFIG_UNIX_98_PTYS */
-       }
-
-       retval = init_dev(device, &tty);
-       if (retval)
-               return retval;
-
-#ifdef CONFIG_UNIX98_PTYS
-init_dev_done:
-#endif
-       filp->private_data = tty;
-       file_move(filp, &tty->tty_files);
-       check_tty_count(tty, "tty_open");
-       if (tty->driver.type == TTY_DRIVER_TYPE_PTY &&
-           tty->driver.subtype == PTY_TYPE_MASTER)
-               noctty = 1;
-#ifdef TTY_DEBUG_HANGUP
-       printk(KERN_DEBUG "opening %s...", tty_name(tty, buf));
-#endif
-       if (tty->driver.open)
-               retval = tty->driver.open(tty, filp);
-       else
-               retval = -ENODEV;
-       filp->f_flags = saved_flags;
-
-       if (!retval && test_bit(TTY_EXCLUSIVE, &tty->flags) && !suser())
-               retval = -EBUSY;
-
-       if (retval) {
-#ifdef TTY_DEBUG_HANGUP
-               printk(KERN_DEBUG "error %d in opening %s...", retval,
-                      tty_name(tty, buf));
-#endif
-
-               release_dev(filp);
-               if (retval != -ERESTARTSYS)
-                       return retval;
-               if (signal_pending(current))
-                       return retval;
-               schedule();
-               /*
-                * Need to reset f_op in case a hangup happened.
-                */
-               filp->f_op = &tty_fops;
-               goto retry_open;
-       }
-       if (!noctty &&
-           current->leader &&
-           !current->tty &&
-           tty->session == 0) {
-               task_lock(current);
-               current->tty = tty;
-               task_unlock(current);
-               current->tty_old_pgrp = 0;
-               tty->session = current->session;
-               tty->pgrp = current->pgrp;
-       }
-       if ((tty->driver.type == TTY_DRIVER_TYPE_SERIAL) &&
-           (tty->driver.subtype == SERIAL_TYPE_CALLOUT) &&
-           (tty->count == 1)) {
-               static int nr_warns;
-               if (nr_warns < 5) {
-                       printk(KERN_WARNING "tty_io.c: "
-                               "process %d (%s) used obsolete /dev/%s - "
-                               "update software to use /dev/ttyS%d\n",
-                               current->pid, current->comm,
-                               tty_name(tty, buf), TTY_NUMBER(tty));
-                       nr_warns++;
-               }
-       }
-       return 0;
-}
-
-static int tty_release(struct inode * inode, struct file * filp)
-{
-       lock_kernel();
-       release_dev(filp);
-       unlock_kernel();
-       return 0;
-}
-
-/* No kernel lock held - fine */
-static unsigned int tty_poll(struct file * filp, poll_table * wait)
-{
-       struct tty_struct * tty;
-
-       tty = (struct tty_struct *)filp->private_data;
-       if (tty_paranoia_check(tty, filp->f_dentry->d_inode->i_rdev, "tty_poll"))
-               return 0;
-
-       if (tty->ldisc.poll)
-               return (tty->ldisc.poll)(tty, filp, wait);
-       return 0;
-}
-
-static int tty_fasync(int fd, struct file * filp, int on)
-{
-       struct tty_struct * tty;
-       int retval;
-
-       tty = (struct tty_struct *)filp->private_data;
-       if (tty_paranoia_check(tty, filp->f_dentry->d_inode->i_rdev, "tty_fasync"))
-               return 0;
-       
-       retval = fasync_helper(fd, filp, on, &tty->fasync);
-       if (retval <= 0)
-               return retval;
-
-       if (on) {
-               if (!waitqueue_active(&tty->read_wait))
-                       tty->minimum_to_wake = 1;
-               if (filp->f_owner.pid == 0) {
-                       filp->f_owner.pid = (-tty->pgrp) ? : current->pid;
-                       filp->f_owner.uid = current->uid;
-                       filp->f_owner.euid = current->euid;
-               }
-       } else {
-               if (!tty->fasync && !waitqueue_active(&tty->read_wait))
-                       tty->minimum_to_wake = N_TTY_BUF_SIZE;
-       }
-       return 0;
-}
-
-static int tiocsti(struct tty_struct *tty, char * arg)
-{
-       char ch, mbz = 0;
-
-       if ((current->tty != tty) && !suser())
-               return -EPERM;
-       if (get_user(ch, arg))
-               return -EFAULT;
-       tty->ldisc.receive_buf(tty, &ch, &mbz, 1);
-       return 0;
-}
-
-static int tiocgwinsz(struct tty_struct *tty, struct winsize * arg)
-{
-       if (copy_to_user(arg, &tty->winsize, sizeof(*arg)))
-               return -EFAULT;
-       return 0;
-}
-
-static int tiocswinsz(struct tty_struct *tty, struct tty_struct *real_tty,
-       struct winsize * arg)
-{
-       struct winsize tmp_ws;
-
-       if (copy_from_user(&tmp_ws, arg, sizeof(*arg)))
-               return -EFAULT;
-       if (!memcmp(&tmp_ws, &tty->winsize, sizeof(*arg)))
-               return 0;
-       if (tty->pgrp > 0)
-               kill_pg(tty->pgrp, SIGWINCH, 1);
-       if ((real_tty->pgrp != tty->pgrp) && (real_tty->pgrp > 0))
-               kill_pg(real_tty->pgrp, SIGWINCH, 1);
-       tty->winsize = tmp_ws;
-       real_tty->winsize = tmp_ws;
-       return 0;
-}
-
-static int tioccons(struct inode *inode, struct file *file)
-{
-       if (inode->i_rdev == SYSCONS_DEV ||
-           inode->i_rdev == CONSOLE_DEV) {
-               struct file *f;
-               if (!suser())
-                       return -EPERM;
-               spin_lock(&redirect_lock);
-               f = redirect;
-               redirect = NULL;
-               spin_unlock(&redirect_lock);
-               if (f)
-                       fput(f);
-               return 0;
-       }
-       spin_lock(&redirect_lock);
-       if (redirect) {
-               spin_unlock(&redirect_lock);
-               return -EBUSY;
-       }
-       get_file(file);
-       redirect = file;
-       spin_unlock(&redirect_lock);
-       return 0;
-}
-
-
-static int fionbio(struct file *file, int *arg)
-{
-       int nonblock;
-
-       if (get_user(nonblock, arg))
-               return -EFAULT;
-
-       if (nonblock)
-               file->f_flags |= O_NONBLOCK;
-       else
-               file->f_flags &= ~O_NONBLOCK;
-       return 0;
-}
-
-static int tiocsctty(struct tty_struct *tty, int arg)
-{
-       if (current->leader &&
-           (current->session == tty->session))
-               return 0;
-       /*
-        * The process must be a session leader and
-        * not have a controlling tty already.
-        */
-       if (!current->leader || current->tty)
-               return -EPERM;
-       if (tty->session > 0) {
-               /*
-                * This tty is already the controlling
-                * tty for another session group!
-                */
-               if ((arg == 1) && suser()) {
-                       /*
-                        * Steal it away
-                        */
-                       struct task_struct *p;
-
-                       read_lock(&tasklist_lock);
-                       for_each_task(p)
-                               if (p->tty == tty)
-                                       p->tty = NULL;
-                       read_unlock(&tasklist_lock);
-               } else
-                       return -EPERM;
-       }
-       task_lock(current);
-       current->tty = tty;
-       task_unlock(current);
-       current->tty_old_pgrp = 0;
-       tty->session = current->session;
-       tty->pgrp = current->pgrp;
-       return 0;
-}
-
-static int tiocgpgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t *arg)
-{
-       /*
-        * (tty == real_tty) is a cheap way of
-        * testing if the tty is NOT a master pty.
-        */
-       if (tty == real_tty && current->tty != real_tty)
-               return -ENOTTY;
-       return put_user(real_tty->pgrp, arg);
-}
-
-static int tiocspgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t *arg)
-{
-       pid_t pgrp;
-       int retval = tty_check_change(real_tty);
-
-       if (retval == -EIO)
-               return -ENOTTY;
-       if (retval)
-               return retval;
-       if (!current->tty ||
-           (current->tty != real_tty) ||
-           (real_tty->session != current->session))
-               return -ENOTTY;
-       if (get_user(pgrp, (pid_t *) arg))
-               return -EFAULT;
-       if (pgrp < 0)
-               return -EINVAL;
-       if (session_of_pgrp(pgrp) != current->session)
-               return -EPERM;
-       real_tty->pgrp = pgrp;
-       return 0;
-}
-
-static int tiocgsid(struct tty_struct *tty, struct tty_struct *real_tty, pid_t *arg)
-{
-       /*
-        * (tty == real_tty) is a cheap way of
-        * testing if the tty is NOT a master pty.
-       */
-       if (tty == real_tty && current->tty != real_tty)
-               return -ENOTTY;
-       if (real_tty->session <= 0)
-               return -ENOTTY;
-       return put_user(real_tty->session, arg);
-}
-
-static int tiocttygstruct(struct tty_struct *tty, struct tty_struct *arg)
-{
-       if (copy_to_user(arg, tty, sizeof(*arg)))
-               return -EFAULT;
-       return 0;
-}
-
-static int tiocsetd(struct tty_struct *tty, int *arg)
-{
-       int ldisc;
-
-       if (get_user(ldisc, arg))
-               return -EFAULT;
-       return tty_set_ldisc(tty, ldisc);
-}
-
-static int send_break(struct tty_struct *tty, int duration)
-{
-       set_current_state(TASK_INTERRUPTIBLE);
-
-       tty->driver.break_ctl(tty, -1);
-       if (!signal_pending(current))
-               schedule_timeout(duration);
-       tty->driver.break_ctl(tty, 0);
-       if (signal_pending(current))
-               return -EINTR;
-       return 0;
-}
-
-static int tty_generic_brk(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg)
-{
-       if (cmd == TCSBRK && arg) 
-       {
-               /* tcdrain case */
-               int retval = tty_check_change(tty);
-               if (retval)
-                       return retval;
-               tty_wait_until_sent(tty, 0);
-               if (signal_pending(current))
-                       return -EINTR;
-       }
-       return 0;
-}
-
-/*
- * Split this up, as gcc can choke on it otherwise..
- */
-int tty_ioctl(struct inode * inode, struct file * file,
-             unsigned int cmd, unsigned long arg)
-{
-       struct tty_struct *tty, *real_tty;
-       int retval;
-       
-       tty = (struct tty_struct *)file->private_data;
-       if (tty_paranoia_check(tty, inode->i_rdev, "tty_ioctl"))
-               return -EINVAL;
-
-       real_tty = tty;
-       if (tty->driver.type == TTY_DRIVER_TYPE_PTY &&
-           tty->driver.subtype == PTY_TYPE_MASTER)
-               real_tty = tty->link;
-
-       /*
-        * Break handling by driver
-        */
-       if (!tty->driver.break_ctl) {
-               switch(cmd) {
-               case TIOCSBRK:
-               case TIOCCBRK:
-                       if (tty->driver.ioctl)
-                               return tty->driver.ioctl(tty, file, cmd, arg);
-                       return -EINVAL;
-                       
-               /* These two ioctl's always return success; even if */
-               /* the driver doesn't support them. */
-               case TCSBRK:
-               case TCSBRKP:
-                       retval = -ENOIOCTLCMD;
-                       if (tty->driver.ioctl)
-                               retval = tty->driver.ioctl(tty, file, cmd, arg);
-                       /* Not driver handled */
-                       if (retval == -ENOIOCTLCMD)
-                               retval = tty_generic_brk(tty, file, cmd, arg);
-                       return retval;
-               }
-       }
-
-       /*
-        * Factor out some common prep work
-        */
-       switch (cmd) {
-       case TIOCSETD:
-       case TIOCSBRK:
-       case TIOCCBRK:
-       case TCSBRK:
-       case TCSBRKP:                   
-               retval = tty_check_change(tty);
-               if (retval)
-                       return retval;
-               if (cmd != TIOCCBRK) {
-                       tty_wait_until_sent(tty, 0);
-                       if (signal_pending(current))
-                               return -EINTR;
-               }
-               break;
-       }
-
-       switch (cmd) {
-               case TIOCSTI:
-                       return tiocsti(tty, (char *)arg);
-               case TIOCGWINSZ:
-                       return tiocgwinsz(tty, (struct winsize *) arg);
-               case TIOCSWINSZ:
-                       return tiocswinsz(tty, real_tty, (struct winsize *) arg);
-               case TIOCCONS:
-                       return real_tty!=tty ? -EINVAL : tioccons(inode, file);
-               case FIONBIO:
-                       return fionbio(file, (int *) arg);
-               case TIOCEXCL:
-                       set_bit(TTY_EXCLUSIVE, &tty->flags);
-                       return 0;
-               case TIOCNXCL:
-                       clear_bit(TTY_EXCLUSIVE, &tty->flags);
-                       return 0;
-               case TIOCNOTTY:
-                       if (current->tty != tty)
-                               return -ENOTTY;
-                       if (current->leader)
-                               disassociate_ctty(0);
-                       task_lock(current);
-                       current->tty = NULL;
-                       task_unlock(current);
-                       return 0;
-               case TIOCSCTTY:
-                       return tiocsctty(tty, arg);
-               case TIOCGPGRP:
-                       return tiocgpgrp(tty, real_tty, (pid_t *) arg);
-               case TIOCSPGRP:
-                       return tiocspgrp(tty, real_tty, (pid_t *) arg);
-               case TIOCGSID:
-                       return tiocgsid(tty, real_tty, (pid_t *) arg);
-               case TIOCGETD:
-                       return put_user(tty->ldisc.num, (int *) arg);
-               case TIOCSETD:
-                       return tiocsetd(tty, (int *) arg);
-#ifdef CONFIG_VT
-               case TIOCLINUX:
-                       return tioclinux(tty, arg);
-#endif
-               case TIOCTTYGSTRUCT:
-                       return tiocttygstruct(tty, (struct tty_struct *) arg);
-
-               /*
-                * Break handling
-                */
-               case TIOCSBRK:  /* Turn break on, unconditionally */
-                       tty->driver.break_ctl(tty, -1);
-                       return 0;
-                       
-               case TIOCCBRK:  /* Turn break off, unconditionally */
-                       tty->driver.break_ctl(tty, 0);
-                       return 0;
-               case TCSBRK:   /* SVID version: non-zero arg --> no break */
-                       /*
-                        * XXX is the above comment correct, or the
-                        * code below correct?  Is this ioctl used at
-                        * all by anyone?
-                        */
-                       if (!arg)
-                               return send_break(tty, HZ/4);
-                       return 0;
-               case TCSBRKP:   /* support for POSIX tcsendbreak() */   
-                       return send_break(tty, arg ? arg*(HZ/10) : HZ/4);
-       }
-       if (tty->driver.ioctl) {
-               int retval = (tty->driver.ioctl)(tty, file, cmd, arg);
-               if (retval != -ENOIOCTLCMD)
-                       return retval;
-       }
-       if (tty->ldisc.ioctl) {
-               int retval = (tty->ldisc.ioctl)(tty, file, cmd, arg);
-               if (retval != -ENOIOCTLCMD)
-                       return retval;
-       }
-       return -EINVAL;
-}
-
-
-/*
- * This implements the "Secure Attention Key" ---  the idea is to
- * prevent trojan horses by killing all processes associated with this
- * tty when the user hits the "Secure Attention Key".  Required for
- * super-paranoid applications --- see the Orange Book for more details.
- * 
- * This code could be nicer; ideally it should send a HUP, wait a few
- * seconds, then send a INT, and then a KILL signal.  But you then
- * have to coordinate with the init process, since all processes associated
- * with the current tty must be dead before the new getty is allowed
- * to spawn.
- *
- * Now, if it would be correct ;-/ The current code has a nasty hole -
- * it doesn't catch files in flight. We may send the descriptor to ourselves
- * via AF_UNIX socket, close it and later fetch from socket. FIXME.
- *
- * Nasty bug: do_SAK is being called in interrupt context.  This can
- * deadlock.  We punt it up to process context.  AKPM - 16Mar2001
- */
-static void __do_SAK(void *arg)
-{
-#ifdef TTY_SOFT_SAK
-       tty_hangup(tty);
-#else
-       struct tty_struct *tty = arg;
-       struct task_struct *p;
-       int session;
-       int             i;
-       struct file     *filp;
-       
-       if (!tty)
-               return;
-       session  = tty->session;
-       if (tty->ldisc.flush_buffer)
-               tty->ldisc.flush_buffer(tty);
-       if (tty->driver.flush_buffer)
-               tty->driver.flush_buffer(tty);
-       read_lock(&tasklist_lock);
-       for_each_task(p) {
-               if ((p->tty == tty) ||
-                   ((session > 0) && (p->session == session))) {
-                       send_sig(SIGKILL, p, 1);
-                       continue;
-               }
-               task_lock(p);
-               if (p->files) {
-                       read_lock(&p->files->file_lock);
-                       for (i=0; i < p->files->max_fds; i++) {
-                               filp = fcheck_files(p->files, i);
-                               if (filp && (filp->f_op == &tty_fops) &&
-                                   (filp->private_data == tty)) {
-                                       send_sig(SIGKILL, p, 1);
-                                       break;
-                               }
-                       }
-                       read_unlock(&p->files->file_lock);
-               }
-               task_unlock(p);
-       }
-       read_unlock(&tasklist_lock);
-#endif
-}
-
-/*
- * The tq handling here is a little racy - tty->SAK_tq may already be queued.
- * But there's no mechanism to fix that without futzing with tqueue_lock.
- * Fortunately we don't need to worry, because if ->SAK_tq is already queued,
- * the values which we write to it will be identical to the values which it
- * already has. --akpm
- */
-void do_SAK(struct tty_struct *tty)
-{
-       if (!tty)
-               return;
-       PREPARE_TQUEUE(&tty->SAK_tq, __do_SAK, tty);
-       schedule_task(&tty->SAK_tq);
-}
-
-/*
- * This routine is called out of the software interrupt to flush data
- * from the flip buffer to the line discipline.
- */
-static void flush_to_ldisc(void *private_)
-{
-       struct tty_struct *tty = (struct tty_struct *) private_;
-       unsigned char   *cp;
-       char            *fp;
-       int             count;
-       unsigned long flags;
-
-       if (test_bit(TTY_DONT_FLIP, &tty->flags)) {
-               queue_task(&tty->flip.tqueue, &tq_timer);
-               return;
-       }
-       if (tty->flip.buf_num) {
-               cp = tty->flip.char_buf + TTY_FLIPBUF_SIZE;
-               fp = tty->flip.flag_buf + TTY_FLIPBUF_SIZE;
-               tty->flip.buf_num = 0;
-
-               save_flags(flags); cli();
-               tty->flip.char_buf_ptr = tty->flip.char_buf;
-               tty->flip.flag_buf_ptr = tty->flip.flag_buf;
-       } else {
-               cp = tty->flip.char_buf;
-               fp = tty->flip.flag_buf;
-               tty->flip.buf_num = 1;
-
-               save_flags(flags); cli();
-               tty->flip.char_buf_ptr = tty->flip.char_buf + TTY_FLIPBUF_SIZE;
-               tty->flip.flag_buf_ptr = tty->flip.flag_buf + TTY_FLIPBUF_SIZE;
-       }
-       count = tty->flip.count;
-       tty->flip.count = 0;
-       restore_flags(flags);
-       
-       tty->ldisc.receive_buf(tty, cp, fp, count);
-}
-
-/*
- * Routine which returns the baud rate of the tty
- *
- * Note that the baud_table needs to be kept in sync with the
- * include/asm/termbits.h file.
- */
-static int baud_table[] = {
-       0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
-       9600, 19200, 38400, 57600, 115200, 230400, 460800,
-#ifdef __sparc__
-       76800, 153600, 307200, 614400, 921600
-#else
-       500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000,
-       2500000, 3000000, 3500000, 4000000
-#endif
-};
-
-static int n_baud_table = sizeof(baud_table)/sizeof(int);
-
-int tty_get_baud_rate(struct tty_struct *tty)
-{
-       unsigned int cflag, i;
-
-       cflag = tty->termios->c_cflag;
-
-       i = cflag & CBAUD;
-       if (i & CBAUDEX) {
-               i &= ~CBAUDEX;
-               if (i < 1 || i+15 >= n_baud_table) 
-                       tty->termios->c_cflag &= ~CBAUDEX;
-               else
-                       i += 15;
-       }
-       if (i==15 && tty->alt_speed) {
-               if (!tty->warned) {
-                       printk(KERN_WARNING "Use of setserial/setrocket to "
-                                           "set SPD_* flags is deprecated\n");
-                       tty->warned = 1;
-               }
-               return(tty->alt_speed);
-       }
-       
-       return baud_table[i];
-}
-
-void tty_flip_buffer_push(struct tty_struct *tty)
-{
-       if (tty->low_latency)
-               flush_to_ldisc((void *) tty);
-       else
-               queue_task(&tty->flip.tqueue, &tq_timer);
-}
-
-/*
- * This subroutine initializes a tty structure.
- */
-static void initialize_tty_struct(struct tty_struct *tty)
-{
-       memset(tty, 0, sizeof(struct tty_struct));
-       tty->magic = TTY_MAGIC;
-       tty->ldisc = ldiscs[N_TTY];
-       tty->pgrp = -1;
-       tty->flip.char_buf_ptr = tty->flip.char_buf;
-       tty->flip.flag_buf_ptr = tty->flip.flag_buf;
-       tty->flip.tqueue.routine = flush_to_ldisc;
-       tty->flip.tqueue.data = tty;
-       init_MUTEX(&tty->flip.pty_sem);
-       init_waitqueue_head(&tty->write_wait);
-       init_waitqueue_head(&tty->read_wait);
-       tty->tq_hangup.routine = do_tty_hangup;
-       tty->tq_hangup.data = tty;
-       sema_init(&tty->atomic_read, 1);
-       sema_init(&tty->atomic_write, 1);
-       spin_lock_init(&tty->read_lock);
-       INIT_LIST_HEAD(&tty->tty_files);
-       INIT_TQUEUE(&tty->SAK_tq, 0, 0);
-}
-
-/*
- * The default put_char routine if the driver did not define one.
- */
-void tty_default_put_char(struct tty_struct *tty, unsigned char ch)
-{
-       tty->driver.write(tty, 0, &ch, 1);
-}
-
-/*
- * Register a tty device described by <driver>, with minor number <minor>.
- */
-void tty_register_devfs (struct tty_driver *driver, unsigned int flags, unsigned minor)
-{
-#ifdef CONFIG_DEVFS_FS
-       umode_t mode = S_IFCHR | S_IRUSR | S_IWUSR;
-       kdev_t device = MKDEV (driver->major, minor);
-       int idx = minor - driver->minor_start;
-       char buf[32];
-
-       switch (device) {
-               case TTY_DEV:
-               case PTMX_DEV:
-                       mode |= S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
-                       break;
-               default:
-                       if (driver->major == PTY_MASTER_MAJOR)
-                               mode |= S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
-                       break;
-       }
-       if ( (minor <  driver->minor_start) || 
-            (minor >= driver->minor_start + driver->num) ) {
-               printk(KERN_ERR "Attempt to register invalid minor number "
-                      "with devfs (%d:%d).\n", (int)driver->major,(int)minor);
-               return;
-       }
-#  ifdef CONFIG_UNIX98_PTYS
-       if ( (driver->major >= UNIX98_PTY_SLAVE_MAJOR) &&
-            (driver->major < UNIX98_PTY_SLAVE_MAJOR + UNIX98_NR_MAJORS) )
-               flags |= DEVFS_FL_CURRENT_OWNER;
-#  endif
-       sprintf(buf, driver->name, idx + driver->name_base);
-       devfs_register (NULL, buf, flags | DEVFS_FL_DEFAULT,
-                       driver->major, minor, mode, &tty_fops, NULL);
-#endif /* CONFIG_DEVFS_FS */
-}
-
-void tty_unregister_devfs (struct tty_driver *driver, unsigned minor)
-{
-#ifdef CONFIG_DEVFS_FS
-       void * handle;
-       int idx = minor - driver->minor_start;
-       char buf[32];
-
-       sprintf(buf, driver->name, idx + driver->name_base);
-       handle = devfs_find_handle (NULL, buf, driver->major, minor,
-                                   DEVFS_SPECIAL_CHR, 0);
-       devfs_unregister (handle);
-#endif /* CONFIG_DEVFS_FS */
-}
-
-EXPORT_SYMBOL(tty_register_devfs);
-EXPORT_SYMBOL(tty_unregister_devfs);
-
-/*
- * Called by a tty driver to register itself.
- */
-int tty_register_driver(struct tty_driver *driver)
-{
-       int error;
-        int i;
-
-       if (driver->flags & TTY_DRIVER_INSTALLED)
-               return 0;
-
-       error = devfs_register_chrdev(driver->major, driver->name, &tty_fops);
-       if (error < 0)
-               return error;
-       else if(driver->major == 0)
-               driver->major = error;
-
-       if (!driver->put_char)
-               driver->put_char = tty_default_put_char;
-       
-       driver->prev = 0;
-       driver->next = tty_drivers;
-       if (tty_drivers) tty_drivers->prev = driver;
-       tty_drivers = driver;
-       
-       if ( !(driver->flags & TTY_DRIVER_NO_DEVFS) ) {
-               for(i = 0; i < driver->num; i++)
-                   tty_register_devfs(driver, 0, driver->minor_start + i);
-       }
-       proc_tty_register_driver(driver);
-       return error;
-}
-
-/*
- * Called by a tty driver to unregister itself.
- */
-int tty_unregister_driver(struct tty_driver *driver)
-{
-       int     retval;
-       struct tty_driver *p;
-       int     i, found = 0;
-       struct termios *tp;
-       const char *othername = NULL;
-       
-       if (*driver->refcount)
-               return -EBUSY;
-
-       for (p = tty_drivers; p; p = p->next) {
-               if (p == driver)
-                       found++;
-               else if (p->major == driver->major)
-                       othername = p->name;
-       }
-       
-       if (!found)
-               return -ENOENT;
-
-       if (othername == NULL) {
-               retval = devfs_unregister_chrdev(driver->major, driver->name);
-               if (retval)
-                       return retval;
-       } else
-               devfs_register_chrdev(driver->major, othername, &tty_fops);
-
-       if (driver->prev)
-               driver->prev->next = driver->next;
-       else
-               tty_drivers = driver->next;
-       
-       if (driver->next)
-               driver->next->prev = driver->prev;
-
-       /*
-        * Free the termios and termios_locked structures because
-        * we don't want to get memory leaks when modular tty
-        * drivers are removed from the kernel.
-        */
-       for (i = 0; i < driver->num; i++) {
-               tp = driver->termios[i];
-               if (tp) {
-                       driver->termios[i] = NULL;
-                       kfree(tp);
-               }
-               tp = driver->termios_locked[i];
-               if (tp) {
-                       driver->termios_locked[i] = NULL;
-                       kfree(tp);
-               }
-               tty_unregister_devfs(driver, driver->minor_start + i);
-       }
-       proc_tty_unregister_driver(driver);
-       return 0;
-}
-
-
-/*
- * Initialize the console device. This is called *early*, so
- * we can't necessarily depend on lots of kernel help here.
- * Just do some early initializations, and do the complex setup
- * later.
- */
-void __init console_init(void)
-{
-        /* Setup the default TTY line discipline. */
-       memset(ldiscs, 0, sizeof(ldiscs));
-       (void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);
-
-       /*
-        * Set up the standard termios.  Individual tty drivers may 
-        * deviate from this; this is used as a template.
-        */
-       memset(&tty_std_termios, 0, sizeof(struct termios));
-       memcpy(tty_std_termios.c_cc, INIT_C_CC, NCCS);
-       tty_std_termios.c_iflag = ICRNL | IXON;
-       tty_std_termios.c_oflag = OPOST | ONLCR;
-       tty_std_termios.c_cflag = B38400 | CS8 | CREAD | HUPCL;
-       tty_std_termios.c_lflag = ISIG | ICANON | ECHO | ECHOE | ECHOK |
-               ECHOCTL | ECHOKE | IEXTEN;
-
-       /*
-        * set up the console device so that later boot sequences can 
-        * inform about problems etc..
-        */
-#ifdef CONFIG_EARLY_PRINTK
-       disable_early_printk(); 
-#endif
-
-#ifdef CONFIG_XEN_CONSOLE
-        xen_console_init();
-#endif
-
-#ifdef CONFIG_VT
-       con_init();
-#endif
-
-#ifdef CONFIG_AU1000_SERIAL_CONSOLE
-       au1000_serial_console_init();
-#endif
-#ifdef CONFIG_SERIAL_CONSOLE
-#if (defined(CONFIG_8xx) || defined(CONFIG_8260))
-       console_8xx_init();
-#elif defined(CONFIG_MAC_SERIAL) && defined(CONFIG_SERIAL)
-       if (_machine == _MACH_Pmac)
-               mac_scc_console_init();
-       else
-               serial_console_init();
-#elif defined(CONFIG_MAC_SERIAL)
-       mac_scc_console_init();
-#elif defined(CONFIG_PARISC)
-       pdc_console_init();
-#elif defined(CONFIG_SERIAL)
-       serial_console_init();
-#endif /* CONFIG_8xx */
-#ifdef CONFIG_SGI_SERIAL
-       sgi_serial_console_init();
-#endif
-#if defined(CONFIG_MVME162_SCC) || defined(CONFIG_BVME6000_SCC) || defined(CONFIG_MVME147_SCC)
-       vme_scc_console_init();
-#endif
-#if defined(CONFIG_SERIAL167)
-       serial167_console_init();
-#endif
-#if defined(CONFIG_SH_SCI)
-       sci_console_init();
-#endif
-#endif
-#ifdef CONFIG_TN3270_CONSOLE
-       tub3270_con_init();
-#endif
-#ifdef CONFIG_TN3215
-       con3215_init();
-#endif
-#ifdef CONFIG_HWC
-        hwc_console_init();
-#endif
-#ifdef CONFIG_STDIO_CONSOLE
-       stdio_console_init();
-#endif
-#ifdef CONFIG_SERIAL_21285_CONSOLE
-       rs285_console_init();
-#endif
-#ifdef CONFIG_SERIAL_SA1100_CONSOLE
-       sa1100_rs_console_init();
-#endif
-#ifdef CONFIG_ARC_CONSOLE
-       arc_console_init();
-#endif
-#ifdef CONFIG_SERIAL_AMBA_CONSOLE
-       ambauart_console_init();
-#endif
-#ifdef CONFIG_SERIAL_TX3912_CONSOLE
-       tx3912_console_init();
-#endif
-#ifdef CONFIG_TXX927_SERIAL_CONSOLE
-       txx927_console_init();
-#endif
-#ifdef CONFIG_SIBYTE_SB1250_DUART_CONSOLE
-       sb1250_serial_console_init();
-#endif
-}
-
-static struct tty_driver dev_tty_driver, dev_syscons_driver;
-#ifdef CONFIG_UNIX98_PTYS
-static struct tty_driver dev_ptmx_driver;
-#endif
-#ifdef CONFIG_VT
-static struct tty_driver dev_console_driver;
-#endif
-
-/*
- * Ok, now we can initialize the rest of the tty devices and can count
- * on memory allocations, interrupts etc..
- */
-void __init tty_init(void)
-{
-       /*
-        * dev_tty_driver and dev_console_driver are actually magic
-        * devices which get redirected at open time.  Nevertheless,
-        * we register them so that register_chrdev is called
-        * appropriately.
-        */
-       memset(&dev_tty_driver, 0, sizeof(struct tty_driver));
-       dev_tty_driver.magic = TTY_DRIVER_MAGIC;
-       dev_tty_driver.driver_name = "/dev/tty";
-       dev_tty_driver.name = dev_tty_driver.driver_name + 5;
-       dev_tty_driver.name_base = 0;
-       dev_tty_driver.major = TTYAUX_MAJOR;
-       dev_tty_driver.minor_start = 0;
-       dev_tty_driver.num = 1;
-       dev_tty_driver.type = TTY_DRIVER_TYPE_SYSTEM;
-       dev_tty_driver.subtype = SYSTEM_TYPE_TTY;
-       
-       if (tty_register_driver(&dev_tty_driver))
-               panic("Couldn't register /dev/tty driver\n");
-
-       dev_syscons_driver = dev_tty_driver;
-       dev_syscons_driver.driver_name = "/dev/console";
-       dev_syscons_driver.name = dev_syscons_driver.driver_name + 5;
-       dev_syscons_driver.major = TTYAUX_MAJOR;
-       dev_syscons_driver.minor_start = 1;
-       dev_syscons_driver.type = TTY_DRIVER_TYPE_SYSTEM;
-       dev_syscons_driver.subtype = SYSTEM_TYPE_SYSCONS;
-
-       if (tty_register_driver(&dev_syscons_driver))
-               panic("Couldn't register /dev/console driver\n");
-
-       /* console calls tty_register_driver() before kmalloc() works.
-        * Thus, we can't devfs_register() then.  Do so now, instead. 
-        */
-#ifdef CONFIG_VT
-       con_init_devfs();
-#endif
-
-#ifdef CONFIG_UNIX98_PTYS
-       dev_ptmx_driver = dev_tty_driver;
-       dev_ptmx_driver.driver_name = "/dev/ptmx";
-       dev_ptmx_driver.name = dev_ptmx_driver.driver_name + 5;
-       dev_ptmx_driver.major= MAJOR(PTMX_DEV);
-       dev_ptmx_driver.minor_start = MINOR(PTMX_DEV);
-       dev_ptmx_driver.type = TTY_DRIVER_TYPE_SYSTEM;
-       dev_ptmx_driver.subtype = SYSTEM_TYPE_SYSPTMX;
-
-       if (tty_register_driver(&dev_ptmx_driver))
-               panic("Couldn't register /dev/ptmx driver\n");
-#endif
-       
-#ifdef CONFIG_VT
-       dev_console_driver = dev_tty_driver;
-       dev_console_driver.driver_name = "/dev/vc/0";
-       dev_console_driver.name = dev_console_driver.driver_name + 5;
-       dev_console_driver.major = TTY_MAJOR;
-       dev_console_driver.type = TTY_DRIVER_TYPE_SYSTEM;
-       dev_console_driver.subtype = SYSTEM_TYPE_CONSOLE;
-
-       if (tty_register_driver(&dev_console_driver))
-               panic("Couldn't register /dev/tty0 driver\n");
-
-       kbd_init();
-#endif
-
-#ifdef CONFIG_ESPSERIAL  /* init ESP before rs, so rs doesn't see the port */
-       espserial_init();
-#endif
-#if defined(CONFIG_MVME162_SCC) || defined(CONFIG_BVME6000_SCC) || defined(CONFIG_MVME147_SCC)
-       vme_scc_init();
-#endif
-#ifdef CONFIG_SERIAL_TX3912
-       tx3912_rs_init();
-#endif
-#ifdef CONFIG_ROCKETPORT
-       rp_init();
-#endif
-#ifdef CONFIG_SERIAL167
-       serial167_init();
-#endif
-#ifdef CONFIG_CYCLADES
-       cy_init();
-#endif
-#ifdef CONFIG_STALLION
-       stl_init();
-#endif
-#ifdef CONFIG_ISTALLION
-       stli_init();
-#endif
-#ifdef CONFIG_DIGI
-       pcxe_init();
-#endif
-#ifdef CONFIG_DIGIEPCA
-       pc_init();
-#endif
-#ifdef CONFIG_SPECIALIX
-       specialix_init();
-#endif
-#if (defined(CONFIG_8xx) || defined(CONFIG_8260))
-       rs_8xx_init();
-#endif /* CONFIG_8xx */
-       pty_init();
-#ifdef CONFIG_MOXA_SMARTIO
-       mxser_init();
-#endif 
-#ifdef CONFIG_MOXA_INTELLIO
-       moxa_init();
-#endif 
-#ifdef CONFIG_VT
-       vcs_init();
-#endif
-#ifdef CONFIG_TN3270
-       tub3270_init();
-#endif
-#ifdef CONFIG_TN3215
-       tty3215_init();
-#endif
-#ifdef CONFIG_HWC
-       hwc_tty_init();
-#endif
-#ifdef CONFIG_A2232
-       a2232board_init();
-#endif
-}
diff --git a/xenolinux-2.4.21-sparse/fs/exec.c b/xenolinux-2.4.21-sparse/fs/exec.c
deleted file mode 100644 (file)
index f87ae7a..0000000
+++ /dev/null
@@ -1,1123 +0,0 @@
-/*
- *  linux/fs/exec.c
- *
- *  Copyright (C) 1991, 1992  Linus Torvalds
- */
-
-/*
- * #!-checking implemented by tytso.
- */
-/*
- * Demand-loading implemented 01.12.91 - no need to read anything but
- * the header into memory. The inode of the executable is put into
- * "current->executable", and page faults do the actual loading. Clean.
- *
- * Once more I can proudly say that linux stood up to being changed: it
- * was less than 2 hours work to get demand-loading completely implemented.
- *
- * Demand loading changed July 1993 by Eric Youngdale.   Use mmap instead,
- * current->executable is only used by the procfs.  This allows a dispatch
- * table to check for several different types  of binary formats.  We keep
- * trying until we recognize the file or we run out of supported binary
- * formats. 
- */
-
-#include <linux/config.h>
-#include <linux/slab.h>
-#include <linux/file.h>
-#include <linux/mman.h>
-#include <linux/a.out.h>
-#include <linux/stat.h>
-#include <linux/fcntl.h>
-#include <linux/smp_lock.h>
-#include <linux/init.h>
-#include <linux/pagemap.h>
-#include <linux/highmem.h>
-#include <linux/spinlock.h>
-#include <linux/personality.h>
-#include <linux/swap.h>
-#include <linux/utsname.h>
-#define __NO_VERSION__
-#include <linux/module.h>
-
-#include <asm/uaccess.h>
-#include <asm/pgalloc.h>
-#include <asm/mmu_context.h>
-
-#ifdef CONFIG_KMOD
-#include <linux/kmod.h>
-#endif
-
-int core_uses_pid;
-char core_pattern[65] = "core";
-/* The maximal length of core_pattern is also specified in sysctl.c */ 
-
-static struct linux_binfmt *formats;
-static rwlock_t binfmt_lock = RW_LOCK_UNLOCKED;
-
-int register_binfmt(struct linux_binfmt * fmt)
-{
-       struct linux_binfmt ** tmp = &formats;
-
-       if (!fmt)
-               return -EINVAL;
-       if (fmt->next)
-               return -EBUSY;
-       write_lock(&binfmt_lock);
-       while (*tmp) {
-               if (fmt == *tmp) {
-                       write_unlock(&binfmt_lock);
-                       return -EBUSY;
-               }
-               tmp = &(*tmp)->next;
-       }
-       fmt->next = formats;
-       formats = fmt;
-       write_unlock(&binfmt_lock);
-       return 0;       
-}
-
-int unregister_binfmt(struct linux_binfmt * fmt)
-{
-       struct linux_binfmt ** tmp = &formats;
-
-       write_lock(&binfmt_lock);
-       while (*tmp) {
-               if (fmt == *tmp) {
-                       *tmp = fmt->next;
-                       write_unlock(&binfmt_lock);
-                       return 0;
-               }
-               tmp = &(*tmp)->next;
-       }
-       write_unlock(&binfmt_lock);
-       return -EINVAL;
-}
-
-static inline void put_binfmt(struct linux_binfmt * fmt)
-{
-       if (fmt->module)
-               __MOD_DEC_USE_COUNT(fmt->module);
-}
-
-/*
- * Note that a shared library must be both readable and executable due to
- * security reasons.
- *
- * Also note that we take the address to load from from the file itself.
- */
-asmlinkage long sys_uselib(const char * library)
-{
-       struct file * file;
-       struct nameidata nd;
-       int error;
-
-       error = user_path_walk(library, &nd);
-       if (error)
-               goto out;
-
-       error = -EINVAL;
-       if (!S_ISREG(nd.dentry->d_inode->i_mode))
-               goto exit;
-
-       error = permission(nd.dentry->d_inode, MAY_READ | MAY_EXEC);
-       if (error)
-               goto exit;
-
-       file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
-       error = PTR_ERR(file);
-       if (IS_ERR(file))
-               goto out;
-
-       error = -ENOEXEC;
-       if(file->f_op && file->f_op->read) {
-               struct linux_binfmt * fmt;
-
-               read_lock(&binfmt_lock);
-               for (fmt = formats ; fmt ; fmt = fmt->next) {
-                       if (!fmt->load_shlib)
-                               continue;
-                       if (!try_inc_mod_count(fmt->module))
-                               continue;
-                       read_unlock(&binfmt_lock);
-                       error = fmt->load_shlib(file);
-                       read_lock(&binfmt_lock);
-                       put_binfmt(fmt);
-                       if (error != -ENOEXEC)
-                               break;
-               }
-               read_unlock(&binfmt_lock);
-       }
-       fput(file);
-out:
-       return error;
-exit:
-       path_release(&nd);
-       goto out;
-}
-
-/*
- * count() counts the number of arguments/envelopes
- */
-static int count(char ** argv, int max)
-{
-       int i = 0;
-
-       if (argv != NULL) {
-               for (;;) {
-                       char * p;
-
-                       if (get_user(p, argv))
-                               return -EFAULT;
-                       if (!p)
-                               break;
-                       argv++;
-                       if(++i > max)
-                               return -E2BIG;
-               }
-       }
-       return i;
-}
-
-/*
- * 'copy_strings()' copies argument/envelope strings from user
- * memory to free pages in kernel mem. These are in a format ready
- * to be put directly into the top of new user memory.
- */
-int copy_strings(int argc,char ** argv, struct linux_binprm *bprm) 
-{
-       struct page *kmapped_page = NULL;
-       char *kaddr = NULL;
-       int ret;
-
-       while (argc-- > 0) {
-               char *str;
-               int len;
-               unsigned long pos;
-
-               if (get_user(str, argv+argc) ||
-                               !(len = strnlen_user(str, bprm->p))) {
-                       ret = -EFAULT;
-                       goto out;
-               }
-
-               if (bprm->p < len)  {
-                       ret = -E2BIG;
-                       goto out;
-               }
-
-               bprm->p -= len;
-               /* XXX: add architecture specific overflow check here. */ 
-               pos = bprm->p;
-
-               while (len > 0) {
-                       int i, new, err;
-                       int offset, bytes_to_copy;
-                       struct page *page;
-
-                       offset = pos % PAGE_SIZE;
-                       i = pos/PAGE_SIZE;
-                       page = bprm->page[i];
-                       new = 0;
-                       if (!page) {
-                               page = alloc_page(GFP_HIGHUSER);
-                               bprm->page[i] = page;
-                               if (!page) {
-                                       ret = -ENOMEM;
-                                       goto out;
-                               }
-                               new = 1;
-                       }
-
-                       if (page != kmapped_page) {
-                               if (kmapped_page)
-                                       kunmap(kmapped_page);
-                               kmapped_page = page;
-                               kaddr = kmap(kmapped_page);
-                       }
-                       if (new && offset)
-                               memset(kaddr, 0, offset);
-                       bytes_to_copy = PAGE_SIZE - offset;
-                       if (bytes_to_copy > len) {
-                               bytes_to_copy = len;
-                               if (new)
-                                       memset(kaddr+offset+len, 0,
-                                               PAGE_SIZE-offset-len);
-                       }
-                       err = copy_from_user(kaddr+offset, str, bytes_to_copy);
-                       if (err) {
-                               ret = -EFAULT;
-                               goto out;
-                       }
-
-                       pos += bytes_to_copy;
-                       str += bytes_to_copy;
-                       len -= bytes_to_copy;
-               }
-       }
-       ret = 0;
-out:
-       if (kmapped_page)
-               kunmap(kmapped_page);
-       return ret;
-}
-
-/*
- * Like copy_strings, but get argv and its values from kernel memory.
- */
-int copy_strings_kernel(int argc,char ** argv, struct linux_binprm *bprm)
-{
-       int r;
-       mm_segment_t oldfs = get_fs();
-       set_fs(KERNEL_DS); 
-       r = copy_strings(argc, argv, bprm);
-       set_fs(oldfs);
-       return r; 
-}
-
-/*
- * This routine is used to map in a page into an address space: needed by
- * execve() for the initial stack and environment pages.
- *
- * tsk->mmap_sem is held for writing.
- */
-void put_dirty_page(struct task_struct * tsk, struct page *page, unsigned long address)
-{
-       pgd_t * pgd;
-       pmd_t * pmd;
-       pte_t * pte;
-
-       if (page_count(page) != 1)
-               printk(KERN_ERR "mem_map disagrees with %p at %08lx\n", page, address);
-       pgd = pgd_offset(tsk->mm, address);
-
-       spin_lock(&tsk->mm->page_table_lock);
-       pmd = pmd_alloc(tsk->mm, pgd, address);
-       if (!pmd)
-               goto out;
-       pte = pte_alloc(tsk->mm, pmd, address);
-       if (!pte)
-               goto out;
-       if (!pte_none(*pte))
-               goto out;
-       lru_cache_add(page);
-       flush_dcache_page(page);
-       flush_page_to_ram(page);
-       set_pte(pte, pte_mkdirty(pte_mkwrite(mk_pte(page, PAGE_COPY))));
-       XENO_flush_page_update_queue();
-       tsk->mm->rss++;
-       spin_unlock(&tsk->mm->page_table_lock);
-
-       /* no need for flush_tlb */
-       return;
-out:
-       spin_unlock(&tsk->mm->page_table_lock);
-       __free_page(page);
-       force_sig(SIGKILL, tsk);
-       return;
-}
-
-int setup_arg_pages(struct linux_binprm *bprm)
-{
-       unsigned long stack_base;
-       struct vm_area_struct *mpnt;
-       int i;
-
-       stack_base = STACK_TOP - MAX_ARG_PAGES*PAGE_SIZE;
-
-       bprm->p += stack_base;
-       if (bprm->loader)
-               bprm->loader += stack_base;
-       bprm->exec += stack_base;
-
-       mpnt = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
-       if (!mpnt) 
-               return -ENOMEM; 
-       
-       down_write(&current->mm->mmap_sem);
-       {
-               mpnt->vm_mm = current->mm;
-               mpnt->vm_start = PAGE_MASK & (unsigned long) bprm->p;
-               mpnt->vm_end = STACK_TOP;
-               mpnt->vm_page_prot = PAGE_COPY;
-               mpnt->vm_flags = VM_STACK_FLAGS;
-               mpnt->vm_ops = NULL;
-               mpnt->vm_pgoff = 0;
-               mpnt->vm_file = NULL;
-               mpnt->vm_private_data = (void *) 0;
-               insert_vm_struct(current->mm, mpnt);
-               current->mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT;
-       } 
-
-       for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
-               struct page *page = bprm->page[i];
-               if (page) {
-                       bprm->page[i] = NULL;
-                       put_dirty_page(current,page,stack_base);
-               }
-               stack_base += PAGE_SIZE;
-       }
-       up_write(&current->mm->mmap_sem);
-       
-       return 0;
-}
-
-struct file *open_exec(const char *name)
-{
-       struct nameidata nd;
-       struct inode *inode;
-       struct file *file;
-       int err = 0;
-
-       err = path_lookup(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
-       file = ERR_PTR(err);
-       if (!err) {
-               inode = nd.dentry->d_inode;
-               file = ERR_PTR(-EACCES);
-               if (!(nd.mnt->mnt_flags & MNT_NOEXEC) &&
-                   S_ISREG(inode->i_mode)) {
-                       int err = permission(inode, MAY_EXEC);
-                       if (!err && !(inode->i_mode & 0111))
-                               err = -EACCES;
-                       file = ERR_PTR(err);
-                       if (!err) {
-                               file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
-                               if (!IS_ERR(file)) {
-                                       err = deny_write_access(file);
-                                       if (err) {
-                                               fput(file);
-                                               file = ERR_PTR(err);
-                                       }
-                               }
-out:
-                               return file;
-                       }
-               }
-               path_release(&nd);
-       }
-       goto out;
-}
-
-int kernel_read(struct file *file, unsigned long offset,
-       char * addr, unsigned long count)
-{
-       mm_segment_t old_fs;
-       loff_t pos = offset;
-       int result = -ENOSYS;
-
-       if (!file->f_op->read)
-               goto fail;
-       old_fs = get_fs();
-       set_fs(get_ds());
-       result = file->f_op->read(file, addr, count, &pos);
-       set_fs(old_fs);
-fail:
-       return result;
-}
-
-static int exec_mmap(void)
-{
-       struct mm_struct * mm, * old_mm;
-
-       old_mm = current->mm;
-       if (old_mm && atomic_read(&old_mm->mm_users) == 1) {
-               mm_release();
-               exit_mmap(old_mm);
-               return 0;
-       }
-
-       mm = mm_alloc();
-       if (mm) {
-               struct mm_struct *active_mm;
-
-               if (init_new_context(current, mm)) {
-                       mmdrop(mm);
-                       return -ENOMEM;
-               }
-
-               /* Add it to the list of mm's */
-               spin_lock(&mmlist_lock);
-               list_add(&mm->mmlist, &init_mm.mmlist);
-               mmlist_nr++;
-               spin_unlock(&mmlist_lock);
-
-               task_lock(current);
-               active_mm = current->active_mm;
-               current->mm = mm;
-               current->active_mm = mm;
-               task_unlock(current);
-               activate_mm(active_mm, mm);
-               mm_release();
-               if (old_mm) {
-                       if (active_mm != old_mm) BUG();
-                       mmput(old_mm);
-                       return 0;
-               }
-               mmdrop(active_mm);
-               return 0;
-       }
-       return -ENOMEM;
-}
-
-/*
- * This function makes sure the current process has its own signal table,
- * so that flush_signal_handlers can later reset the handlers without
- * disturbing other processes.  (Other processes might share the signal
- * table via the CLONE_SIGNAL option to clone().)
- */
-static inline int make_private_signals(void)
-{
-       struct signal_struct * newsig;
-
-       if (atomic_read(&current->sig->count) <= 1)
-               return 0;
-       newsig = kmem_cache_alloc(sigact_cachep, GFP_KERNEL);
-       if (newsig == NULL)
-               return -ENOMEM;
-       spin_lock_init(&newsig->siglock);
-       atomic_set(&newsig->count, 1);
-       memcpy(newsig->action, current->sig->action, sizeof(newsig->action));
-       spin_lock_irq(&current->sigmask_lock);
-       current->sig = newsig;
-       spin_unlock_irq(&current->sigmask_lock);
-       return 0;
-}
-       
-/*
- * If make_private_signals() made a copy of the signal table, decrement the
- * refcount of the original table, and free it if necessary.
- * We don't do that in make_private_signals() so that we can back off
- * in flush_old_exec() if an error occurs after calling make_private_signals().
- */
-
-static inline void release_old_signals(struct signal_struct * oldsig)
-{
-       if (current->sig == oldsig)
-               return;
-       if (atomic_dec_and_test(&oldsig->count))
-               kmem_cache_free(sigact_cachep, oldsig);
-}
-
-/*
- * These functions flushes out all traces of the currently running executable
- * so that a new one can be started
- */
-
-static inline void flush_old_files(struct files_struct * files)
-{
-       long j = -1;
-
-       write_lock(&files->file_lock);
-       for (;;) {
-               unsigned long set, i;
-
-               j++;
-               i = j * __NFDBITS;
-               if (i >= files->max_fds || i >= files->max_fdset)
-                       break;
-               set = files->close_on_exec->fds_bits[j];
-               if (!set)
-                       continue;
-               files->close_on_exec->fds_bits[j] = 0;
-               write_unlock(&files->file_lock);
-               for ( ; set ; i++,set >>= 1) {
-                       if (set & 1) {
-                               sys_close(i);
-                       }
-               }
-               write_lock(&files->file_lock);
-
-       }
-       write_unlock(&files->file_lock);
-}
-
-/*
- * An execve() will automatically "de-thread" the process.
- * Note: we don't have to hold the tasklist_lock to test
- * whether we migth need to do this. If we're not part of
- * a thread group, there is no way we can become one
- * dynamically. And if we are, we only need to protect the
- * unlink - even if we race with the last other thread exit,
- * at worst the list_del_init() might end up being a no-op.
- */
-static inline void de_thread(struct task_struct *tsk)
-{
-       if (!list_empty(&tsk->thread_group)) {
-               write_lock_irq(&tasklist_lock);
-               list_del_init(&tsk->thread_group);
-               write_unlock_irq(&tasklist_lock);
-       }
-
-       /* Minor oddity: this might stay the same. */
-       tsk->tgid = tsk->pid;
-}
-
-int flush_old_exec(struct linux_binprm * bprm)
-{
-       char * name;
-       int i, ch, retval;
-       struct signal_struct * oldsig;
-
-       /*
-        * Make sure we have a private signal table
-        */
-       oldsig = current->sig;
-       retval = make_private_signals();
-       if (retval) goto flush_failed;
-
-       /* 
-        * Release all of the old mmap stuff
-        */
-       retval = exec_mmap();
-       if (retval) goto mmap_failed;
-
-       /* This is the point of no return */
-       release_old_signals(oldsig);
-
-       current->sas_ss_sp = current->sas_ss_size = 0;
-
-       if (current->euid == current->uid && current->egid == current->gid) {
-               current->mm->dumpable = 1;
-               current->task_dumpable = 1;
-       }
-       name = bprm->filename;
-       for (i=0; (ch = *(name++)) != '\0';) {
-               if (ch == '/')
-                       i = 0;
-               else
-                       if (i < 15)
-                               current->comm[i++] = ch;
-       }
-       current->comm[i] = '\0';
-
-       flush_thread();
-
-       de_thread(current);
-
-       if (bprm->e_uid != current->euid || bprm->e_gid != current->egid || 
-           permission(bprm->file->f_dentry->d_inode,MAY_READ))
-               current->mm->dumpable = 0;
-
-       /* An exec changes our domain. We are no longer part of the thread
-          group */
-          
-       current->self_exec_id++;
-                       
-       flush_signal_handlers(current);
-       flush_old_files(current->files);
-
-       return 0;
-
-mmap_failed:
-flush_failed:
-       spin_lock_irq(&current->sigmask_lock);
-       if (current->sig != oldsig) {
-               kmem_cache_free(sigact_cachep, current->sig);
-               current->sig = oldsig;
-       }
-       spin_unlock_irq(&current->sigmask_lock);
-       return retval;
-}
-
-/*
- * We mustn't allow tracing of suid binaries, unless
- * the tracer has the capability to trace anything..
- */
-static inline int must_not_trace_exec(struct task_struct * p)
-{
-       return (p->ptrace & PT_PTRACED) && !(p->ptrace & PT_PTRACE_CAP);
-}
-
-/* 
- * Fill the binprm structure from the inode. 
- * Check permissions, then read the first 128 (BINPRM_BUF_SIZE) bytes
- */
-int prepare_binprm(struct linux_binprm *bprm)
-{
-       int mode;
-       struct inode * inode = bprm->file->f_dentry->d_inode;
-
-       mode = inode->i_mode;
-       /*
-        * Check execute perms again - if the caller has CAP_DAC_OVERRIDE,
-        * vfs_permission lets a non-executable through
-        */
-       if (!(mode & 0111))     /* with at least _one_ execute bit set */
-               return -EACCES;
-       if (bprm->file->f_op == NULL)
-               return -EACCES;
-
-       bprm->e_uid = current->euid;
-       bprm->e_gid = current->egid;
-
-       if(!(bprm->file->f_vfsmnt->mnt_flags & MNT_NOSUID)) {
-               /* Set-uid? */
-               if (mode & S_ISUID)
-                       bprm->e_uid = inode->i_uid;
-
-               /* Set-gid? */
-               /*
-                * If setgid is set but no group execute bit then this
-                * is a candidate for mandatory locking, not a setgid
-                * executable.
-                */
-               if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP))
-                       bprm->e_gid = inode->i_gid;
-       }
-
-       /* We don't have VFS support for capabilities yet */
-       cap_clear(bprm->cap_inheritable);
-       cap_clear(bprm->cap_permitted);
-       cap_clear(bprm->cap_effective);
-
-       /*  To support inheritance of root-permissions and suid-root
-         *  executables under compatibility mode, we raise all three
-         *  capability sets for the file.
-         *
-         *  If only the real uid is 0, we only raise the inheritable
-         *  and permitted sets of the executable file.
-         */
-
-       if (!issecure(SECURE_NOROOT)) {
-               if (bprm->e_uid == 0 || current->uid == 0) {
-                       cap_set_full(bprm->cap_inheritable);
-                       cap_set_full(bprm->cap_permitted);
-               }
-               if (bprm->e_uid == 0) 
-                       cap_set_full(bprm->cap_effective);
-       }
-
-       memset(bprm->buf,0,BINPRM_BUF_SIZE);
-       return kernel_read(bprm->file,0,bprm->buf,BINPRM_BUF_SIZE);
-}
-
-/*
- * This function is used to produce the new IDs and capabilities
- * from the old ones and the file's capabilities.
- *
- * The formula used for evolving capabilities is:
- *
- *       pI' = pI
- * (***) pP' = (fP & X) | (fI & pI)
- *       pE' = pP' & fE          [NB. fE is 0 or ~0]
- *
- * I=Inheritable, P=Permitted, E=Effective // p=process, f=file
- * ' indicates post-exec(), and X is the global 'cap_bset'.
- *
- */
-
-void compute_creds(struct linux_binprm *bprm) 
-{
-       kernel_cap_t new_permitted, working;
-       int do_unlock = 0;
-
-       new_permitted = cap_intersect(bprm->cap_permitted, cap_bset);
-       working = cap_intersect(bprm->cap_inheritable,
-                               current->cap_inheritable);
-       new_permitted = cap_combine(new_permitted, working);
-
-       if (bprm->e_uid != current->uid || bprm->e_gid != current->gid ||
-           !cap_issubset(new_permitted, current->cap_permitted)) {
-                current->mm->dumpable = 0;
-               
-               lock_kernel();
-               if (must_not_trace_exec(current)
-                   || atomic_read(&current->fs->count) > 1
-                   || atomic_read(&current->files->count) > 1
-                   || atomic_read(&current->sig->count) > 1) {
-                       if(!capable(CAP_SETUID)) {
-                               bprm->e_uid = current->uid;
-                               bprm->e_gid = current->gid;
-                       }
-                       if(!capable(CAP_SETPCAP)) {
-                               new_permitted = cap_intersect(new_permitted,
-                                                       current->cap_permitted);
-                       }
-               }
-               do_unlock = 1;
-       }
-
-
-       /* For init, we want to retain the capabilities set
-         * in the init_task struct. Thus we skip the usual
-         * capability rules */
-       if (current->pid != 1) {
-               current->cap_permitted = new_permitted;
-               current->cap_effective =
-                       cap_intersect(new_permitted, bprm->cap_effective);
-       }
-       
-        /* AUD: Audit candidate if current->cap_effective is set */
-
-        current->suid = current->euid = current->fsuid = bprm->e_uid;
-        current->sgid = current->egid = current->fsgid = bprm->e_gid;
-
-       if(do_unlock)
-               unlock_kernel();
-       current->keep_capabilities = 0;
-}
-
-
-void remove_arg_zero(struct linux_binprm *bprm)
-{
-       if (bprm->argc) {
-               unsigned long offset;
-               char * kaddr;
-               struct page *page;
-
-               offset = bprm->p % PAGE_SIZE;
-               goto inside;
-
-               while (bprm->p++, *(kaddr+offset++)) {
-                       if (offset != PAGE_SIZE)
-                               continue;
-                       offset = 0;
-                       kunmap(page);
-inside:
-                       page = bprm->page[bprm->p/PAGE_SIZE];
-                       kaddr = kmap(page);
-               }
-               kunmap(page);
-               bprm->argc--;
-       }
-}
-
-/*
- * cycle the list of binary formats handler, until one recognizes the image
- */
-int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)
-{
-       int try,retval=0;
-       struct linux_binfmt *fmt;
-#ifdef __alpha__
-       /* handle /sbin/loader.. */
-       {
-           struct exec * eh = (struct exec *) bprm->buf;
-
-           if (!bprm->loader && eh->fh.f_magic == 0x183 &&
-               (eh->fh.f_flags & 0x3000) == 0x3000)
-           {
-               struct file * file;
-               unsigned long loader;
-
-               allow_write_access(bprm->file);
-               fput(bprm->file);
-               bprm->file = NULL;
-
-               loader = PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *);
-
-               file = open_exec("/sbin/loader");
-               retval = PTR_ERR(file);
-               if (IS_ERR(file))
-                       return retval;
-
-               /* Remember if the application is TASO.  */
-               bprm->sh_bang = eh->ah.entry < 0x100000000;
-
-               bprm->file = file;
-               bprm->loader = loader;
-               retval = prepare_binprm(bprm);
-               if (retval<0)
-                       return retval;
-               /* should call search_binary_handler recursively here,
-                  but it does not matter */
-           }
-       }
-#endif
-       /* kernel module loader fixup */
-       /* so we don't try to load run modprobe in kernel space. */
-       set_fs(USER_DS);
-       for (try=0; try<2; try++) {
-               read_lock(&binfmt_lock);
-               for (fmt = formats ; fmt ; fmt = fmt->next) {
-                       int (*fn)(struct linux_binprm *, struct pt_regs *) = fmt->load_binary;
-                       if (!fn)
-                               continue;
-                       if (!try_inc_mod_count(fmt->module))
-                               continue;
-                       read_unlock(&binfmt_lock);
-                       retval = fn(bprm, regs);
-                       if (retval >= 0) {
-                               put_binfmt(fmt);
-                               allow_write_access(bprm->file);
-                               if (bprm->file)
-                                       fput(bprm->file);
-                               bprm->file = NULL;
-                               current->did_exec = 1;
-                               return retval;
-                       }
-                       read_lock(&binfmt_lock);
-                       put_binfmt(fmt);
-                       if (retval != -ENOEXEC)
-                               break;
-                       if (!bprm->file) {
-                               read_unlock(&binfmt_lock);
-                               return retval;
-                       }
-               }
-               read_unlock(&binfmt_lock);
-               if (retval != -ENOEXEC) {
-                       break;
-#ifdef CONFIG_KMOD
-               }else{
-#define printable(c) (((c)=='\t') || ((c)=='\n') || (0x20<=(c) && (c)<=0x7e))
-                       char modname[20];
-                       if (printable(bprm->buf[0]) &&
-                           printable(bprm->buf[1]) &&
-                           printable(bprm->buf[2]) &&
-                           printable(bprm->buf[3]))
-                               break; /* -ENOEXEC */
-                       sprintf(modname, "binfmt-%04x", *(unsigned short *)(&bprm->buf[2]));
-                       request_module(modname);
-#endif
-               }
-       }
-       return retval;
-}
-
-
-/*
- * sys_execve() executes a new program.
- */
-int do_execve(char * filename, char ** argv, char ** envp, struct pt_regs * regs)
-{
-       struct linux_binprm bprm;
-       struct file *file;
-       int retval;
-       int i;
-
-       file = open_exec(filename);
-
-       retval = PTR_ERR(file);
-       if (IS_ERR(file))
-               return retval;
-
-       bprm.p = PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *);
-       memset(bprm.page, 0, MAX_ARG_PAGES*sizeof(bprm.page[0])); 
-
-       bprm.file = file;
-       bprm.filename = filename;
-       bprm.sh_bang = 0;
-       bprm.loader = 0;
-       bprm.exec = 0;
-       if ((bprm.argc = count(argv, bprm.p / sizeof(void *))) < 0) {
-               allow_write_access(file);
-               fput(file);
-               return bprm.argc;
-       }
-
-       if ((bprm.envc = count(envp, bprm.p / sizeof(void *))) < 0) {
-               allow_write_access(file);
-               fput(file);
-               return bprm.envc;
-       }
-
-       retval = prepare_binprm(&bprm);
-       if (retval < 0) 
-               goto out; 
-
-       retval = copy_strings_kernel(1, &bprm.filename, &bprm);
-       if (retval < 0) 
-               goto out; 
-
-       bprm.exec = bprm.p;
-       retval = copy_strings(bprm.envc, envp, &bprm);
-       if (retval < 0) 
-               goto out; 
-
-       retval = copy_strings(bprm.argc, argv, &bprm);
-       if (retval < 0) 
-               goto out; 
-
-       retval = search_binary_handler(&bprm,regs);
-       if (retval >= 0)
-               /* execve success */
-               return retval;
-
-out:
-       /* Something went wrong, return the inode and free the argument pages*/
-       allow_write_access(bprm.file);
-       if (bprm.file)
-               fput(bprm.file);
-
-       for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
-               struct page * page = bprm.page[i];
-               if (page)
-                       __free_page(page);
-       }
-
-       return retval;
-}
-
-void set_binfmt(struct linux_binfmt *new)
-{
-       struct linux_binfmt *old = current->binfmt;
-       if (new && new->module)
-               __MOD_INC_USE_COUNT(new->module);
-       current->binfmt = new;
-       if (old && old->module)
-               __MOD_DEC_USE_COUNT(old->module);
-}
-
-#define CORENAME_MAX_SIZE 64
-
-/* format_corename will inspect the pattern parameter, and output a
- * name into corename, which must have space for at least
- * CORENAME_MAX_SIZE bytes plus one byte for the zero terminator.
- */
-void format_corename(char *corename, const char *pattern, long signr)
-{
-       const char *pat_ptr = pattern;
-       char *out_ptr = corename;
-       char *const out_end = corename + CORENAME_MAX_SIZE;
-       int rc;
-       int pid_in_pattern = 0;
-
-       /* Repeat as long as we have more pattern to process and more output
-          space */
-       while (*pat_ptr) {
-               if (*pat_ptr != '%') {
-                       if (out_ptr == out_end)
-                               goto out;
-                       *out_ptr++ = *pat_ptr++;
-               } else {
-                       switch (*++pat_ptr) {
-                       case 0:
-                               goto out;
-                       /* Double percent, output one percent */
-                       case '%':
-                               if (out_ptr == out_end)
-                                       goto out;
-                               *out_ptr++ = '%';
-                               break;
-                       /* pid */
-                       case 'p':
-                               pid_in_pattern = 1;
-                               rc = snprintf(out_ptr, out_end - out_ptr,
-                                             "%d", current->pid);
-                               if (rc > out_end - out_ptr)
-                                       goto out;
-                               out_ptr += rc;
-                               break;
-                       /* uid */
-                       case 'u':
-                               rc = snprintf(out_ptr, out_end - out_ptr,
-                                             "%d", current->uid);
-                               if (rc > out_end - out_ptr)
-                                       goto out;
-                               out_ptr += rc;
-                               break;
-                       /* gid */
-                       case 'g':
-                               rc = snprintf(out_ptr, out_end - out_ptr,
-                                             "%d", current->gid);
-                               if (rc > out_end - out_ptr)
-                                       goto out;
-                               out_ptr += rc;
-                               break;
-                       /* signal that caused the coredump */
-                       case 's':
-                               rc = snprintf(out_ptr, out_end - out_ptr,
-                                             "%ld", signr);
-                               if (rc > out_end - out_ptr)
-                                       goto out;
-                               out_ptr += rc;
-                               break;
-                       /* UNIX time of coredump */
-                       case 't': {
-                               struct timeval tv;
-                               do_gettimeofday(&tv);
-                               rc = snprintf(out_ptr, out_end - out_ptr,
-                                             "%ld", tv.tv_sec);
-                               if (rc > out_end - out_ptr)
-                                       goto out;
-                               out_ptr += rc;
-                               break;
-                       }
-                       /* hostname */
-                       case 'h':
-                               down_read(&uts_sem);
-                               rc = snprintf(out_ptr, out_end - out_ptr,
-                                             "%s", system_utsname.nodename);
-                               up_read(&uts_sem);
-                               if (rc > out_end - out_ptr)
-                                       goto out;
-                               out_ptr += rc;
-                               break;
-                       /* executable */
-                       case 'e':
-                               rc = snprintf(out_ptr, out_end - out_ptr,
-                                             "%s", current->comm);
-                               if (rc > out_end - out_ptr)
-                                       goto out;
-                               out_ptr += rc;
-                               break;
-                       default:
-                               break;
-                       }
-                       ++pat_ptr;
-               }
-       }
-       /* Backward compatibility with core_uses_pid:
-        *
-        * If core_pattern does not include a %p (as is the default)
-        * and core_uses_pid is set, then .%pid will be appended to
-        * the filename */
-       if (!pid_in_pattern
-            && (core_uses_pid || atomic_read(&current->mm->mm_users) != 1)) {
-               rc = snprintf(out_ptr, out_end - out_ptr,
-                             ".%d", current->pid);
-               if (rc > out_end - out_ptr)
-                       goto out;
-               out_ptr += rc;
-       }
-      out:
-       *out_ptr = 0;
-}
-
-int do_coredump(long signr, struct pt_regs * regs)
-{
-       struct linux_binfmt * binfmt;
-       char corename[CORENAME_MAX_SIZE + 1];
-       struct file * file;
-       struct inode * inode;
-       int retval = 0;
-
-       lock_kernel();
-       binfmt = current->binfmt;
-       if (!binfmt || !binfmt->core_dump)
-               goto fail;
-       if (!is_dumpable(current))
-               goto fail;
-       current->mm->dumpable = 0;
-       if (current->rlim[RLIMIT_CORE].rlim_cur < binfmt->min_coredump)
-               goto fail;
-
-       format_corename(corename, core_pattern, signr);
-       file = filp_open(corename, O_CREAT | 2 | O_NOFOLLOW, 0600);
-       if (IS_ERR(file))
-               goto fail;
-       inode = file->f_dentry->d_inode;
-       if (inode->i_nlink > 1)
-               goto close_fail;        /* multiple links - don't dump */
-       if (d_unhashed(file->f_dentry))
-               goto close_fail;
-
-       if (!S_ISREG(inode->i_mode))
-               goto close_fail;
-       if (!file->f_op)
-               goto close_fail;
-       if (!file->f_op->write)
-               goto close_fail;
-       if (do_truncate(file->f_dentry, 0) != 0)
-               goto close_fail;
-
-       retval = binfmt->core_dump(signr, regs, file);
-
-close_fail:
-       filp_close(file, NULL);
-fail:
-       unlock_kernel();
-       return retval;
-}
diff --git a/xenolinux-2.4.21-sparse/fs/partitions/Config.in b/xenolinux-2.4.21-sparse/fs/partitions/Config.in
deleted file mode 100644 (file)
index b9650de..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-#
-# Partition configuration
-#
-bool 'Advanced partition selection' CONFIG_PARTITION_ADVANCED
-if [ "$CONFIG_PARTITION_ADVANCED" = "y" ]; then
-   bool '  Acorn partition support' CONFIG_ACORN_PARTITION
-   if [ "$CONFIG_ACORN_PARTITION" != "n" ]; then
-#      bool '    Cumana partition support' CONFIG_ACORN_PARTITION_CUMANA
-      bool '    ICS partition support' CONFIG_ACORN_PARTITION_ICS
-      bool '    Native filecore partition support' CONFIG_ACORN_PARTITION_ADFS
-      bool '    PowerTec partition support' CONFIG_ACORN_PARTITION_POWERTEC
-      bool '    RISCiX partition support' CONFIG_ACORN_PARTITION_RISCIX
-   fi
-   bool '  Alpha OSF partition support' CONFIG_OSF_PARTITION
-   bool '  Amiga partition table support' CONFIG_AMIGA_PARTITION
-   bool '  Atari partition table support' CONFIG_ATARI_PARTITION
-   if [ "$CONFIG_ARCH_S390" = "y" ]; then
-      bool '  IBM disk label and partition support' CONFIG_IBM_PARTITION
-   fi
-   bool '  Macintosh partition map support' CONFIG_MAC_PARTITION
-   bool '  Xeno partition support' CONFIG_XENO_PARTITION
-   bool '  PC BIOS (MSDOS partition tables) support' CONFIG_MSDOS_PARTITION
-   if [ "$CONFIG_MSDOS_PARTITION" = "y" ]; then
-      bool '    BSD disklabel (FreeBSD partition tables) support' CONFIG_BSD_DISKLABEL
-      bool '    Minix subpartition support' CONFIG_MINIX_SUBPARTITION
-      bool '    Solaris (x86) partition table support' CONFIG_SOLARIS_X86_PARTITION
-      bool '    Unixware slices support' CONFIG_UNIXWARE_DISKLABEL
-   fi
-   dep_bool '  Windows Logical Disk Manager (Dynamic Disk) support (EXPERIMENTAL)' CONFIG_LDM_PARTITION $CONFIG_EXPERIMENTAL
-   if [ "$CONFIG_LDM_PARTITION" = "y" ]; then
-      bool '    Windows LDM extra logging' CONFIG_LDM_DEBUG
-   fi
-   bool '  SGI partition support' CONFIG_SGI_PARTITION
-   bool '  Ultrix partition table support' CONFIG_ULTRIX_PARTITION
-   bool '  Sun partition tables support' CONFIG_SUN_PARTITION
-   bool '  EFI GUID Partition support' CONFIG_EFI_PARTITION
-else
-   if [ "$CONFIG_ALPHA" = "y" ]; then
-      define_bool CONFIG_OSF_PARTITION y
-   fi
-   if [ "$CONFIG_AMIGA" != "y" -a "$CONFIG_ATARI" != "y" -a \
-        "$CONFIG_MAC" != "y" -a "$CONFIG_SGI_IP22" != "y" -a \
-       "$CONFIG_SGI_IP27" != "y" ]; then
-      define_bool CONFIG_MSDOS_PARTITION y
-   fi
-   if [ "$CONFIG_AMIGA" = "y" -o "$CONFIG_AFFS_FS" = "y" ]; then
-      define_bool CONFIG_AMIGA_PARTITION y
-   fi
-   if [ "$CONFIG_MAC" = "y" ]; then
-      define_bool CONFIG_MAC_PARTITION y
-   fi
-   if [ "$CONFIG_ARCH_ACORN" = "y" ]; then
-      define_bool CONFIG_ACORN_PARTITION y
-      define_bool CONFIG_ACORN_PARTITION_ADFS y
-#      define_bool CONFIG_ACORN_PARTITION_CUMANA y
-      define_bool CONFIG_ACORN_PARTITION_ICS y
-      define_bool CONFIG_ACORN_PARTITION_POWERTEC y
-      define_bool CONFIG_ACORN_PARTITION_RISCIX y
-   fi
-   if [ "$CONFIG_ATARI" = "y" ]; then
-      define_bool CONFIG_ATARI_PARTITION y
-   fi
-   if [ "$CONFIG_SGI_IP22" = "y" -o "$CONFIG_SGI_IP27" = "y" ]; then
-      define_bool CONFIG_SGI_PARTITION y
-   fi
-   if [ "$CONFIG_DECSTATION" = "y" ]; then
-      define_bool CONFIG_ULTRIX_PARTITION y
-   fi
-   if [ "$CONFIG_SPARC32" = "y" -o "$CONFIG_SPARC64" = "y" ]; then
-      define_bool CONFIG_SUN_PARTITION y
-   fi
-fi
diff --git a/xenolinux-2.4.21-sparse/fs/partitions/Makefile b/xenolinux-2.4.21-sparse/fs/partitions/Makefile
deleted file mode 100644 (file)
index 097e5ca..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-#
-# Makefile for the linux kernel.
-#
-# Note! Dependencies are done automagically by 'make dep', which also
-# removes any old dependencies. DON'T put your own dependencies here
-# unless it's something special (ie not a .c file).
-#
-# Note 2! The CFLAGS definitions are now in the main makefile...
-
-O_TARGET := partitions.o
-
-export-objs := check.o msdos.o
-
-obj-y := check.o
-
-obj-$(CONFIG_ACORN_PARTITION) += acorn.o
-obj-$(CONFIG_XENO_PARTITION) += xeno.o
-obj-$(CONFIG_AMIGA_PARTITION) += amiga.o
-obj-$(CONFIG_ATARI_PARTITION) += atari.o
-obj-$(CONFIG_MAC_PARTITION) += mac.o
-obj-$(CONFIG_LDM_PARTITION) += ldm.o
-obj-$(CONFIG_MSDOS_PARTITION) += msdos.o
-obj-$(CONFIG_OSF_PARTITION) += osf.o
-obj-$(CONFIG_SGI_PARTITION) += sgi.o
-obj-$(CONFIG_SUN_PARTITION) += sun.o
-obj-$(CONFIG_ULTRIX_PARTITION) += ultrix.o
-obj-$(CONFIG_IBM_PARTITION) += ibm.o
-obj-$(CONFIG_EFI_PARTITION) += efi.o
-
-include $(TOPDIR)/Rules.make
diff --git a/xenolinux-2.4.21-sparse/fs/partitions/check.c b/xenolinux-2.4.21-sparse/fs/partitions/check.c
deleted file mode 100644 (file)
index e279aa8..0000000
+++ /dev/null
@@ -1,443 +0,0 @@
-/*
- *  Code extracted from drivers/block/genhd.c
- *  Copyright (C) 1991-1998  Linus Torvalds
- *  Re-organised Feb 1998 Russell King
- *
- *  We now have independent partition support from the
- *  block drivers, which allows all the partition code to
- *  be grouped in one location, and it to be mostly self
- *  contained.
- *
- *  Added needed MAJORS for new pairs, {hdi,hdj}, {hdk,hdl}
- */
-
-#include <linux/config.h>
-#include <linux/fs.h>
-#include <linux/genhd.h>
-#include <linux/kernel.h>
-#include <linux/major.h>
-#include <linux/blk.h>
-#include <linux/init.h>
-#include <linux/raid/md.h>
-
-#include "check.h"
-
-#include "acorn.h"
-#include "amiga.h"
-#include "atari.h"
-#include "ldm.h"
-#include "mac.h"
-#include "msdos.h"
-#include "osf.h"
-#include "sgi.h"
-#include "sun.h"
-#include "ibm.h"
-#include "ultrix.h"
-#include "efi.h"
-#include "xeno.h"
-
-extern int *blk_size[];
-
-int warn_no_part = 1; /*This is ugly: should make genhd removable media aware*/
-
-static int (*check_part[])(struct gendisk *hd, struct block_device *bdev, unsigned long first_sect, int first_minor) = {
-#ifdef CONFIG_XENO_PARTITION
-        xeno_partition,         /* this must come first */
-#endif
-#ifdef CONFIG_ACORN_PARTITION
-       acorn_partition,
-#endif
-#ifdef CONFIG_EFI_PARTITION
-       efi_partition,          /* this must come before msdos */
-#endif
-#ifdef CONFIG_LDM_PARTITION
-       ldm_partition,          /* this must come before msdos */
-#endif
-#ifdef CONFIG_MSDOS_PARTITION
-       msdos_partition,
-#endif
-#ifdef CONFIG_OSF_PARTITION
-       osf_partition,
-#endif
-#ifdef CONFIG_SUN_PARTITION
-       sun_partition,
-#endif
-#ifdef CONFIG_AMIGA_PARTITION
-       amiga_partition,
-#endif
-#ifdef CONFIG_ATARI_PARTITION
-       atari_partition,
-#endif
-#ifdef CONFIG_MAC_PARTITION
-       mac_partition,
-#endif
-#ifdef CONFIG_SGI_PARTITION
-       sgi_partition,
-#endif
-#ifdef CONFIG_ULTRIX_PARTITION
-       ultrix_partition,
-#endif
-#ifdef CONFIG_IBM_PARTITION
-       ibm_partition,
-#endif
-       NULL
-};
-
-/*
- *     This is ucking fugly but its probably the best thing for 2.4.x
- *     Take it as a clear reminder that: 1) we should put the device name
- *     generation in the object kdev_t points to in 2.5.
- *     and 2) ioctls better work on half-opened devices.
- */
-#ifdef CONFIG_ARCH_S390
-int (*genhd_dasd_name)(char*,int,int,struct gendisk*) = NULL;
-int (*genhd_dasd_ioctl)(struct inode *inp, struct file *filp,
-                           unsigned int no, unsigned long data);
-EXPORT_SYMBOL(genhd_dasd_name);
-EXPORT_SYMBOL(genhd_dasd_ioctl);
-#endif
-
-/*
- * disk_name() is used by partition check code and the md driver.
- * It formats the devicename of the indicated disk into
- * the supplied buffer (of size at least 32), and returns
- * a pointer to that same buffer (for convenience).
- */
-
-char *disk_name (struct gendisk *hd, int minor, char *buf)
-{
-       const char *maj = hd->major_name;
-       unsigned int unit = (minor >> hd->minor_shift);
-       unsigned int part = (minor & ((1 << hd->minor_shift) -1 ));
-
-       if ((unit < hd->nr_real) && hd->part[minor].de) {
-               int pos;
-
-               pos = devfs_generate_path (hd->part[minor].de, buf, 64);
-               if (pos >= 0)
-                       return buf + pos;
-       }
-
-#ifdef CONFIG_ARCH_S390
-       if (genhd_dasd_name
-           && genhd_dasd_name (buf, unit, part, hd) == 0)
-               return buf;
-#endif
-       /*
-        * IDE devices use multiple major numbers, but the drives
-        * are named as:  {hda,hdb}, {hdc,hdd}, {hde,hdf}, {hdg,hdh}..
-        * This requires special handling here.
-        */
-       switch (hd->major) {
-               case IDE9_MAJOR:
-                       unit += 2;
-               case IDE8_MAJOR:
-                       unit += 2;
-               case IDE7_MAJOR:
-                       unit += 2;
-               case IDE6_MAJOR:
-                       unit += 2;
-               case IDE5_MAJOR:
-                       unit += 2;
-               case IDE4_MAJOR:
-                       unit += 2;
-               case IDE3_MAJOR:
-                       unit += 2;
-               case IDE2_MAJOR:
-                       unit += 2;
-               case IDE1_MAJOR:
-                       unit += 2;
-               case IDE0_MAJOR:
-                       maj = "hd";
-                       break;
-               case MD_MAJOR:
-                       sprintf(buf, "%s%d", maj, unit);
-                       return buf;
-       }
-       if (hd->major >= SCSI_DISK1_MAJOR && hd->major <= SCSI_DISK7_MAJOR) {
-               unit = unit + (hd->major - SCSI_DISK1_MAJOR + 1) * 16;
-               if (unit+'a' > 'z') {
-                       unit -= 26;
-                       sprintf(buf, "sd%c%c", 'a' + unit / 26, 'a' + unit % 26);
-                       if (part)
-                               sprintf(buf + 4, "%d", part);
-                       return buf;
-               }
-       }
-       if (hd->major >= COMPAQ_SMART2_MAJOR && hd->major <= COMPAQ_SMART2_MAJOR+7) {
-               int ctlr = hd->major - COMPAQ_SMART2_MAJOR;
-               if (part == 0)
-                       sprintf(buf, "%s/c%dd%d", maj, ctlr, unit);
-               else
-                       sprintf(buf, "%s/c%dd%dp%d", maj, ctlr, unit, part);
-               return buf;
-       }
-       if (hd->major >= COMPAQ_CISS_MAJOR && hd->major <= COMPAQ_CISS_MAJOR+7) {
-                int ctlr = hd->major - COMPAQ_CISS_MAJOR;
-                if (part == 0)
-                        sprintf(buf, "%s/c%dd%d", maj, ctlr, unit);
-                else
-                        sprintf(buf, "%s/c%dd%dp%d", maj, ctlr, unit, part);
-                return buf;
-       }
-       if (hd->major >= DAC960_MAJOR && hd->major <= DAC960_MAJOR+7) {
-               int ctlr = hd->major - DAC960_MAJOR;
-               if (part == 0)
-                       sprintf(buf, "%s/c%dd%d", maj, ctlr, unit);
-               else
-                       sprintf(buf, "%s/c%dd%dp%d", maj, ctlr, unit, part);
-               return buf;
-       }
-       if (hd->major == ATARAID_MAJOR) {
-               int disk = minor >> hd->minor_shift;
-               int part = minor & (( 1 << hd->minor_shift) - 1);
-               if (part == 0)
-                       sprintf(buf, "%s/d%d", maj, disk);
-               else
-                       sprintf(buf, "%s/d%dp%d", maj, disk, part);
-               return buf;
-       }
-       if (part)
-               sprintf(buf, "%s%c%d", maj, unit+'a', part);
-       else
-               sprintf(buf, "%s%c", maj, unit+'a');
-       return buf;
-}
-
-/*
- * Add a partitions details to the devices partition description.
- */
-void add_gd_partition(struct gendisk *hd, int minor, int start, int size)
-{
-#ifndef CONFIG_DEVFS_FS
-       char buf[40];
-#endif
-
-       hd->part[minor].start_sect = start;
-       hd->part[minor].nr_sects   = size;
-#ifdef CONFIG_DEVFS_FS
-       printk(" p%d", (minor & ((1 << hd->minor_shift) - 1)));
-#else
-       if ((hd->major >= COMPAQ_SMART2_MAJOR+0 && hd->major <= COMPAQ_SMART2_MAJOR+7) ||
-           (hd->major >= COMPAQ_CISS_MAJOR+0 && hd->major <= COMPAQ_CISS_MAJOR+7))
-               printk(" p%d", (minor & ((1 << hd->minor_shift) - 1)));
-       else
-               printk(" %s", disk_name(hd, minor, buf));
-#endif
-}
-
-static void check_partition(struct gendisk *hd, kdev_t dev, int first_part_minor)
-{
-       devfs_handle_t de = NULL;
-       static int first_time = 1;
-       unsigned long first_sector;
-       struct block_device *bdev;
-       char buf[64];
-       int i;
-
-       if (first_time)
-               printk(KERN_INFO "Partition check:\n");
-       first_time = 0;
-       first_sector = hd->part[MINOR(dev)].start_sect;
-
-       /*
-        * This is a kludge to allow the partition check to be
-        * skipped for specific drives (e.g. IDE CD-ROM drives)
-        */
-       if ((int)first_sector == -1) {
-               hd->part[MINOR(dev)].start_sect = 0;
-               return;
-       }
-
-       if (hd->de_arr)
-               de = hd->de_arr[MINOR(dev) >> hd->minor_shift];
-       i = devfs_generate_path (de, buf, sizeof buf);
-       if (i >= 0)
-               printk(KERN_INFO " /dev/%s:", buf + i);
-       else
-               printk(KERN_INFO " %s:", disk_name(hd, MINOR(dev), buf));
-       bdev = bdget(kdev_t_to_nr(dev));
-       bdev->bd_inode->i_size = (loff_t)hd->part[MINOR(dev)].nr_sects << 9;
-       bdev->bd_inode->i_blkbits = blksize_bits(block_size(dev));
-       for (i = 0; check_part[i]; i++) {
-               int res;
-               res = check_part[i](hd, bdev, first_sector, first_part_minor);
-               if (res) {
-                       if (res < 0 &&  warn_no_part)
-                               printk(" unable to read partition table\n");
-                       goto setup_devfs;
-               }
-       }
-
-       printk(" unknown partition table\n");
-setup_devfs:
-       invalidate_bdev(bdev, 1);
-       truncate_inode_pages(bdev->bd_inode->i_mapping, 0);
-       bdput(bdev);
-       i = first_part_minor - 1;
-       devfs_register_partitions (hd, i, hd->sizes ? 0 : 1);
-}
-
-#ifdef CONFIG_DEVFS_FS
-static void devfs_register_partition (struct gendisk *dev, int minor, int part)
-{
-       int devnum = minor >> dev->minor_shift;
-       devfs_handle_t dir;
-       unsigned int devfs_flags = DEVFS_FL_DEFAULT;
-       char devname[16];
-
-       if (dev->part[minor + part].de) return;
-       dir = devfs_get_parent (dev->part[minor].de);
-       if (!dir) return;
-       if ( dev->flags && (dev->flags[devnum] & GENHD_FL_REMOVABLE) )
-               devfs_flags |= DEVFS_FL_REMOVABLE;
-       sprintf (devname, "part%d", part);
-       dev->part[minor + part].de =
-           devfs_register (dir, devname, devfs_flags,
-                           dev->major, minor + part,
-                           S_IFBLK | S_IRUSR | S_IWUSR,
-                           dev->fops, NULL);
-}
-
-static struct unique_numspace disc_numspace = UNIQUE_NUMBERSPACE_INITIALISER;
-
-static void devfs_register_disc (struct gendisk *dev, int minor)
-{
-       int pos = 0;
-       int devnum = minor >> dev->minor_shift;
-       devfs_handle_t dir, slave;
-       unsigned int devfs_flags = DEVFS_FL_DEFAULT;
-       char dirname[64], symlink[16];
-       static devfs_handle_t devfs_handle;
-
-       if (dev->part[minor].de) return;
-       if ( dev->flags && (dev->flags[devnum] & GENHD_FL_REMOVABLE) )
-               devfs_flags |= DEVFS_FL_REMOVABLE;
-       if (dev->de_arr) {
-               dir = dev->de_arr[devnum];
-               if (!dir)  /*  Aware driver wants to block disc management  */
-                       return;
-               pos = devfs_generate_path (dir, dirname + 3, sizeof dirname-3);
-               if (pos < 0) return;
-               strncpy (dirname + pos, "../", 3);
-       }
-       else {
-               /*  Unaware driver: construct "real" directory  */
-               sprintf (dirname, "../%s/disc%d", dev->major_name, devnum);
-               dir = devfs_mk_dir (NULL, dirname + 3, NULL);
-       }
-       if (!devfs_handle)
-               devfs_handle = devfs_mk_dir (NULL, "discs", NULL);
-       dev->part[minor].number = devfs_alloc_unique_number (&disc_numspace);
-       sprintf (symlink, "disc%d", dev->part[minor].number);
-       devfs_mk_symlink (devfs_handle, symlink, DEVFS_FL_DEFAULT,
-                         dirname + pos, &slave, NULL);
-       dev->part[minor].de =
-           devfs_register (dir, "disc", devfs_flags, dev->major, minor,
-                           S_IFBLK | S_IRUSR | S_IWUSR, dev->fops, NULL);
-       devfs_auto_unregister (dev->part[minor].de, slave);
-       if (!dev->de_arr)
-               devfs_auto_unregister (slave, dir);
-}
-#endif  /*  CONFIG_DEVFS_FS  */
-
-void devfs_register_partitions (struct gendisk *dev, int minor, int unregister)
-{
-#ifdef CONFIG_DEVFS_FS
-       int part;
-
-       if (!unregister)
-               devfs_register_disc (dev, minor);
-       for (part = 1; part < dev->max_p; part++) {
-               if ( unregister || (dev->part[minor].nr_sects < 1) ||
-                    (dev->part[part + minor].nr_sects < 1) ) {
-                       devfs_unregister (dev->part[part + minor].de);
-                       dev->part[part + minor].de = NULL;
-                       continue;
-               }
-               devfs_register_partition (dev, minor, part);
-       }
-       if (unregister) {
-               devfs_unregister (dev->part[minor].de);
-               dev->part[minor].de = NULL;
-               devfs_dealloc_unique_number (&disc_numspace,
-                                            dev->part[minor].number);
-       }
-#endif  /*  CONFIG_DEVFS_FS  */
-}
-
-/*
- * This function will re-read the partition tables for a given device,
- * and set things back up again.  There are some important caveats,
- * however.  You must ensure that no one is using the device, and no one
- * can start using the device while this function is being executed.
- *
- * Much of the cleanup from the old partition tables should have already been
- * done
- */
-
-void register_disk(struct gendisk *gdev, kdev_t dev, unsigned minors,
-       struct block_device_operations *ops, long size)
-{
-       if (!gdev)
-               return;
-       grok_partitions(gdev, MINOR(dev)>>gdev->minor_shift, minors, size);
-}
-
-void grok_partitions(struct gendisk *dev, int drive, unsigned minors, long size)
-{
-       int i;
-       int first_minor = drive << dev->minor_shift;
-       int end_minor   = first_minor + dev->max_p;
-
-       if(!dev->sizes)
-               blk_size[dev->major] = NULL;
-
-       dev->part[first_minor].nr_sects = size;
-       /* No such device or no minors to use for partitions */
-       if ( !size && dev->flags && (dev->flags[drive] & GENHD_FL_REMOVABLE) )
-               devfs_register_partitions (dev, first_minor, 0);
-       if (!size || minors == 1)
-               return;
-
-       if (dev->sizes) {
-               dev->sizes[first_minor] = size >> (BLOCK_SIZE_BITS - 9);
-               for (i = first_minor + 1; i < end_minor; i++)
-                       dev->sizes[i] = 0;
-       }
-       blk_size[dev->major] = dev->sizes;
-       check_partition(dev, MKDEV(dev->major, first_minor), 1 + first_minor);
-
-       /*
-        * We need to set the sizes array before we will be able to access
-        * any of the partitions on this device.
-        */
-       if (dev->sizes != NULL) {       /* optional safeguard in ll_rw_blk.c */
-               for (i = first_minor; i < end_minor; i++)
-                       dev->sizes[i] = dev->part[i].nr_sects >> (BLOCK_SIZE_BITS - 9);
-       }
-}
-
-unsigned char *read_dev_sector(struct block_device *bdev, unsigned long n, Sector *p)
-{
-       struct address_space *mapping = bdev->bd_inode->i_mapping;
-       int sect = PAGE_CACHE_SIZE / 512;
-       struct page *page;
-
-       page = read_cache_page(mapping, n/sect,
-                       (filler_t *)mapping->a_ops->readpage, NULL);
-       if (!IS_ERR(page)) {
-               wait_on_page(page);
-               if (!Page_Uptodate(page))
-                       goto fail;
-               if (PageError(page))
-                       goto fail;
-               p->v = page;
-               return (unsigned char *)page_address(page) + 512 * (n % sect);
-fail:
-               page_cache_release(page);
-       }
-       p->v = NULL;
-       return NULL;
-}
diff --git a/xenolinux-2.4.21-sparse/fs/partitions/xeno.c b/xenolinux-2.4.21-sparse/fs/partitions/xeno.c
deleted file mode 100644 (file)
index ef48583..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/* Simple hack so that client XenoLinux's can sort-of see parts of the
-   host partition table. */
-#include <linux/kernel.h>
-#include <asm/hypervisor.h>
-#include <linux/fs.h>
-#include <linux/blk.h>
-#include <linux/slab.h>
-#include <linux/genhd.h>
-#include <asm/hypervisor-ifs/block.h>
-#include <linux/pagemap.h>
-
-#include "check.h"
-#include "xeno.h"
-
-extern int xenolinux_control_msg(int operration, char *buffer, int size);
-extern unsigned short xldev_to_physdev(kdev_t xldev);
-
-/* Grab the physdisk partitions list from the hypervisor. */
-int xeno_partition(struct gendisk *hd,
-                  struct block_device *bdev,
-                  unsigned long first_sec,
-                  int first_part_minor)
-{
-    physdisk_probebuf_t *buf;
-    int i, minor;
-    
-    /* Privileged domains can read partition info themselves. */
-    if (start_info.flags & SIF_PRIVILEGED)
-        return 0;
-
-    /* This only deals with raw/direct devices (IDE & SCSI). */
-    switch ( xldev_to_physdev(bdev->bd_dev) & XENDEV_TYPE_MASK )
-    {
-    case XENDEV_IDE:
-    case XENDEV_SCSI:
-        break;
-    default:
-        return 0;
-    }
-
-    if ( (buf = kmalloc(sizeof(*buf), GFP_KERNEL)) == NULL )
-        return -ENOMEM;
-
-    buf->domain = start_info.dom_id;
-    buf->start_ind = 0;
-    buf->n_aces = PHYSDISK_MAX_ACES_PER_REQUEST;
-
-    xenolinux_control_msg(XEN_BLOCK_PHYSDEV_PROBE, (char *)buf,
-                         sizeof(*buf));
-
-    if ( buf->n_aces == PHYSDISK_MAX_ACES_PER_REQUEST )
-        printk(KERN_ALERT "Too many returns for xeno partition parser\n");
-
-    for ( i = 0; i < buf->n_aces; i++ )
-    {
-        if (buf->entries[i].partition == 0)
-           continue;
-       if (buf->entries[i].device != xldev_to_physdev(bdev->bd_dev))
-           continue;
-        if (!(buf->entries[i].mode & PHYSDISK_MODE_W))
-        {
-            if (!(buf->entries[i].mode & PHYSDISK_MODE_R))
-                continue;
-            set_device_ro(bdev->bd_dev, 1);
-        }
-       minor = buf->entries[i].partition + first_part_minor - 1;
-       add_gd_partition(hd,
-                        minor,
-                        buf->entries[i].start_sect,
-                        buf->entries[i].n_sectors);
-    }  
-
-    kfree(buf);
-
-    printk("\n");
-
-    return 1;
-}
diff --git a/xenolinux-2.4.21-sparse/fs/partitions/xeno.h b/xenolinux-2.4.21-sparse/fs/partitions/xeno.h
deleted file mode 100644 (file)
index 52cecb3..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-int xeno_partition(struct gendisk *hd, struct block_device *bdev,
-                  unsigned long fsec, int first_part_minor);
diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/bugs.h b/xenolinux-2.4.21-sparse/include/asm-xeno/bugs.h
deleted file mode 100644 (file)
index c46b6a0..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  include/asm-i386/bugs.h
- *
- *  Copyright (C) 1994  Linus Torvalds
- *
- *  Cyrix stuff, June 1998 by:
- *     - Rafael R. Reilova (moved everything from head.S),
- *        <rreilova@ececs.uc.edu>
- *     - Channing Corn (tests & fixes),
- *     - Andrew D. Balsa (code cleanup).
- *
- *  Pentium III FXSR, SSE support
- *     Gareth Hughes <gareth@valinux.com>, May 2000
- */
-
-/*
- * This is included by init/main.c to check for architecture-dependent bugs.
- *
- * Needs:
- *     void check_bugs(void);
- */
-
-#include <linux/config.h>
-#include <asm/processor.h>
-#include <asm/i387.h>
-#include <asm/msr.h>
-
-
-static void __init check_fpu(void)
-{
-    boot_cpu_data.fdiv_bug = 0;
-}
-
-static void __init check_hlt(void)
-{
-    boot_cpu_data.hlt_works_ok = 1;
-}
-
-static void __init check_bugs(void)
-{
-       extern void __init boot_init_fpu(void);
-
-       identify_cpu(&boot_cpu_data);
-       boot_init_fpu();
-#ifndef CONFIG_SMP
-       printk("CPU: ");
-       print_cpu_info(&boot_cpu_data);
-#endif
-       check_fpu();
-       check_hlt();
-    system_utsname.machine[1] = '0' + 
-        (boot_cpu_data.x86 > 6 ? 6 : boot_cpu_data.x86);
-}
diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/desc.h b/xenolinux-2.4.21-sparse/include/asm-xeno/desc.h
deleted file mode 100644 (file)
index c417cbe..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef __ARCH_DESC_H
-#define __ARCH_DESC_H
-
-#include <asm/ldt.h>
-
-#ifndef __ASSEMBLY__
-
-struct desc_struct {
-       unsigned long a,b;
-};
-
-struct Xgt_desc_struct {
-       unsigned short size;
-       unsigned long address __attribute__((packed));
-};
-
-extern struct desc_struct default_ldt[];
-
-static inline void clear_LDT(void)
-{
-    queue_set_ldt((unsigned long)&default_ldt[0], 5);
-}
-
-static inline void load_LDT(struct mm_struct *mm)
-{
-    void *segments = mm->context.segments;
-    int count = LDT_ENTRIES;
-
-    if (!segments) {
-        segments = &default_ldt[0];
-        count = 5;
-    }
-         
-    queue_set_ldt((unsigned long)segments, count);
-}
-
-#endif /* __ASSEMBLY__ */
-
-#endif /* __ARCH_DESC_H__ */
diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/fixmap.h b/xenolinux-2.4.21-sparse/include/asm-xeno/fixmap.h
deleted file mode 100644 (file)
index 346dd73..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * fixmap.h: compile-time virtual memory allocation
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * Copyright (C) 1998 Ingo Molnar
- *
- * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
- */
-
-#ifndef _ASM_FIXMAP_H
-#define _ASM_FIXMAP_H
-
-#include <linux/config.h>
-#include <linux/kernel.h>
-#include <asm/apicdef.h>
-#include <asm/page.h>
-
-/*
- * Here we define all the compile-time 'special' virtual
- * addresses. The point is to have a constant address at
- * compile time, but to set the physical address only
- * in the boot process. We allocate these special  addresses
- * from the end of virtual memory (0xfffff000) backwards.
- * Also this lets us do fail-safe vmalloc(), we
- * can guarantee that these special addresses and
- * vmalloc()-ed addresses never overlap.
- *
- * these 'compile-time allocated' memory buffers are
- * fixed-size 4k pages. (or larger if used with an increment
- * highger than 1) use fixmap_set(idx,phys) to associate
- * physical memory with fixmap indices.
- *
- * TLB entries of such buffers will not be flushed across
- * task switches.
- */
-
-enum fixed_addresses {
-#ifdef CONFIG_HIGHMEM_XXX
-       FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */
-       FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
-#endif
-       FIX_BLKRING_BASE,
-       FIX_NETRING0_BASE,
-       FIX_NETRING1_BASE,
-       FIX_NETRING2_BASE,
-       FIX_NETRING3_BASE,
-
-#ifdef CONFIG_VGA_CONSOLE
-#define NR_FIX_BTMAPS   32  /* 128KB For the Dom0 VGA Console A0000-C0000 */
-#else
-#define NR_FIX_BTMAPS   1   /* have on page incase anyone wants it in future */
-#endif
-        FIX_BTMAP_END,
-        FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS - 1,
-       /* our bt_ioremap is permenant unlike other architectures */
-
-       __end_of_permanent_fixed_addresses,
-       __end_of_fixed_addresses = __end_of_permanent_fixed_addresses
-};
-
-extern void __set_fixmap (enum fixed_addresses idx,
-                                       unsigned long phys, pgprot_t flags);
-
-#define set_fixmap(idx, phys) \
-               __set_fixmap(idx, phys, PAGE_KERNEL)
-/*
- * Some hardware wants to get fixmapped without caching.
- */
-#define set_fixmap_nocache(idx, phys) \
-               __set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
-/*
- * used by vmalloc.c.
- *
- * Leave one empty page between vmalloc'ed areas and
- * the start of the fixmap, and leave one page empty
- * at the top of mem..
- */
-#define FIXADDR_TOP   (HYPERVISOR_VIRT_START - 2*PAGE_SIZE)
-#define __FIXADDR_SIZE        (__end_of_fixed_addresses << PAGE_SHIFT)
-#define FIXADDR_START (FIXADDR_TOP - __FIXADDR_SIZE)
-
-#define __fix_to_virt(x)       (FIXADDR_TOP - ((x) << PAGE_SHIFT))
-
-/*
- * 'index to address' translation. If anyone tries to use the idx
- * directly without tranlation, we catch the bug with a NULL-deference
- * kernel oops. Illegal ranges of incoming indices are caught too.
- */
-static inline unsigned long fix_to_virt(unsigned int idx)
-{
-        return __fix_to_virt(idx);
-}
-
-#endif
diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/highmem.h b/xenolinux-2.4.21-sparse/include/asm-xeno/highmem.h
deleted file mode 100644 (file)
index 7e56b1b..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#error "Highmem unsupported!"
-
diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/hw_irq.h b/xenolinux-2.4.21-sparse/include/asm-xeno/hw_irq.h
deleted file mode 100644 (file)
index d99d15b..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-#ifndef _ASM_HW_IRQ_H
-#define _ASM_HW_IRQ_H
-
-/*
- *     linux/include/asm/hw_irq.h
- *
- *     (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar
- */
-
-#include <linux/config.h>
-#include <linux/smp.h>
-#include <asm/atomic.h>
-#include <asm/irq.h>
-
-#define SYSCALL_VECTOR         0x80
-
-extern int irq_vector[NR_IRQS];
-
-extern atomic_t irq_err_count;
-extern atomic_t irq_mis_count;
-
-extern char _stext, _etext;
-
-extern unsigned long prof_cpu_mask;
-extern unsigned int * prof_buffer;
-extern unsigned long prof_len;
-extern unsigned long prof_shift;
-
-/*
- * x86 profiling function, SMP safe. We might want to do this in
- * assembly totally?
- */
-static inline void x86_do_profile (unsigned long eip)
-{
-        if (!prof_buffer)
-                return;
-
-        /*
-         * Only measure the CPUs specified by /proc/irq/prof_cpu_mask.
-         * (default is all CPUs.)
-         */
-        if (!((1<<smp_processor_id()) & prof_cpu_mask))
-                return;
-
-        eip -= (unsigned long) &_stext;
-        eip >>= prof_shift;
-        /*
-         * Don't ignore out-of-bounds EIP values silently,
-         * put them into the last histogram slot, so if
-         * present, they will show up as a sharp peak.
-         */
-        if (eip > prof_len-1)
-                eip = prof_len-1;
-        atomic_inc((atomic_t *)&prof_buffer[eip]);
-}
-
-static inline void hw_resend_irq(struct hw_interrupt_type *h,
-                                 unsigned int i)
-{}
-
-#endif /* _ASM_HW_IRQ_H */
diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/hypervisor.h b/xenolinux-2.4.21-sparse/include/asm-xeno/hypervisor.h
deleted file mode 100644 (file)
index 751bdc7..0000000
+++ /dev/null
@@ -1,367 +0,0 @@
-/******************************************************************************
- * hypervisor.h
- * 
- * Linux-specific hypervisor handling.
- * 
- * Copyright (c) 2002, K A Fraser
- */
-
-#ifndef __HYPERVISOR_H__
-#define __HYPERVISOR_H__
-
-#include <linux/types.h>
-#include <asm/hypervisor-ifs/hypervisor-if.h>
-#include <asm/ptrace.h>
-
-/* arch/xeno/kernel/setup.c */
-union start_info_union
-{
-    start_info_t start_info;
-    char padding[512];
-};
-extern union start_info_union start_info_union;
-#define start_info (start_info_union.start_info)
-
-/* arch/xeno/kernel/hypervisor.c */
-void do_hypervisor_callback(struct pt_regs *regs);
-
-
-/* arch/xeno/mm/hypervisor.c */
-/*
- * NB. ptr values should be PHYSICAL, not MACHINE. 'vals' should be already
- * be MACHINE addresses.
- */
-
-extern unsigned int pt_update_queue_idx;
-
-void queue_l1_entry_update(unsigned long ptr, unsigned long val);
-void queue_l2_entry_update(unsigned long ptr, unsigned long val);
-void queue_pt_switch(unsigned long ptr);
-void queue_tlb_flush(void);
-void queue_invlpg(unsigned long ptr);
-void queue_pgd_pin(unsigned long ptr);
-void queue_pgd_unpin(unsigned long ptr);
-void queue_pte_pin(unsigned long ptr);
-void queue_pte_unpin(unsigned long ptr);
-void queue_set_ldt(unsigned long ptr, unsigned long bytes);
-#define PT_UPDATE_DEBUG 0
-
-#if PT_UPDATE_DEBUG > 0
-typedef struct {
-    unsigned long ptr, val, pteval;
-    void *ptep;
-    int line; char *file;
-} page_update_debug_t;
-extern page_update_debug_t update_debug_queue[];
-#define queue_l1_entry_update(_p,_v) ({                           \
- update_debug_queue[pt_update_queue_idx].ptr  = (_p);             \
- update_debug_queue[pt_update_queue_idx].val  = (_v);             \
- update_debug_queue[pt_update_queue_idx].line = __LINE__;         \
- update_debug_queue[pt_update_queue_idx].file = __FILE__;         \
- queue_l1_entry_update((_p),(_v));                                \
-})
-#define queue_l2_entry_update(_p,_v) ({                           \
- update_debug_queue[pt_update_queue_idx].ptr  = (_p);             \
- update_debug_queue[pt_update_queue_idx].val  = (_v);             \
- update_debug_queue[pt_update_queue_idx].line = __LINE__;         \
- update_debug_queue[pt_update_queue_idx].file = __FILE__;         \
- queue_l2_entry_update((_p),(_v));                                \
-})
-#endif
-
-#if PT_UPDATE_DEBUG > 1
-#undef queue_l1_entry_update
-#undef queue_l2_entry_update
-#define queue_l1_entry_update(_p,_v) ({                           \
- update_debug_queue[pt_update_queue_idx].ptr  = (_p);             \
- update_debug_queue[pt_update_queue_idx].val  = (_v);             \
- update_debug_queue[pt_update_queue_idx].line = __LINE__;         \
- update_debug_queue[pt_update_queue_idx].file = __FILE__;         \
- printk("L1 %s %d: %08lx (%08lx -> %08lx)\n", __FILE__, __LINE__, \
-        phys_to_machine(_p), *(unsigned long *)__va(_p),          \
-        (unsigned long)(_v));                                     \
- queue_l1_entry_update((_p),(_v));                                \
-})
-#define queue_l2_entry_update(_p,_v) ({                           \
- update_debug_queue[pt_update_queue_idx].ptr  = (_p);             \
- update_debug_queue[pt_update_queue_idx].val  = (_v);             \
- update_debug_queue[pt_update_queue_idx].line = __LINE__;         \
- update_debug_queue[pt_update_queue_idx].file = __FILE__;         \
- printk("L2 %s %d: %08lx (%08lx -> %08lx)\n", __FILE__, __LINE__, \
-        phys_to_machine(_p), *(unsigned long *)__va(_p),          \
-        (unsigned long)(_v));                                     \
- queue_l2_entry_update((_p),(_v));                                \
-})
-#define queue_pt_switch(_p) ({                                    \
- printk("PTSWITCH %s %d: %08lx\n", __FILE__, __LINE__, (_p));     \
- queue_pt_switch(_p);                                             \
-})   
-#define queue_tlb_flush() ({                                      \
- printk("TLB FLUSH %s %d\n", __FILE__, __LINE__);                 \
- queue_tlb_flush();                                               \
-})   
-#define queue_invlpg(_p) ({                                       \
- printk("INVLPG %s %d: %08lx\n", __FILE__, __LINE__, (_p));       \
- queue_invlpg(_p);                                                \
-})   
-#define queue_pgd_pin(_p) ({                                      \
- printk("PGD PIN %s %d: %08lx\n", __FILE__, __LINE__, (_p));      \
- queue_pgd_pin(_p);                                               \
-})   
-#define queue_pgd_unpin(_p) ({                                    \
- printk("PGD UNPIN %s %d: %08lx\n", __FILE__, __LINE__, (_p));    \
- queue_pgd_unpin(_p);                                             \
-})   
-#define queue_pte_pin(_p) ({                                      \
- printk("PTE PIN %s %d: %08lx\n", __FILE__, __LINE__, (_p));      \
- queue_pte_pin(_p);                                               \
-})   
-#define queue_pte_unpin(_p) ({                                    \
- printk("PTE UNPIN %s %d: %08lx\n", __FILE__, __LINE__, (_p));    \
- queue_pte_unpin(_p);                                             \
-})   
-#define queue_set_ldt(_p,_l) ({                                        \
- printk("SETL LDT %s %d: %08lx %d\n", __FILE__, __LINE__, (_p), (_l)); \
- queue_set_ldt((_p), (_l));                                            \
-})   
-#endif
-
-void _flush_page_update_queue(void);
-static inline int flush_page_update_queue(void)
-{
-    unsigned int idx = pt_update_queue_idx;
-    if ( idx != 0 ) _flush_page_update_queue();
-    return idx;
-}
-#define XENO_flush_page_update_queue() (_flush_page_update_queue())
-void MULTICALL_flush_page_update_queue(void);
-
-
-/*
- * Assembler stubs for hyper-calls.
- */
-
-static inline int HYPERVISOR_set_trap_table(trap_info_t *table)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_set_trap_table),
-        "b" (table) );
-
-    return ret;
-}
-
-
-static inline int HYPERVISOR_pt_update(page_update_request_t *req, int count)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_pt_update), 
-        "b" (req), "c" (count) );
-
-    return ret;
-}
-
-
-static inline int HYPERVISOR_console_write(const char *str, int count)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_console_write), 
-        "b" (str), "c" (count) );
-
-
-    return ret;
-}
-
-static inline int HYPERVISOR_set_gdt(unsigned long *frame_list, int entries)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_set_gdt), 
-        "b" (frame_list), "c" (entries) );
-
-
-    return ret;
-}
-
-static inline int HYPERVISOR_stack_switch(unsigned long ss, unsigned long esp)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_stack_switch),
-        "b" (ss), "c" (esp) : "memory" );
-
-    return ret;
-}
-
-static inline int HYPERVISOR_set_callbacks(
-    unsigned long event_selector, unsigned long event_address,
-    unsigned long failsafe_selector, unsigned long failsafe_address)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_set_callbacks),
-        "b" (event_selector), "c" (event_address), 
-        "d" (failsafe_selector), "S" (failsafe_address) : "memory" );
-
-    return ret;
-}
-
-static inline int HYPERVISOR_net_update(void)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_net_update) );
-
-    return ret;
-}
-
-static inline int HYPERVISOR_fpu_taskswitch(void)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_fpu_taskswitch) );
-
-    return ret;
-}
-
-static inline int HYPERVISOR_yield(void)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_yield) );
-
-    return ret;
-}
-
-static inline int HYPERVISOR_exit(void)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_exit) );
-
-    return ret;
-}
-
-static inline int HYPERVISOR_dom0_op(void *dom0_op)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_dom0_op),
-        "b" (dom0_op) : "memory" );
-
-    return ret;
-}
-
-static inline int HYPERVISOR_network_op(void *network_op)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_network_op),
-        "b" (network_op) );
-
-    return ret;
-}
-
-static inline int HYPERVISOR_block_io_op(void)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_block_io_op) ); 
-
-    return ret;
-}
-
-static inline int HYPERVISOR_set_debugreg(int reg, unsigned long value)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_set_debugreg),
-        "b" (reg), "c" (value) );
-
-    return ret;
-}
-
-static inline unsigned long HYPERVISOR_get_debugreg(int reg)
-{
-    unsigned long ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_get_debugreg),
-        "b" (reg) );
-
-    return ret;
-}
-
-static inline int HYPERVISOR_update_descriptor(
-    unsigned long pa, unsigned long word1, unsigned long word2)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_update_descriptor), 
-        "b" (pa), "c" (word1), "d" (word2) );
-
-    return ret;
-}
-
-static inline int HYPERVISOR_set_fast_trap(int idx)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_set_fast_trap), 
-        "b" (idx) );
-
-    return ret;
-}
-
-static inline int HYPERVISOR_dom_mem_op(void *dom_mem_op)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_dom_mem_op),
-        "b" (dom_mem_op) : "memory" );
-
-    return ret;
-}
-
-static inline int HYPERVISOR_multicall(void *call_list, int nr_calls)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_multicall),
-        "b" (call_list), "c" (nr_calls) : "memory" );
-
-    return ret;
-}
-
-static inline long HYPERVISOR_kbd_op(unsigned char op, unsigned char val)
-{
-    int ret;
-    __asm__ __volatile__ (
-        TRAP_INSTR
-        : "=a" (ret) : "0" (__HYPERVISOR_kbd_op),
-        "b" (op), "c" (val) );
-
-    return ret;
-}
-
-#endif /* __HYPERVISOR_H__ */
diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/irq.h b/xenolinux-2.4.21-sparse/include/asm-xeno/irq.h
deleted file mode 100644 (file)
index 3a4a3e3..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef _ASM_IRQ_H
-#define _ASM_IRQ_H
-
-/*
- *     linux/include/asm/irq.h
- *
- *     (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar
- *
- *     IRQ/IPI changes taken from work by Thomas Radke
- *     <tomsoft@informatik.tu-chemnitz.de>
- */
-
-#include <linux/config.h>
-#include <asm/hypervisor.h>
-#include <asm/ptrace.h>
-
-#define TIMER_IRQ _EVENT_TIMER
-
-#define NR_IRQS (sizeof(HYPERVISOR_shared_info->events) * 8)
-
-#define irq_cannonicalize(_irq) (_irq)
-
-extern void disable_irq(unsigned int);
-extern void disable_irq_nosync(unsigned int);
-extern void enable_irq(unsigned int);
-
-#ifdef CONFIG_X86_LOCAL_APIC
-#define ARCH_HAS_NMI_WATCHDOG          /* See include/linux/nmi.h */
-#endif
-
-#endif /* _ASM_IRQ_H */
diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/keyboard.h b/xenolinux-2.4.21-sparse/include/asm-xeno/keyboard.h
deleted file mode 100644 (file)
index 6d6461d..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-/* xenolinux/include/asm-xeno/keyboard.h */
-/* Portions copyright (c) 2003 James Scott, Intel Research Cambridge */
-/* Talks to hypervisor to get PS/2 keyboard and mouse events, and send keyboard and mouse commands */
-
-/*  Based on:
- *  linux/include/asm-i386/keyboard.h
- *
- *  Created 3 Nov 1996 by Geert Uytterhoeven
- */
-
-#ifndef _XENO_KEYBOARD_H
-#define _XENO_KEYBOARD_H
-
-#ifdef __KERNEL__
-
-#include <linux/kernel.h>
-#include <linux/ioport.h>
-#include <linux/kd.h>
-#include <linux/pm.h>
-#include <asm/io.h>
-
-extern int pckbd_setkeycode(unsigned int scancode, unsigned int keycode);
-extern int pckbd_getkeycode(unsigned int scancode);
-extern int pckbd_translate(unsigned char scancode, unsigned char *keycode,
-                          char raw_mode);
-extern char pckbd_unexpected_up(unsigned char keycode);
-extern void pckbd_leds(unsigned char leds);
-extern void pckbd_init_hw(void);
-extern int pckbd_pm_resume(struct pm_dev *, pm_request_t, void *);
-
-extern pm_callback pm_kbd_request_override;
-extern unsigned char pckbd_sysrq_xlate[128];
-
-#define kbd_setkeycode         pckbd_setkeycode
-#define kbd_getkeycode         pckbd_getkeycode
-#define kbd_translate          pckbd_translate
-#define kbd_unexpected_up      pckbd_unexpected_up
-#define kbd_leds               pckbd_leds
-#define kbd_init_hw            pckbd_init_hw
-#define kbd_sysrq_xlate                pckbd_sysrq_xlate
-
-#define SYSRQ_KEY 0x54
-
-
-/* THIS SECTION TALKS TO XEN TO DO PS2 SUPPORT */
-#include <asm/hypervisor-ifs/kbd.h>
-#include <asm/hypervisor-ifs/hypervisor-if.h>
-
-#define kbd_controller_present xen_kbd_controller_present
-
-static inline int xen_kbd_controller_present ()
-{
-    return start_info.flags & SIF_CONSOLE;
-}
-
-/* resource allocation */
-#define kbd_request_region()     \
-    do { } while (0)
-#define kbd_request_irq(handler) \
-    request_irq(_EVENT_PS2, handler, 0, "ps/2", NULL)
-
-/* could implement these with command to xen to filter mouse stuff... */
-#define aux_request_irq(hand, dev_id) 0
-#define aux_free_irq(dev_id) do { } while(0)
-
-/* Some stoneage hardware needs delays after some operations.  */
-#define kbd_pause() do { } while(0)
-
-static unsigned char kbd_current_scancode = 0;
-
-static unsigned char kbd_read_input(void) 
-{
-  return kbd_current_scancode;
-}
-
-static unsigned char kbd_read_status(void) 
-{
-  long res;
-  res = HYPERVISOR_kbd_op(KBD_OP_READ,0);
-  if ( res<0 ) 
-  {
-    kbd_current_scancode = 0;
-    return 0; /* error with our request - wrong domain? */
-  }
-  kbd_current_scancode = KBD_CODE_SCANCODE(res);
-  return KBD_CODE_STATUS(res);
-}
-
-
-#define kbd_write_output(val)  HYPERVISOR_kbd_op(KBD_OP_WRITEOUTPUT, val);
-#define kbd_write_command(val) HYPERVISOR_kbd_op(KBD_OP_WRITECOMMAND, val);
-
-
-#endif /* __KERNEL__ */
-#endif /* _XENO_KEYBOARD_H */
diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/mmu_context.h b/xenolinux-2.4.21-sparse/include/asm-xeno/mmu_context.h
deleted file mode 100644 (file)
index 1eab441..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-#ifndef __I386_MMU_CONTEXT_H
-#define __I386_MMU_CONTEXT_H
-
-#include <linux/config.h>
-#include <asm/desc.h>
-#include <asm/atomic.h>
-#include <asm/pgalloc.h>
-
-/*
- * possibly do the LDT unload here?
- */
-#define destroy_context(mm)            do { } while(0)
-#define init_new_context(tsk,mm)       0
-
-#ifdef CONFIG_SMP
-
-static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk, unsigned cpu)
-{
-       if(cpu_tlbstate[cpu].state == TLBSTATE_OK)
-               cpu_tlbstate[cpu].state = TLBSTATE_LAZY;        
-}
-#else
-static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk, unsigned cpu)
-{
-}
-#endif
-
-extern pgd_t *cur_pgd;
-
-static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, struct task_struct *tsk, unsigned cpu)
-{
-       if (prev != next) {
-               /* stop flush ipis for the previous mm */
-               clear_bit(cpu, &prev->cpu_vm_mask);
-               /*
-                * Re-load LDT if necessary
-                */
-               if (prev->context.segments != next->context.segments)
-                       load_LDT(next);
-#ifdef CONFIG_SMP
-               cpu_tlbstate[cpu].state = TLBSTATE_OK;
-               cpu_tlbstate[cpu].active_mm = next;
-#endif
-               set_bit(cpu, &next->cpu_vm_mask);
-               set_bit(cpu, &next->context.cpuvalid);
-               /* Re-load page tables */
-               cur_pgd = next->pgd;
-               queue_pt_switch(__pa(cur_pgd));
-       }
-#ifdef CONFIG_SMP
-       else {
-               cpu_tlbstate[cpu].state = TLBSTATE_OK;
-               if(cpu_tlbstate[cpu].active_mm != next)
-                       out_of_line_bug();
-               if(!test_and_set_bit(cpu, &next->cpu_vm_mask)) {
-                       /* We were in lazy tlb mode and leave_mm disabled 
-                        * tlb flush IPI delivery. We must reload %cr3.
-                        */
-                       load_cr3(next->pgd);
-               }
-               if (!test_and_set_bit(cpu, &next->context.cpuvalid))
-                       load_LDT(next);
-       }
-#endif
-}
-
-#define activate_mm(prev, next) \
-do { \
-       switch_mm((prev),(next),NULL,smp_processor_id()); \
-       flush_page_update_queue(); \
-} while ( 0 )
-
-#endif
diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/multicall.h b/xenolinux-2.4.21-sparse/include/asm-xeno/multicall.h
deleted file mode 100644 (file)
index f0ea5c3..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-/******************************************************************************
- * multicall.h
- */
-
-#ifndef __MULTICALL_H__
-#define __MULTICALL_H__
-
-#include <asm/hypervisor.h>
-
-extern multicall_entry_t multicall_list[];
-extern int nr_multicall_ents;
-
-static inline void queue_multicall0(unsigned long op)
-{
-    int i = nr_multicall_ents;
-    multicall_list[i].op      = op;
-    nr_multicall_ents = i+1;
-}
-
-static inline void queue_multicall1(unsigned long op, unsigned long arg1)
-{
-    int i = nr_multicall_ents;
-    multicall_list[i].op      = op;
-    multicall_list[i].args[0] = arg1;
-    nr_multicall_ents = i+1;
-}
-
-static inline void queue_multicall2(
-    unsigned long op, unsigned long arg1, unsigned long arg2)
-{
-    int i = nr_multicall_ents;
-    multicall_list[i].op      = op;
-    multicall_list[i].args[0] = arg1;
-    multicall_list[i].args[1] = arg2;
-    nr_multicall_ents = i+1;
-}
-
-static inline void queue_multicall3(
-    unsigned long op, unsigned long arg1, unsigned long arg2,
-    unsigned long arg3)
-{
-    int i = nr_multicall_ents;
-    multicall_list[i].op      = op;
-    multicall_list[i].args[0] = arg1;
-    multicall_list[i].args[1] = arg2;
-    multicall_list[i].args[2] = arg3;
-    nr_multicall_ents = i+1;
-}
-
-static inline void queue_multicall4(
-    unsigned long op, unsigned long arg1, unsigned long arg2,
-    unsigned long arg3, unsigned long arg4)
-{
-    int i = nr_multicall_ents;
-    multicall_list[i].op      = op;
-    multicall_list[i].args[0] = arg1;
-    multicall_list[i].args[1] = arg2;
-    multicall_list[i].args[2] = arg3;
-    multicall_list[i].args[3] = arg4;
-    nr_multicall_ents = i+1;
-}
-
-static inline void queue_multicall5(
-    unsigned long op, unsigned long arg1, unsigned long arg2,
-    unsigned long arg3, unsigned long arg4, unsigned long arg5)
-{
-    int i = nr_multicall_ents;
-    multicall_list[i].op      = op;
-    multicall_list[i].args[0] = arg1;
-    multicall_list[i].args[1] = arg2;
-    multicall_list[i].args[2] = arg3;
-    multicall_list[i].args[3] = arg4;
-    multicall_list[i].args[4] = arg5;
-    nr_multicall_ents = i+1;
-}
-
-static inline void execute_multicall_list(void)
-{
-    if ( unlikely(nr_multicall_ents == 0) ) return;
-    (void)HYPERVISOR_multicall(multicall_list, nr_multicall_ents);
-    nr_multicall_ents = 0;
-}
-
-#endif /* __MULTICALL_H__ */
diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/page.h b/xenolinux-2.4.21-sparse/include/asm-xeno/page.h
deleted file mode 100644 (file)
index d15646f..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-#ifndef _I386_PAGE_H
-#define _I386_PAGE_H
-
-/* PAGE_SHIFT determines the page size */
-#define PAGE_SHIFT     12
-#define PAGE_SIZE      (1UL << PAGE_SHIFT)
-#define PAGE_MASK      (~(PAGE_SIZE-1))
-
-#ifdef __KERNEL__
-#ifndef __ASSEMBLY__
-
-#include <linux/config.h>
-#include <asm/hypervisor.h>
-
-#ifdef CONFIG_X86_USE_3DNOW
-
-#include <asm/mmx.h>
-
-#define clear_page(page)       mmx_clear_page((void *)(page))
-#define copy_page(to,from)     mmx_copy_page(to,from)
-
-#else
-
-/*
- *     On older X86 processors its not a win to use MMX here it seems.
- *     Maybe the K6-III ?
- */
-#define clear_page(page)       memset((void *)(page), 0, PAGE_SIZE)
-#define copy_page(to,from)     memcpy((void *)(to), (void *)(from), PAGE_SIZE)
-
-#endif
-
-#define clear_user_page(page, vaddr)   clear_page(page)
-#define copy_user_page(to, from, vaddr)        copy_page(to, from)
-
-/**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/
-extern unsigned long *phys_to_machine_mapping;
-#define pfn_to_mfn(_pfn) (phys_to_machine_mapping[(_pfn)])
-#define mfn_to_pfn(_mfn) (machine_to_phys_mapping[(_mfn)])
-static inline unsigned long phys_to_machine(unsigned long phys)
-{
-    unsigned long machine = pfn_to_mfn(phys >> PAGE_SHIFT);
-    machine = (machine << PAGE_SHIFT) | (phys & ~PAGE_MASK);
-    return machine;
-}
-static inline unsigned long machine_to_phys(unsigned long machine)
-{
-    unsigned long phys = mfn_to_pfn(machine >> PAGE_SHIFT);
-    phys = (phys << PAGE_SHIFT) | (machine & ~PAGE_MASK);
-    return phys;
-}
-
-/*
- * These are used to make use of C type-checking..
- */
-#if CONFIG_X86_PAE
-typedef struct { unsigned long pte_low, pte_high; } pte_t;
-typedef struct { unsigned long long pmd; } pmd_t;
-typedef struct { unsigned long long pgd; } pgd_t;
-#define pte_val(x)     ((x).pte_low | ((unsigned long long)(x).pte_high << 32))
-#else
-typedef struct { unsigned long pte_low; } pte_t;
-typedef struct { unsigned long pmd; } pmd_t;
-typedef struct { unsigned long pgd; } pgd_t;
-static inline unsigned long pte_val(pte_t x)
-{
-    unsigned long ret = x.pte_low;
-    if ( (ret & 1) ) ret = machine_to_phys(ret);
-    return ret;
-}
-#endif
-#define PTE_MASK       PAGE_MASK
-
-typedef struct { unsigned long pgprot; } pgprot_t;
-
-static inline unsigned long pmd_val(pmd_t x)
-{
-    unsigned long ret = x.pmd;
-    if ( (ret & 1) ) ret = machine_to_phys(ret);
-    return ret;
-}
-#define pgd_val(x)     ({ BUG(); (unsigned long)0; })
-#define pgprot_val(x)  ((x).pgprot)
-
-static inline pte_t __pte(unsigned long x)
-{
-    if ( (x & 1) ) x = phys_to_machine(x);
-    return ((pte_t) { (x) });
-}
-static inline pmd_t __pmd(unsigned long x)
-{
-    if ( (x & 1) ) x = phys_to_machine(x);
-    return ((pmd_t) { (x) });
-}
-#define __pgd(x) ({ BUG(); (pgprot_t) { 0 }; })
-#define __pgprot(x)    ((pgprot_t) { (x) } )
-
-#endif /* !__ASSEMBLY__ */
-
-/* to align the pointer to the (next) page boundary */
-#define PAGE_ALIGN(addr)       (((addr)+PAGE_SIZE-1)&PAGE_MASK)
-
-/*
- * This handles the memory map.. We could make this a config
- * option, but too many people screw it up, and too few need
- * it.
- *
- * A __PAGE_OFFSET of 0xC0000000 means that the kernel has
- * a virtual address space of one gigabyte, which limits the
- * amount of physical memory you can use to about 950MB. 
- *
- * If you want more physical memory than this then see the CONFIG_HIGHMEM4G
- * and CONFIG_HIGHMEM64G options in the kernel configuration.
- */
-
-#define __PAGE_OFFSET          (0xC0000000)
-
-#ifndef __ASSEMBLY__
-
-/*
- * Tell the user there is some problem. Beep too, so we can
- * see^H^H^Hhear bugs in early bootup as well!
- * The offending file and line are encoded after the "officially
- * undefined" opcode for parsing in the trap handler.
- */
-
-#if 1  /* Set to zero for a slightly smaller kernel */
-#define BUG()                          \
- __asm__ __volatile__( "ud2\n"         \
-                       "\t.word %c0\n" \
-                       "\t.long %c1\n" \
-                        : : "i" (__LINE__), "i" (__FILE__))
-#else
-#define BUG() __asm__ __volatile__("ud2\n")
-#endif
-
-#define PAGE_BUG(page) do { \
-       BUG(); \
-} while (0)
-
-/* Pure 2^n version of get_order */
-static __inline__ int get_order(unsigned long size)
-{
-       int order;
-
-       size = (size-1) >> (PAGE_SHIFT-1);
-       order = -1;
-       do {
-               size >>= 1;
-               order++;
-       } while (size);
-       return order;
-}
-
-#endif /* __ASSEMBLY__ */
-
-#define PAGE_OFFSET            ((unsigned long)__PAGE_OFFSET)
-#define __pa(x)                        ((unsigned long)(x)-PAGE_OFFSET)
-#define __va(x)                        ((void *)((unsigned long)(x)+PAGE_OFFSET))
-#define virt_to_page(kaddr)    (mem_map + (__pa(kaddr) >> PAGE_SHIFT))
-#define VALID_PAGE(page)       ((page - mem_map) < max_mapnr)
-
-#define VM_DATA_DEFAULT_FLAGS  (VM_READ | VM_WRITE | VM_EXEC | \
-                                VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
-
-/* VIRT <-> MACHINE conversion */
-#define virt_to_machine(_a) (phys_to_machine(__pa(_a)))
-#define machine_to_virt(_m) (__va(machine_to_phys(_m)))
-
-#endif /* __KERNEL__ */
-
-#endif /* _I386_PAGE_H */
diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/pgalloc.h b/xenolinux-2.4.21-sparse/include/asm-xeno/pgalloc.h
deleted file mode 100644 (file)
index 0f502cf..0000000
+++ /dev/null
@@ -1,274 +0,0 @@
-#ifndef _I386_PGALLOC_H
-#define _I386_PGALLOC_H
-
-#include <linux/config.h>
-#include <asm/processor.h>
-#include <asm/fixmap.h>
-#include <asm/hypervisor.h>
-#include <linux/threads.h>
-
-/*
- * Quick lists are aligned so that least significant bits of array pointer
- * are all zero when list is empty, and all one when list is full.
- */
-#define QUICKLIST_ENTRIES 256
-#define QUICKLIST_EMPTY(_l) !((unsigned long)(_l) & ((QUICKLIST_ENTRIES*4)-1))
-#define QUICKLIST_FULL(_l)  QUICKLIST_EMPTY((_l)+1)
-#define pgd_quicklist (current_cpu_data.pgd_quick)
-#define pmd_quicklist (current_cpu_data.pmd_quick)
-#define pte_quicklist (current_cpu_data.pte_quick)
-#define pgtable_cache_size (current_cpu_data.pgtable_cache_sz)
-
-#define pmd_populate(mm, pmd, pte)               \
- do {                                             \
-  set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(pte)));   \
-  XENO_flush_page_update_queue();                 \
- } while ( 0 )
-
-/*
- * Allocate and free page tables.
- */
-
-#if defined (CONFIG_X86_PAE)
-
-#error "no PAE support as yet"
-
-/*
- * We can't include <linux/slab.h> here, thus these uglinesses.
- */
-struct kmem_cache_s;
-
-extern struct kmem_cache_s *pae_pgd_cachep;
-extern void *kmem_cache_alloc(struct kmem_cache_s *, int);
-extern void kmem_cache_free(struct kmem_cache_s *, void *);
-
-
-static inline pgd_t *get_pgd_slow(void)
-{
-       int i;
-       pgd_t *pgd = kmem_cache_alloc(pae_pgd_cachep, GFP_KERNEL);
-
-       if (pgd) {
-               for (i = 0; i < USER_PTRS_PER_PGD; i++) {
-                       unsigned long pmd = __get_free_page(GFP_KERNEL);
-                       if (!pmd)
-                               goto out_oom;
-                       clear_page(pmd);
-                       set_pgd(pgd + i, __pgd(1 + __pa(pmd)));
-               }
-               memcpy(pgd + USER_PTRS_PER_PGD,
-                       swapper_pg_dir + USER_PTRS_PER_PGD,
-                       (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
-       }
-       return pgd;
-out_oom:
-       for (i--; i >= 0; i--)
-               free_page((unsigned long)__va(pgd_val(pgd[i])-1));
-       kmem_cache_free(pae_pgd_cachep, pgd);
-       return NULL;
-}
-
-#else
-
-static inline pgd_t *get_pgd_slow(void)
-{
-       pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL);
-
-       if (pgd) {
-               memset(pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
-               memcpy(pgd + USER_PTRS_PER_PGD,
-                       init_mm.pgd + USER_PTRS_PER_PGD,
-                       (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
-                __make_page_readonly(pgd);
-               queue_pgd_pin(__pa(pgd));
-
-       }
-       return pgd;
-}
-
-#endif /* CONFIG_X86_PAE */
-
-static inline pgd_t *get_pgd_fast(void)
-{
-       unsigned long ret;
-
-       if ( !QUICKLIST_EMPTY(pgd_quicklist) ) {
-               ret = *(--pgd_quicklist);
-               pgtable_cache_size--;
-
-       } else
-               ret = (unsigned long)get_pgd_slow();
-       return (pgd_t *)ret;
-}
-
-static inline void free_pgd_slow(pgd_t *pgd)
-{
-#if defined(CONFIG_X86_PAE)
-#error
-       int i;
-
-       for (i = 0; i < USER_PTRS_PER_PGD; i++)
-               free_page((unsigned long)__va(pgd_val(pgd[i])-1));
-       kmem_cache_free(pae_pgd_cachep, pgd);
-#else
-       queue_pgd_unpin(__pa(pgd));
-        __make_page_writeable(pgd);
-       free_page((unsigned long)pgd);
-#endif
-}
-
-static inline void free_pgd_fast(pgd_t *pgd)
-{
-        if ( !QUICKLIST_FULL(pgd_quicklist) ) {
-                *(pgd_quicklist++) = (unsigned long)pgd;
-                pgtable_cache_size++;
-        } else
-                free_pgd_slow(pgd);
-}
-
-static inline pte_t *pte_alloc_one(struct mm_struct *mm, unsigned long address)
-{
-    pte_t *pte;
-
-    pte = (pte_t *) __get_free_page(GFP_KERNEL);
-    if (pte)
-    {
-        clear_page(pte);
-        __make_page_readonly(pte);
-        queue_pte_pin(__pa(pte));
-    }
-    return pte;
-
-}
-
-static inline pte_t *pte_alloc_one_fast(struct mm_struct *mm,
-                                       unsigned long address)
-{
-    unsigned long ret = 0;
-    if ( !QUICKLIST_EMPTY(pte_quicklist) ) {
-        ret = *(--pte_quicklist);
-        pgtable_cache_size--;
-    }
-    return (pte_t *)ret;
-}
-
-static __inline__ void pte_free_slow(pte_t *pte)
-{
-    queue_pte_unpin(__pa(pte));
-    __make_page_writeable(pte);
-    free_page((unsigned long)pte);
-}
-
-static inline void pte_free_fast(pte_t *pte)
-{
-    if ( !QUICKLIST_FULL(pte_quicklist) ) {
-        *(pte_quicklist++) = (unsigned long)pte;
-        pgtable_cache_size++;
-    } else
-        pte_free_slow(pte);
-}
-
-#define pte_free(pte)          pte_free_fast(pte)
-#define pgd_free(pgd)          free_pgd_fast(pgd)
-#define pgd_alloc(mm)          get_pgd_fast()
-
-/*
- * allocating and freeing a pmd is trivial: the 1-entry pmd is
- * inside the pgd, so has no extra memory associated with it.
- * (In the PAE case we free the pmds as part of the pgd.)
- */
-
-#define pmd_alloc_one_fast(mm, addr)   ({ BUG(); ((pmd_t *)1); })
-#define pmd_alloc_one(mm, addr)                ({ BUG(); ((pmd_t *)2); })
-#define pmd_free_slow(x)               do { } while (0)
-#define pmd_free_fast(x)               do { } while (0)
-#define pmd_free(x)                    do { } while (0)
-#define pgd_populate(mm, pmd, pte)     BUG()
-
-extern int do_check_pgt_cache(int, int);
-
-/*
- * TLB flushing:
- *
- *  - flush_tlb() flushes the current mm struct TLBs
- *  - flush_tlb_all() flushes all processes TLBs
- *  - flush_tlb_mm(mm) flushes the specified mm context TLB's
- *  - flush_tlb_page(vma, vmaddr) flushes one page
- *  - flush_tlb_range(mm, start, end) flushes a range of pages
- *  - flush_tlb_pgtables(mm, start, end) flushes a range of page tables
- *
- * ..but the i386 has somewhat limited tlb flushing capabilities,
- * and page-granular flushes are available only on i486 and up.
- */
-
-#ifndef CONFIG_SMP
-
-#define flush_tlb() __flush_tlb()
-#define flush_tlb_all() __flush_tlb_all()
-#define local_flush_tlb() __flush_tlb()
-
-static inline void flush_tlb_mm(struct mm_struct *mm)
-{
-       if (mm == current->active_mm) queue_tlb_flush();
-       XENO_flush_page_update_queue();
-}
-
-static inline void flush_tlb_page(struct vm_area_struct *vma,
-       unsigned long addr)
-{
-       if (vma->vm_mm == current->active_mm) queue_invlpg(addr);
-       XENO_flush_page_update_queue();
-}
-
-static inline void flush_tlb_range(struct mm_struct *mm,
-       unsigned long start, unsigned long end)
-{
-       if (mm == current->active_mm) queue_tlb_flush();
-       XENO_flush_page_update_queue();
-}
-
-#else
-#error no guestos SMP support yet...
-#include <asm/smp.h>
-
-#define local_flush_tlb() \
-       __flush_tlb()
-
-extern void flush_tlb_all(void);
-extern void flush_tlb_current_task(void);
-extern void flush_tlb_mm(struct mm_struct *);
-extern void flush_tlb_page(struct vm_area_struct *, unsigned long);
-
-#define flush_tlb()    flush_tlb_current_task()
-
-static inline void flush_tlb_range(struct mm_struct * mm, unsigned long start, unsigned long end)
-{
-       flush_tlb_mm(mm);
-}
-
-#define TLBSTATE_OK    1
-#define TLBSTATE_LAZY  2
-
-struct tlb_state
-{
-       struct mm_struct *active_mm;
-       int state;
-};
-extern struct tlb_state cpu_tlbstate[NR_CPUS];
-
-#endif /* CONFIG_SMP */
-
-static inline void flush_tlb_pgtables(struct mm_struct *mm,
-                                     unsigned long start, unsigned long end)
-{
-    /* i386 does not keep any page table caches in TLB */
-    XENO_flush_page_update_queue();
-}
-
-extern int direct_remap_area_pages(struct mm_struct *mm,
-                                   unsigned long address, 
-                                   unsigned long machine_addr,
-                                   unsigned long size, 
-                                   pgprot_t prot);
-
-#endif /* _I386_PGALLOC_H */
diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/pgtable-2level.h b/xenolinux-2.4.21-sparse/include/asm-xeno/pgtable-2level.h
deleted file mode 100644 (file)
index 71ef37a..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-#ifndef _I386_PGTABLE_2LEVEL_H
-#define _I386_PGTABLE_2LEVEL_H
-
-/*
- * traditional i386 two-level paging structure:
- */
-
-#define PGDIR_SHIFT    22
-#define PTRS_PER_PGD   1024
-
-/*
- * the i386 is two-level, so we don't really have any
- * PMD directory physically.
- */
-#define PMD_SHIFT      22
-#define PTRS_PER_PMD   1
-
-#define PTRS_PER_PTE   1024
-
-#define pte_ERROR(e) \
-       printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, (e).pte_low)
-#define pmd_ERROR(e) \
-       printk("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pmd_val(e))
-#define pgd_ERROR(e) \
-       printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e))
-
-/*
- * The "pgd_xxx()" functions here are trivial for a folded two-level
- * setup: the pgd is never bad, and a pmd always exists (as it's folded
- * into the pgd entry)
- */
-static inline int pgd_none(pgd_t pgd)          { return 0; }
-static inline int pgd_bad(pgd_t pgd)           { return 0; }
-static inline int pgd_present(pgd_t pgd)       { return 1; }
-#define pgd_clear(xp)                          do { } while (0)
-
-#define set_pte(pteptr, pteval) queue_l1_entry_update(__pa(pteptr), (pteval).pte_low)
-#define set_pte_atomic(pteptr, pteval) queue_l1_entry_update(__pa(pteptr), (pteval).pte_low)
-#define set_pmd(pmdptr, pmdval) queue_l2_entry_update(__pa(pmdptr), (pmdval).pmd)
-#define set_pgd(pgdptr, pgdval) ((void)0)
-
-#define pgd_page(pgd) \
-((unsigned long) __va(pgd_val(pgd) & PAGE_MASK))
-
-static inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address)
-{
-       return (pmd_t *) dir;
-}
-
-/*
- * A note on implementation of this atomic 'get-and-clear' operation.
- * This is actually very simple because XenoLinux can only run on a single
- * processor. Therefore, we cannot race other processors setting the 'accessed'
- * or 'dirty' bits on a page-table entry.
- * Even if pages are shared between domains, that is not a problem because
- * each domain will have separate page tables, with their own versions of
- * accessed & dirty state.
- */
-static inline pte_t ptep_get_and_clear(pte_t *xp)
-{
-    pte_t pte = *xp;
-    queue_l1_entry_update(__pa(xp), 0);
-    return pte;
-}
-
-#define pte_same(a, b)         ((a).pte_low == (b).pte_low)
-#define pte_page(x)            (mem_map+((unsigned long)((pte_val(x) >> PAGE_SHIFT))))
-#define pte_none(x)            (!(x).pte_low)
-#define __mk_pte(page_nr,pgprot) __pte(((page_nr) << PAGE_SHIFT) | pgprot_val(pgprot))
-
-#endif /* _I386_PGTABLE_2LEVEL_H */
diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/pgtable.h b/xenolinux-2.4.21-sparse/include/asm-xeno/pgtable.h
deleted file mode 100644 (file)
index 0a2482f..0000000
+++ /dev/null
@@ -1,370 +0,0 @@
-#ifndef _I386_PGTABLE_H
-#define _I386_PGTABLE_H
-
-#include <linux/config.h>
-
-/*
- * The Linux memory management assumes a three-level page table setup. On
- * the i386, we use that, but "fold" the mid level into the top-level page
- * table, so that we physically have the same two-level page table as the
- * i386 mmu expects.
- *
- * This file contains the functions and defines necessary to modify and use
- * the i386 page table tree.
- */
-#ifndef __ASSEMBLY__
-#include <asm/processor.h>
-#include <asm/hypervisor.h>
-#include <linux/threads.h>
-#include <asm/fixmap.h>
-
-#ifndef _I386_BITOPS_H
-#include <asm/bitops.h>
-#endif
-
-#define swapper_pg_dir 0
-extern void paging_init(void);
-
-/* Caches aren't brain-dead on the intel. */
-#define flush_cache_all()                      do { } while (0)
-#define flush_cache_mm(mm)                     do { } while (0)
-#define flush_cache_range(mm, start, end)      do { } while (0)
-#define flush_cache_page(vma, vmaddr)          do { } while (0)
-#define flush_page_to_ram(page)                        do { } while (0)
-#define flush_dcache_page(page)                        do { } while (0)
-#define flush_icache_range(start, end)         do { } while (0)
-#define flush_icache_page(vma,pg)              do { } while (0)
-#define flush_icache_user_range(vma,pg,adr,len)        do { } while (0)
-
-extern unsigned long pgkern_mask;
-
-#define __flush_tlb() ({ queue_tlb_flush(); XENO_flush_page_update_queue(); })
-#define __flush_tlb_global() __flush_tlb()
-#define __flush_tlb_all() __flush_tlb_global()
-#define __flush_tlb_one(addr) ({ queue_invlpg(addr); XENO_flush_page_update_queue(); })
-#define __flush_tlb_single(addr) ({ queue_invlpg(addr); XENO_flush_page_update_queue(); })
-
-/*
- * ZERO_PAGE is a global shared page that is always zero: used
- * for zero-mapped memory areas etc..
- */
-extern unsigned long empty_zero_page[1024];
-#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
-
-#endif /* !__ASSEMBLY__ */
-
-/*
- * The Linux x86 paging architecture is 'compile-time dual-mode', it
- * implements both the traditional 2-level x86 page tables and the
- * newer 3-level PAE-mode page tables.
- */
-#ifndef __ASSEMBLY__
-#if CONFIG_X86_PAE
-# include <asm/pgtable-3level.h>
-
-/*
- * Need to initialise the X86 PAE caches
- */
-extern void pgtable_cache_init(void);
-
-#else
-# include <asm/pgtable-2level.h>
-
-/*
- * No page table caches to initialise
- */
-#define pgtable_cache_init()   do { } while (0)
-
-#endif
-#endif
-
-#define PMD_SIZE       (1UL << PMD_SHIFT)
-#define PMD_MASK       (~(PMD_SIZE-1))
-#define PGDIR_SIZE     (1UL << PGDIR_SHIFT)
-#define PGDIR_MASK     (~(PGDIR_SIZE-1))
-
-#define USER_PTRS_PER_PGD      (TASK_SIZE/PGDIR_SIZE)
-#define FIRST_USER_PGD_NR      0
-
-#define USER_PGD_PTRS (PAGE_OFFSET >> PGDIR_SHIFT)
-#define KERNEL_PGD_PTRS (PTRS_PER_PGD-USER_PGD_PTRS)
-
-#define TWOLEVEL_PGDIR_SHIFT   22
-#define BOOT_USER_PGD_PTRS (__PAGE_OFFSET >> TWOLEVEL_PGDIR_SHIFT)
-#define BOOT_KERNEL_PGD_PTRS (1024-BOOT_USER_PGD_PTRS)
-
-
-#ifndef __ASSEMBLY__
-/* 4MB is just a nice "safety zone". Also, we align to a fresh pde. */
-#define VMALLOC_OFFSET (4*1024*1024)
-extern void * high_memory;
-#define VMALLOC_START  (((unsigned long) high_memory + 2*VMALLOC_OFFSET-1) & \
-                                               ~(VMALLOC_OFFSET-1))
-#define VMALLOC_VMADDR(x) ((unsigned long)(x))
-#define VMALLOC_END    (FIXADDR_START - 2*PAGE_SIZE)
-
-#define _PAGE_BIT_PRESENT      0
-#define _PAGE_BIT_RW           1
-#define _PAGE_BIT_USER         2
-#define _PAGE_BIT_PWT          3
-#define _PAGE_BIT_PCD          4
-#define _PAGE_BIT_ACCESSED     5
-#define _PAGE_BIT_DIRTY                6
-#define _PAGE_BIT_PSE          7       /* 4 MB (or 2MB) page, Pentium+, if present.. */
-#define _PAGE_BIT_GLOBAL       8       /* Global TLB entry PPro+ */
-#define _PAGE_BIT_IO            9
-
-#define _PAGE_PRESENT  0x001
-#define _PAGE_RW       0x002
-#define _PAGE_USER     0x004
-#define _PAGE_PWT      0x008
-#define _PAGE_PCD      0x010
-#define _PAGE_ACCESSED 0x020
-#define _PAGE_DIRTY    0x040
-#define _PAGE_PSE      0x080   /* 4 MB (or 2MB) page, Pentium+, if present.. */
-#define _PAGE_GLOBAL   0x100   /* Global TLB entry PPro+ */
-#define _PAGE_IO        0x200
-
-#define _PAGE_PROTNONE 0x080   /* If not present */
-
-#define _PAGE_TABLE    (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY)
-#define _KERNPG_TABLE  (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
-#define _PAGE_CHG_MASK (PTE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY)
-
-#define PAGE_NONE      __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED)
-#define PAGE_SHARED    __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED)
-#define PAGE_COPY      __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
-#define PAGE_READONLY  __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
-
-#define __PAGE_KERNEL \
-       (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)
-#define __PAGE_KERNEL_NOCACHE \
-       (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_PCD | _PAGE_ACCESSED)
-#define __PAGE_KERNEL_RO \
-       (_PAGE_PRESENT | _PAGE_DIRTY | _PAGE_ACCESSED)
-
-#if 0
-#define MAKE_GLOBAL(x) __pgprot((x) | _PAGE_GLOBAL)
-#else
-#define MAKE_GLOBAL(x) __pgprot(x)
-#endif
-
-#define PAGE_KERNEL MAKE_GLOBAL(__PAGE_KERNEL)
-#define PAGE_KERNEL_RO MAKE_GLOBAL(__PAGE_KERNEL_RO)
-#define PAGE_KERNEL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_NOCACHE)
-
-/*
- * The i386 can't do page protection for execute, and considers that
- * the same are read. Also, write permissions imply read permissions.
- * This is the closest we can get..
- */
-#define __P000 PAGE_NONE
-#define __P001 PAGE_READONLY
-#define __P010 PAGE_COPY
-#define __P011 PAGE_COPY
-#define __P100 PAGE_READONLY
-#define __P101 PAGE_READONLY
-#define __P110 PAGE_COPY
-#define __P111 PAGE_COPY
-
-#define __S000 PAGE_NONE
-#define __S001 PAGE_READONLY
-#define __S010 PAGE_SHARED
-#define __S011 PAGE_SHARED
-#define __S100 PAGE_READONLY
-#define __S101 PAGE_READONLY
-#define __S110 PAGE_SHARED
-#define __S111 PAGE_SHARED
-
-#define pte_present(x) ((x).pte_low & (_PAGE_PRESENT | _PAGE_PROTNONE))
-#define pte_clear(xp)  queue_l1_entry_update(__pa(xp), 0)
-
-#define pmd_none(x)    (!(x).pmd)
-#define pmd_present(x) ((x).pmd & _PAGE_PRESENT)
-#define pmd_clear(xp)  do { set_pmd(xp, __pmd(0)); } while (0)
-#define        pmd_bad(x)      (((x).pmd & (~PAGE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE)
-
-
-#define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT))
-
-/*
- * The following only work if pte_present() is true.
- * Undefined behaviour if not..
- */
-static inline int pte_read(pte_t pte)          { return (pte).pte_low & _PAGE_USER; }
-static inline int pte_exec(pte_t pte)          { return (pte).pte_low & _PAGE_USER; }
-static inline int pte_dirty(pte_t pte)         { return (pte).pte_low & _PAGE_DIRTY; }
-static inline int pte_young(pte_t pte)         { return (pte).pte_low & _PAGE_ACCESSED; }
-static inline int pte_write(pte_t pte)         { return (pte).pte_low & _PAGE_RW; }
-static inline int pte_io(pte_t pte)            { return (pte).pte_low & _PAGE_IO; }
-
-static inline pte_t pte_rdprotect(pte_t pte)   { (pte).pte_low &= ~_PAGE_USER; return pte; }
-static inline pte_t pte_exprotect(pte_t pte)   { (pte).pte_low &= ~_PAGE_USER; return pte; }
-static inline pte_t pte_mkclean(pte_t pte)     { (pte).pte_low &= ~_PAGE_DIRTY; return pte; }
-static inline pte_t pte_mkold(pte_t pte)       { (pte).pte_low &= ~_PAGE_ACCESSED; return pte; }
-static inline pte_t pte_wrprotect(pte_t pte)   { (pte).pte_low &= ~_PAGE_RW; return pte; }
-static inline pte_t pte_mkread(pte_t pte)      { (pte).pte_low |= _PAGE_USER; return pte; }
-static inline pte_t pte_mkexec(pte_t pte)      { (pte).pte_low |= _PAGE_USER; return pte; }
-static inline pte_t pte_mkdirty(pte_t pte)     { (pte).pte_low |= _PAGE_DIRTY; return pte; }
-static inline pte_t pte_mkyoung(pte_t pte)     { (pte).pte_low |= _PAGE_ACCESSED; return pte; }
-static inline pte_t pte_mkwrite(pte_t pte)     { (pte).pte_low |= _PAGE_RW; return pte; }
-static inline pte_t pte_mkio(pte_t pte)                { (pte).pte_low |= _PAGE_IO; return pte; }
-
-static inline int ptep_test_and_clear_dirty(pte_t *ptep)
-{
-    unsigned long pteval = *(unsigned long *)ptep;
-    int ret = pteval & _PAGE_DIRTY;
-    if ( ret ) queue_l1_entry_update(__pa(ptep), pteval & ~_PAGE_DIRTY);
-    return ret;
-}
-static inline  int ptep_test_and_clear_young(pte_t *ptep)
-{
-    unsigned long pteval = *(unsigned long *)ptep;
-    int ret = pteval & _PAGE_ACCESSED;
-    if ( ret ) queue_l1_entry_update(__pa(ptep), pteval & ~_PAGE_ACCESSED);
-    return ret;
-}
-static inline void ptep_set_wrprotect(pte_t *ptep)
-{
-    unsigned long pteval = *(unsigned long *)ptep;
-    if ( (pteval & _PAGE_RW) )
-        queue_l1_entry_update(__pa(ptep), pteval & ~_PAGE_RW);
-}
-static inline void ptep_mkdirty(pte_t *ptep)
-{
-    unsigned long pteval = *(unsigned long *)ptep;
-    if ( !(pteval & _PAGE_DIRTY) )
-        queue_l1_entry_update(__pa(ptep), pteval | _PAGE_DIRTY);
-}
-
-/*
- * Conversion functions: convert a page and protection to a page entry,
- * and a page entry and page directory to the page they refer to.
- */
-
-#define mk_pte(page, pgprot)   __mk_pte((page) - mem_map, (pgprot))
-
-/* This takes a physical page address that is used by the remapping functions */
-#define mk_pte_phys(physpage, pgprot)  __mk_pte((physpage) >> PAGE_SHIFT, pgprot)
-
-static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
-{
-       pte.pte_low &= _PAGE_CHG_MASK;
-       pte.pte_low |= pgprot_val(newprot);
-       return pte;
-}
-
-#define page_pte(page) page_pte_prot(page, __pgprot(0))
-
-#define pmd_page(pmd) \
-((unsigned long) __va(pmd_val(pmd) & PAGE_MASK))
-
-/* to find an entry in a page-table-directory. */
-#define pgd_index(address) ((address >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))
-
-#define __pgd_offset(address) pgd_index(address)
-
-#define pgd_offset(mm, address) ((mm)->pgd+pgd_index(address))
-
-/* to find an entry in a kernel page-table-directory */
-#define pgd_offset_k(address) pgd_offset(&init_mm, address)
-
-#define __pmd_offset(address) \
-               (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
-
-/* Find an entry in the third-level page table.. */
-#define __pte_offset(address) \
-               ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
-#define pte_offset(dir, address) ((pte_t *) pmd_page(*(dir)) + \
-                       __pte_offset(address))
-
-/*
- * The i386 doesn't have any external MMU info: the kernel page
- * tables contain all the necessary information.
- */
-#define update_mmu_cache(vma,address,pte) do { } while (0)
-
-/* Encode and de-code a swap entry */
-#define SWP_TYPE(x)                    (((x).val >> 1) & 0x3f)
-#define SWP_OFFSET(x)                  ((x).val >> 8)
-#define SWP_ENTRY(type, offset)                ((swp_entry_t) { ((type) << 1) | ((offset) << 8) })
-#define pte_to_swp_entry(pte)          ((swp_entry_t) { (pte).pte_low })
-#define swp_entry_to_pte(x)            ((pte_t) { (x).val })
-
-struct page;
-int change_page_attr(struct page *, int, pgprot_t prot);
-
-static inline void __make_page_readonly(void *va)
-{
-    pgd_t *pgd = pgd_offset_k((unsigned long)va);
-    pmd_t *pmd = pmd_offset(pgd, (unsigned long)va);
-    pte_t *pte = pte_offset(pmd, (unsigned long)va);
-    queue_l1_entry_update(__pa(pte), (*(unsigned long *)pte)&~_PAGE_RW);
-}
-
-static inline void __make_page_writeable(void *va)
-{
-    pgd_t *pgd = pgd_offset_k((unsigned long)va);
-    pmd_t *pmd = pmd_offset(pgd, (unsigned long)va);
-    pte_t *pte = pte_offset(pmd, (unsigned long)va);
-    queue_l1_entry_update(__pa(pte), (*(unsigned long *)pte)|_PAGE_RW);
-}
-
-static inline void make_page_readonly(void *va)
-{
-    pgd_t *pgd = pgd_offset_k((unsigned long)va);
-    pmd_t *pmd = pmd_offset(pgd, (unsigned long)va);
-    pte_t *pte = pte_offset(pmd, (unsigned long)va);
-    queue_l1_entry_update(__pa(pte), (*(unsigned long *)pte)&~_PAGE_RW);
-    if ( (unsigned long)va >= VMALLOC_START )
-        __make_page_readonly(machine_to_virt(
-            *(unsigned long *)pte&PAGE_MASK));
-}
-
-static inline void make_page_writeable(void *va)
-{
-    pgd_t *pgd = pgd_offset_k((unsigned long)va);
-    pmd_t *pmd = pmd_offset(pgd, (unsigned long)va);
-    pte_t *pte = pte_offset(pmd, (unsigned long)va);
-    queue_l1_entry_update(__pa(pte), (*(unsigned long *)pte)|_PAGE_RW);
-    if ( (unsigned long)va >= VMALLOC_START )
-        __make_page_writeable(machine_to_virt(
-            *(unsigned long *)pte&PAGE_MASK));
-}
-
-static inline void make_pages_readonly(void *va, unsigned int nr)
-{
-    while ( nr-- != 0 )
-    {
-        make_page_readonly(va);
-        va = (void *)((unsigned long)va + PAGE_SIZE);
-    }
-}
-
-static inline void make_pages_writeable(void *va, unsigned int nr)
-{
-    while ( nr-- != 0 )
-    {
-        make_page_writeable(va);
-        va = (void *)((unsigned long)va + PAGE_SIZE);
-    }
-}
-
-static inline unsigned long arbitrary_virt_to_phys(void *va)
-{
-    pgd_t *pgd = pgd_offset_k((unsigned long)va);
-    pmd_t *pmd = pmd_offset(pgd, (unsigned long)va);
-    pte_t *pte = pte_offset(pmd, (unsigned long)va);
-    unsigned long pa = (*(unsigned long *)pte) & PAGE_MASK;
-    return pa | ((unsigned long)va & (PAGE_SIZE-1));
-}
-
-#endif /* !__ASSEMBLY__ */
-
-/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */
-#define PageSkip(page)         (0)
-#define kern_addr_valid(addr)  (1)
-
-#define io_remap_page_range remap_page_range
-
-#endif /* _I386_PGTABLE_H */
diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/proc_cmd.h b/xenolinux-2.4.21-sparse/include/asm-xeno/proc_cmd.h
deleted file mode 100644 (file)
index 6630839..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/******************************************************************************
- * proc_cmd.h
- * 
- * Interface to /proc/cmd and /proc/xeno/privcmd.
- */
-
-#ifndef __PROC_CMD_H__
-#define __PROC_CMD_H__
-
-typedef struct privcmd_hypercall
-{
-    unsigned long op;
-    unsigned long arg[5];
-} privcmd_hypercall_t;
-
-typedef struct privcmd_blkmsg
-{
-    unsigned long op;
-    void         *buf;
-    int           buf_size;
-} privcmd_blkmsg_t;
-
-#define IOCTL_PRIVCMD_HYPERCALL        \
-    _IOC(_IOC_NONE, 'P', 0, sizeof(privcmd_hypercall_t))
-#define IOCTL_PRIVCMD_BLKMSG           \
-    _IOC(_IOC_NONE, 'P', 1, sizeof(privcmd_blkmsg_t))
-#define IOCTL_PRIVCMD_LINDEV_TO_XENDEV \
-    _IOC(_IOC_NONE, 'P', 2, sizeof(unsigned short))
-#define IOCTL_PRIVCMD_XENDEV_TO_LINDEV \
-    _IOC(_IOC_NONE, 'P', 3, sizeof(unsigned short))
-
-#endif /* __PROC_CMD_H__ */
diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/processor.h b/xenolinux-2.4.21-sparse/include/asm-xeno/processor.h
deleted file mode 100644 (file)
index 701f4ce..0000000
+++ /dev/null
@@ -1,492 +0,0 @@
-/*
- * include/asm-i386/processor.h
- *
- * Copyright (C) 1994 Linus Torvalds
- */
-
-#ifndef __ASM_I386_PROCESSOR_H
-#define __ASM_I386_PROCESSOR_H
-
-#include <asm/math_emu.h>
-#include <asm/segment.h>
-#include <asm/page.h>
-#include <asm/types.h>
-#include <asm/sigcontext.h>
-#include <asm/cpufeature.h>
-#include <linux/cache.h>
-#include <linux/config.h>
-#include <linux/threads.h>
-
-/*
- * Default implementation of macro that returns current
- * instruction pointer ("program counter").
- */
-#define current_text_addr() ({ void *pc; __asm__("movl $1f,%0\n1:":"=g" (pc)); pc; })
-
-/*
- *  CPU type and hardware bug flags. Kept separately for each CPU.
- *  Members of this structure are referenced in head.S, so think twice
- *  before touching them. [mj]
- */
-
-struct cpuinfo_x86 {
-       __u8    x86;            /* CPU family */
-       __u8    x86_vendor;     /* CPU vendor */
-       __u8    x86_model;
-       __u8    x86_mask;
-       char    wp_works_ok;    /* It doesn't on 386's */
-       char    hlt_works_ok;   /* Problems on some 486Dx4's and old 386's */
-       char    hard_math;
-       char    rfu;
-               int     cpuid_level;    /* Maximum supported CPUID level, -1=no CPUID */
-       __u32   x86_capability[NCAPINTS];
-       char    x86_vendor_id[16];
-       char    x86_model_id[64];
-       int     x86_cache_size;  /* in KB - valid for CPUS which support this
-                                   call  */
-       int     fdiv_bug;
-       int     f00f_bug;
-       int     coma_bug;
-       unsigned long loops_per_jiffy;
-       unsigned long *pgd_quick;
-       unsigned long *pmd_quick;
-       unsigned long *pte_quick;
-       unsigned long pgtable_cache_sz;
-} __attribute__((__aligned__(SMP_CACHE_BYTES)));
-
-#define X86_VENDOR_INTEL 0
-#define X86_VENDOR_CYRIX 1
-#define X86_VENDOR_AMD 2
-#define X86_VENDOR_UMC 3
-#define X86_VENDOR_NEXGEN 4
-#define X86_VENDOR_CENTAUR 5
-#define X86_VENDOR_RISE 6
-#define X86_VENDOR_TRANSMETA 7
-#define X86_VENDOR_NSC 8
-#define X86_VENDOR_SIS 9
-#define X86_VENDOR_UNKNOWN 0xff
-
-/*
- * capabilities of CPUs
- */
-
-extern struct cpuinfo_x86 boot_cpu_data;
-extern struct tss_struct init_tss[NR_CPUS];
-
-#ifdef CONFIG_SMP
-extern struct cpuinfo_x86 cpu_data[];
-#define current_cpu_data cpu_data[smp_processor_id()]
-#else
-#define cpu_data (&boot_cpu_data)
-#define current_cpu_data boot_cpu_data
-#endif
-
-#define cpu_has_pge    (test_bit(X86_FEATURE_PGE,  boot_cpu_data.x86_capability))
-#define cpu_has_pse    (test_bit(X86_FEATURE_PSE,  boot_cpu_data.x86_capability))
-#define cpu_has_pae    (test_bit(X86_FEATURE_PAE,  boot_cpu_data.x86_capability))
-#define cpu_has_tsc    (test_bit(X86_FEATURE_TSC,  boot_cpu_data.x86_capability))
-#define cpu_has_de     (test_bit(X86_FEATURE_DE,   boot_cpu_data.x86_capability))
-#define cpu_has_vme    (test_bit(X86_FEATURE_VME,  boot_cpu_data.x86_capability))
-#define cpu_has_fxsr   (test_bit(X86_FEATURE_FXSR, boot_cpu_data.x86_capability))
-#define cpu_has_xmm    (test_bit(X86_FEATURE_XMM,  boot_cpu_data.x86_capability))
-#define cpu_has_fpu    (test_bit(X86_FEATURE_FPU,  boot_cpu_data.x86_capability))
-#define cpu_has_apic   (test_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability))
-
-extern char ignore_irq13;
-
-extern void identify_cpu(struct cpuinfo_x86 *);
-extern void print_cpu_info(struct cpuinfo_x86 *);
-
-/*
- * EFLAGS bits
- */
-#define X86_EFLAGS_CF  0x00000001 /* Carry Flag */
-#define X86_EFLAGS_PF  0x00000004 /* Parity Flag */
-#define X86_EFLAGS_AF  0x00000010 /* Auxillary carry Flag */
-#define X86_EFLAGS_ZF  0x00000040 /* Zero Flag */
-#define X86_EFLAGS_SF  0x00000080 /* Sign Flag */
-#define X86_EFLAGS_TF  0x00000100 /* Trap Flag */
-#define X86_EFLAGS_IF  0x00000200 /* Interrupt Flag */
-#define X86_EFLAGS_DF  0x00000400 /* Direction Flag */
-#define X86_EFLAGS_OF  0x00000800 /* Overflow Flag */
-#define X86_EFLAGS_IOPL        0x00003000 /* IOPL mask */
-#define X86_EFLAGS_NT  0x00004000 /* Nested Task */
-#define X86_EFLAGS_RF  0x00010000 /* Resume Flag */
-#define X86_EFLAGS_VM  0x00020000 /* Virtual Mode */
-#define X86_EFLAGS_AC  0x00040000 /* Alignment Check */
-#define X86_EFLAGS_VIF 0x00080000 /* Virtual Interrupt Flag */
-#define X86_EFLAGS_VIP 0x00100000 /* Virtual Interrupt Pending */
-#define X86_EFLAGS_ID  0x00200000 /* CPUID detection flag */
-
-/*
- * Generic CPUID function
- */
-static inline void cpuid(int op, int *eax, int *ebx, int *ecx, int *edx)
-{
-       __asm__("cpuid"
-               : "=a" (*eax),
-                 "=b" (*ebx),
-                 "=c" (*ecx),
-                 "=d" (*edx)
-               : "0" (op));
-}
-
-/*
- * CPUID functions returning a single datum
- */
-static inline unsigned int cpuid_eax(unsigned int op)
-{
-       unsigned int eax;
-
-       __asm__("cpuid"
-               : "=a" (eax)
-               : "0" (op)
-               : "bx", "cx", "dx");
-       return eax;
-}
-static inline unsigned int cpuid_ebx(unsigned int op)
-{
-       unsigned int eax, ebx;
-
-       __asm__("cpuid"
-               : "=a" (eax), "=b" (ebx)
-               : "0" (op)
-               : "cx", "dx" );
-       return ebx;
-}
-static inline unsigned int cpuid_ecx(unsigned int op)
-{
-       unsigned int eax, ecx;
-
-       __asm__("cpuid"
-               : "=a" (eax), "=c" (ecx)
-               : "0" (op)
-               : "bx", "dx" );
-       return ecx;
-}
-static inline unsigned int cpuid_edx(unsigned int op)
-{
-       unsigned int eax, edx;
-
-       __asm__("cpuid"
-               : "=a" (eax), "=d" (edx)
-               : "0" (op)
-               : "bx", "cx");
-       return edx;
-}
-
-/*
- * Intel CPU features in CR4
- */
-#define X86_CR4_VME            0x0001  /* enable vm86 extensions */
-#define X86_CR4_PVI            0x0002  /* virtual interrupts flag enable */
-#define X86_CR4_TSD            0x0004  /* disable time stamp at ipl 3 */
-#define X86_CR4_DE             0x0008  /* enable debugging extensions */
-#define X86_CR4_PSE            0x0010  /* enable page size extensions */
-#define X86_CR4_PAE            0x0020  /* enable physical address extensions */
-#define X86_CR4_MCE            0x0040  /* Machine check enable */
-#define X86_CR4_PGE            0x0080  /* enable global pages */
-#define X86_CR4_PCE            0x0100  /* enable performance counters at ipl 3 */
-#define X86_CR4_OSFXSR         0x0200  /* enable fast FPU save and restore */
-#define X86_CR4_OSXMMEXCPT     0x0400  /* enable unmasked SSE exceptions */
-
-#define load_cr3(pgdir) \
-       asm volatile("movl %0,%%cr3": :"r" (__pa(pgdir)));
-
-extern unsigned long mmu_cr4_features;
-
-#include <asm/hypervisor.h>
-
-static inline void set_in_cr4 (unsigned long mask)
-{
-    HYPERVISOR_console_write("No set_in_cr4", 13);
-}
-
-static inline void clear_in_cr4 (unsigned long mask)
-{
-    HYPERVISOR_console_write("No clear_in_cr4", 15);
-}
-
-/*
- *      Cyrix CPU configuration register indexes
- */
-#define CX86_CCR0 0xc0
-#define CX86_CCR1 0xc1
-#define CX86_CCR2 0xc2
-#define CX86_CCR3 0xc3
-#define CX86_CCR4 0xe8
-#define CX86_CCR5 0xe9
-#define CX86_CCR6 0xea
-#define CX86_CCR7 0xeb
-#define CX86_DIR0 0xfe
-#define CX86_DIR1 0xff
-#define CX86_ARR_BASE 0xc4
-#define CX86_RCR_BASE 0xdc
-
-/*
- *      Cyrix CPU indexed register access macros
- */
-
-#define getCx86(reg) ({ outb((reg), 0x22); inb(0x23); })
-
-#define setCx86(reg, data) do { \
-       outb((reg), 0x22); \
-       outb((data), 0x23); \
-} while (0)
-
-/*
- * Bus types (default is ISA, but people can check others with these..)
- */
-#ifdef CONFIG_EISA
-extern int EISA_bus;
-#else
-#define EISA_bus (0)
-#endif
-extern int MCA_bus;
-
-/* from system description table in BIOS.  Mostly for MCA use, but
-others may find it useful. */
-extern unsigned int machine_id;
-extern unsigned int machine_submodel_id;
-extern unsigned int BIOS_revision;
-extern unsigned int mca_pentium_flag;
-
-/*
- * User space process size: 3GB (default).
- */
-#define TASK_SIZE      (PAGE_OFFSET)
-
-/* This decides where the kernel will search for a free chunk of vm
- * space during mmap's.
- */
-#define TASK_UNMAPPED_BASE     (TASK_SIZE / 3)
-
-/*
- * Size of io_bitmap in longwords: 32 is ports 0-0x3ff.
- */
-#define IO_BITMAP_SIZE 32
-#define IO_BITMAP_BYTES (IO_BITMAP_SIZE * 4)
-#define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap)
-#define INVALID_IO_BITMAP_OFFSET 0x8000
-
-struct i387_fsave_struct {
-       long    cwd;
-       long    swd;
-       long    twd;
-       long    fip;
-       long    fcs;
-       long    foo;
-       long    fos;
-       long    st_space[20];   /* 8*10 bytes for each FP-reg = 80 bytes */
-       long    status;         /* software status information */
-};
-
-struct i387_fxsave_struct {
-       unsigned short  cwd;
-       unsigned short  swd;
-       unsigned short  twd;
-       unsigned short  fop;
-       long    fip;
-       long    fcs;
-       long    foo;
-       long    fos;
-       long    mxcsr;
-       long    reserved;
-       long    st_space[32];   /* 8*16 bytes for each FP-reg = 128 bytes */
-       long    xmm_space[32];  /* 8*16 bytes for each XMM-reg = 128 bytes */
-       long    padding[56];
-} __attribute__ ((aligned (16)));
-
-struct i387_soft_struct {
-       long    cwd;
-       long    swd;
-       long    twd;
-       long    fip;
-       long    fcs;
-       long    foo;
-       long    fos;
-       long    st_space[20];   /* 8*10 bytes for each FP-reg = 80 bytes */
-       unsigned char   ftop, changed, lookahead, no_update, rm, alimit;
-       struct info     *info;
-       unsigned long   entry_eip;
-};
-
-union i387_union {
-       struct i387_fsave_struct        fsave;
-       struct i387_fxsave_struct       fxsave;
-       struct i387_soft_struct soft;
-};
-
-typedef struct {
-       unsigned long seg;
-} mm_segment_t;
-
-struct tss_struct {
-       unsigned short  back_link,__blh;
-       unsigned long   esp0;
-       unsigned short  ss0,__ss0h;
-       unsigned long   esp1;
-       unsigned short  ss1,__ss1h;
-       unsigned long   esp2;
-       unsigned short  ss2,__ss2h;
-       unsigned long   __cr3;
-       unsigned long   eip;
-       unsigned long   eflags;
-       unsigned long   eax,ecx,edx,ebx;
-       unsigned long   esp;
-       unsigned long   ebp;
-       unsigned long   esi;
-       unsigned long   edi;
-       unsigned short  es, __esh;
-       unsigned short  cs, __csh;
-       unsigned short  ss, __ssh;
-       unsigned short  ds, __dsh;
-       unsigned short  fs, __fsh;
-       unsigned short  gs, __gsh;
-       unsigned short  ldt, __ldth;
-       unsigned short  trace, bitmap;
-       unsigned long   io_bitmap[IO_BITMAP_SIZE+1];
-       /*
-        * pads the TSS to be cacheline-aligned (size is 0x100)
-        */
-       unsigned long __cacheline_filler[5];
-};
-
-struct thread_struct {
-       unsigned long   esp0;
-       unsigned long   eip;
-       unsigned long   esp;
-       unsigned long   fs;
-       unsigned long   gs;
-       unsigned int    io_pl;
-/* Hardware debugging registers */
-       unsigned long   debugreg[8];  /* %%db0-7 debug registers */
-/* fault info */
-       unsigned long   cr2, trap_no, error_code;
-/* floating point info */
-       union i387_union        i387;
-/* virtual 86 mode info */
-       struct vm86_struct      * vm86_info;
-       unsigned long           screen_bitmap;
-       unsigned long           v86flags, v86mask, saved_esp0;
-};
-
-#define INIT_THREAD  { sizeof(init_stack) + (long) &init_stack, \
-                       0, 0, 0, 0, 0, 0, {0}, 0, 0, 0, {{0}}, 0, 0, 0, 0, 0 }
-
-#define INIT_TSS  {                                            \
-       0,0, /* back_link, __blh */                             \
-       sizeof(init_stack) + (long) &init_stack, /* esp0 */     \
-       __KERNEL_DS, 0, /* ss0 */                               \
-       0,0,0,0,0,0, /* stack1, stack2 */                       \
-       0, /* cr3 */                                            \
-       0,0, /* eip,eflags */                                   \
-       0,0,0,0, /* eax,ecx,edx,ebx */                          \
-       0,0,0,0, /* esp,ebp,esi,edi */                          \
-       0,0,0,0,0,0, /* es,cs,ss */                             \
-       0,0,0,0,0,0, /* ds,fs,gs */                             \
-       0,0, /* ldt */                                          \
-       0, INVALID_IO_BITMAP_OFFSET, /* tace, bitmap */         \
-       {~0, } /* ioperm */                                     \
-}
-
-#define start_thread(regs, new_eip, new_esp) do {              \
-       __asm__("movl %0,%%fs ; movl %0,%%gs": :"r" (0));       \
-       set_fs(USER_DS);                                        \
-       regs->xds = __USER_DS;                                  \
-       regs->xes = __USER_DS;                                  \
-       regs->xss = __USER_DS;                                  \
-       regs->xcs = __USER_CS;                                  \
-       regs->eip = new_eip;                                    \
-       regs->esp = new_esp;                                    \
-} while (0)
-
-/* Forward declaration, a strange C thing */
-struct task_struct;
-struct mm_struct;
-
-/* Free all resources held by a thread. */
-extern void release_thread(struct task_struct *);
-/*
- * create a kernel thread without removing it from tasklists
- */
-extern int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
-
-/* Copy and release all segment info associated with a VM */
-extern void copy_segments(struct task_struct *p, struct mm_struct * mm);
-extern void release_segments(struct mm_struct * mm);
-
-/*
- * Return saved PC of a blocked thread.
- */
-static inline unsigned long thread_saved_pc(struct thread_struct *t)
-{
-       return ((unsigned long *)t->esp)[3];
-}
-
-unsigned long get_wchan(struct task_struct *p);
-#define KSTK_EIP(tsk)  (((unsigned long *)(4096+(unsigned long)(tsk)))[1019])
-#define KSTK_ESP(tsk)  (((unsigned long *)(4096+(unsigned long)(tsk)))[1022])
-
-#define THREAD_SIZE (2*PAGE_SIZE)
-#define alloc_task_struct() ((struct task_struct *) __get_free_pages(GFP_KERNEL,1))
-#define free_task_struct(p) free_pages((unsigned long) (p), 1)
-#define get_task_struct(tsk)      atomic_inc(&virt_to_page(tsk)->count)
-
-#define init_task      (init_task_union.task)
-#define init_stack     (init_task_union.stack)
-
-struct microcode {
-       unsigned int hdrver;
-       unsigned int rev;
-       unsigned int date;
-       unsigned int sig;
-       unsigned int cksum;
-       unsigned int ldrver;
-       unsigned int pf;
-       unsigned int reserved[5];
-       unsigned int bits[500];
-};
-
-/* '6' because it used to be for P6 only (but now covers Pentium 4 as well) */
-#define MICROCODE_IOCFREE      _IO('6',0)
-
-/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
-static inline void rep_nop(void)
-{
-       __asm__ __volatile__("rep;nop");
-}
-
-#define cpu_relax()    rep_nop()
-
-/* Prefetch instructions for Pentium III and AMD Athlon */
-#if defined(CONFIG_MPENTIUMIII) || defined (CONFIG_MPENTIUM4)
-
-#define ARCH_HAS_PREFETCH
-extern inline void prefetch(const void *x)
-{
-       __asm__ __volatile__ ("prefetchnta (%0)" : : "r"(x));
-}
-
-#elif CONFIG_X86_USE_3DNOW
-
-#define ARCH_HAS_PREFETCH
-#define ARCH_HAS_PREFETCHW
-#define ARCH_HAS_SPINLOCK_PREFETCH
-
-extern inline void prefetch(const void *x)
-{
-        __asm__ __volatile__ ("prefetch (%0)" : : "r"(x));
-}
-
-extern inline void prefetchw(const void *x)
-{
-        __asm__ __volatile__ ("prefetchw (%0)" : : "r"(x));
-}
-#define spin_lock_prefetch(x)  prefetchw(x)
-
-#endif
-
-#define TF_MASK 0x100
-
-#endif /* __ASM_I386_PROCESSOR_H */
diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/ptrace.h b/xenolinux-2.4.21-sparse/include/asm-xeno/ptrace.h
deleted file mode 100644 (file)
index 4457ac0..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-#ifndef _I386_PTRACE_H
-#define _I386_PTRACE_H
-
-#define EBX 0
-#define ECX 1
-#define EDX 2
-#define ESI 3
-#define EDI 4
-#define EBP 5
-#define EAX 6
-#define DS 7
-#define ES 8
-#define FS 9
-#define GS 10
-#define ORIG_EAX 11
-#define EIP 12
-#define CS  13
-#define EFL 14
-#define UESP 15
-#define SS   16
-#define FRAME_SIZE 17
-
-/* this struct defines the way the registers are stored on the 
-   stack during a system call. */
-
-struct pt_regs {
-       long ebx;
-       long ecx;
-       long edx;
-       long esi;
-       long edi;
-       long ebp;
-       long eax;
-       int  xds;
-       int  xes;
-       long orig_eax;
-       long eip;
-       int  xcs;
-       long eflags;
-       long esp;
-       int  xss;
-};
-
-/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */
-#define PTRACE_GETREGS            12
-#define PTRACE_SETREGS            13
-#define PTRACE_GETFPREGS          14
-#define PTRACE_SETFPREGS          15
-#define PTRACE_GETFPXREGS         18
-#define PTRACE_SETFPXREGS         19
-
-#define PTRACE_SETOPTIONS         21
-
-/* options set using PTRACE_SETOPTIONS */
-#define PTRACE_O_TRACESYSGOOD     0x00000001
-
-#ifdef __KERNEL__
-#define user_mode(regs) ((regs) && (2 & (regs)->xcs))
-#define instruction_pointer(regs) ((regs) ? (regs)->eip : NULL)
-extern void show_regs(struct pt_regs *);
-#endif
-
-#endif
diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/segment.h b/xenolinux-2.4.21-sparse/include/asm-xeno/segment.h
deleted file mode 100644 (file)
index ca13028..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef _ASM_SEGMENT_H
-#define _ASM_SEGMENT_H
-
-#ifndef __ASSEMBLY__
-#include <linux/types.h>
-#endif
-#include <asm/hypervisor-ifs/hypervisor-if.h>
-
-#define __KERNEL_CS    FLAT_RING1_CS
-#define __KERNEL_DS    FLAT_RING1_DS
-
-#define __USER_CS      FLAT_RING3_CS
-#define __USER_DS      FLAT_RING3_DS
-
-#endif
diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/smp.h b/xenolinux-2.4.21-sparse/include/asm-xeno/smp.h
deleted file mode 100644 (file)
index 804b93c..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-#ifndef __ASM_SMP_H
-#define __ASM_SMP_H
-
-/*
- * We need the APIC definitions automatically as part of 'smp.h'
- */
-#ifndef __ASSEMBLY__
-#include <linux/config.h>
-#include <linux/threads.h>
-#include <linux/ptrace.h>
-#endif
-
-#ifdef CONFIG_X86_LOCAL_APIC
-#ifndef __ASSEMBLY__
-#include <asm/bitops.h>
-#include <asm/mpspec.h>
-#ifdef CONFIG_X86_IO_APIC
-#include <asm/io_apic.h>
-#endif
-#include <asm/apic.h>
-#endif
-#endif
-
-#ifdef CONFIG_SMP
-#ifndef __ASSEMBLY__
-
-/*
- * Private routines/data
- */
-extern void smp_alloc_memory(void);
-extern unsigned long phys_cpu_present_map;
-extern unsigned long cpu_online_map;
-extern volatile unsigned long smp_invalidate_needed;
-extern int pic_mode;
-extern int smp_num_siblings;
-extern int cpu_sibling_map[];
-
-extern void smp_flush_tlb(void);
-extern void smp_message_irq(int cpl, void *dev_id, struct pt_regs *regs);
-extern void smp_send_reschedule(int cpu);
-extern void smp_invalidate_rcv(void);          /* Process an NMI */
-extern void (*mtrr_hook) (void);
-extern void zap_low_mappings (void);
-
-/*
- * On x86 all CPUs are mapped 1:1 to the APIC space.
- * This simplifies scheduling and IPI sending and
- * compresses data structures.
- */
-static inline int cpu_logical_map(int cpu)
-{
-       return cpu;
-}
-static inline int cpu_number_map(int cpu)
-{
-       return cpu;
-}
-
-/*
- * Some lowlevel functions might want to know about
- * the real APIC ID <-> CPU # mapping.
- */
-#define MAX_APICID 256
-extern volatile int cpu_to_physical_apicid[NR_CPUS];
-extern volatile int physical_apicid_to_cpu[MAX_APICID];
-extern volatile int cpu_to_logical_apicid[NR_CPUS];
-extern volatile int logical_apicid_to_cpu[MAX_APICID];
-
-/*
- * General functions that each host system must provide.
- */
-extern void smp_boot_cpus(void);
-extern void smp_store_cpu_info(int id);                /* Store per CPU info (like the initial udelay numbers */
-
-/*
- * This function is needed by all SMP systems. It must _always_ be valid
- * from the initial startup. We map APIC_BASE very early in page_setup(),
- * so this is correct in the x86 case.
- */
-
-#define smp_processor_id() (current->processor)
-
-#endif /* !__ASSEMBLY__ */
-
-#define NO_PROC_ID             0xFF            /* No processor magic marker */
-
-/*
- *     This magic constant controls our willingness to transfer
- *     a process across CPUs. Such a transfer incurs misses on the L1
- *     cache, and on a P6 or P5 with multiple L2 caches L2 hits. My
- *     gut feeling is this will vary by board in value. For a board
- *     with separate L2 cache it probably depends also on the RSS, and
- *     for a board with shared L2 cache it ought to decay fast as other
- *     processes are run.
- */
-#define PROC_CHANGE_PENALTY    15              /* Schedule penalty */
-
-#endif
-#endif
diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/system.h b/xenolinux-2.4.21-sparse/include/asm-xeno/system.h
deleted file mode 100644 (file)
index a56ab32..0000000
+++ /dev/null
@@ -1,405 +0,0 @@
-#ifndef __ASM_SYSTEM_H
-#define __ASM_SYSTEM_H
-
-#include <linux/config.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <asm/segment.h>
-#include <asm/hypervisor.h>
-#include <linux/bitops.h> /* for LOCK_PREFIX */
-
-#ifdef __KERNEL__
-
-struct task_struct;
-extern void FASTCALL(__switch_to(struct task_struct *prev, 
-                                 struct task_struct *next));
-
-#define prepare_to_switch()                                             \
-do {                                                                    \
-    struct thread_struct *__t = &current->thread;                       \
-    __asm__ __volatile__ ( "movl %%fs,%0" : "=m" (*(int *)&__t->fs) );  \
-    __asm__ __volatile__ ( "movl %%gs,%0" : "=m" (*(int *)&__t->gs) );  \
-} while (0)
-#define switch_to(prev,next,last) do {                                 \
-       asm volatile("pushl %%esi\n\t"                                  \
-                    "pushl %%edi\n\t"                                  \
-                    "pushl %%ebp\n\t"                                  \
-                    "movl %%esp,%0\n\t"        /* save ESP */          \
-                    "movl %3,%%esp\n\t"        /* restore ESP */       \
-                    "movl $1f,%1\n\t"          /* save EIP */          \
-                    "pushl %4\n\t"             /* restore EIP */       \
-                    "jmp __switch_to\n"                                \
-                    "1:\t"                                             \
-                    "popl %%ebp\n\t"                                   \
-                    "popl %%edi\n\t"                                   \
-                    "popl %%esi\n\t"                                   \
-                    :"=m" (prev->thread.esp),"=m" (prev->thread.eip),  \
-                     "=b" (last)                                       \
-                    :"m" (next->thread.esp),"m" (next->thread.eip),    \
-                     "a" (prev), "d" (next),                           \
-                     "b" (prev));                                      \
-} while (0)
-
-#define _set_base(addr,base) do { unsigned long __pr; \
-__asm__ __volatile__ ("movw %%dx,%1\n\t" \
-       "rorl $16,%%edx\n\t" \
-       "movb %%dl,%2\n\t" \
-       "movb %%dh,%3" \
-       :"=&d" (__pr) \
-       :"m" (*((addr)+2)), \
-        "m" (*((addr)+4)), \
-        "m" (*((addr)+7)), \
-         "0" (base) \
-        ); } while(0)
-
-#define _set_limit(addr,limit) do { unsigned long __lr; \
-__asm__ __volatile__ ("movw %%dx,%1\n\t" \
-       "rorl $16,%%edx\n\t" \
-       "movb %2,%%dh\n\t" \
-       "andb $0xf0,%%dh\n\t" \
-       "orb %%dh,%%dl\n\t" \
-       "movb %%dl,%2" \
-       :"=&d" (__lr) \
-       :"m" (*(addr)), \
-        "m" (*((addr)+6)), \
-        "0" (limit) \
-        ); } while(0)
-
-#define set_base(ldt,base) _set_base( ((char *)&(ldt)) , (base) )
-#define set_limit(ldt,limit) _set_limit( ((char *)&(ldt)) , ((limit)-1)>>12 )
-
-static inline unsigned long _get_base(char * addr)
-{
-       unsigned long __base;
-       __asm__("movb %3,%%dh\n\t"
-               "movb %2,%%dl\n\t"
-               "shll $16,%%edx\n\t"
-               "movw %1,%%dx"
-               :"=&d" (__base)
-               :"m" (*((addr)+2)),
-                "m" (*((addr)+4)),
-                "m" (*((addr)+7)));
-       return __base;
-}
-
-#define get_base(ldt) _get_base( ((char *)&(ldt)) )
-
-/*
- * Load a segment. Fall back on loading the zero
- * segment if something goes wrong..
- */
-#define loadsegment(seg,value)                 \
-       asm volatile("\n"                       \
-               "1:\t"                          \
-               "movl %0,%%" #seg "\n"          \
-               "2:\n"                          \
-               ".section .fixup,\"ax\"\n"      \
-               "3:\t"                          \
-               "pushl $0\n\t"                  \
-               "popl %%" #seg "\n\t"           \
-               "jmp 2b\n"                      \
-               ".previous\n"                   \
-               ".section __ex_table,\"a\"\n\t" \
-               ".align 4\n\t"                  \
-               ".long 1b,3b\n"                 \
-               ".previous"                     \
-               : :"m" (*(unsigned int *)&(value)))
-
-#define clts() ((void)0)
-#define read_cr0() ({ \
-       unsigned int __dummy; \
-       __asm__( \
-               "movl %%cr0,%0\n\t" \
-               :"=r" (__dummy)); \
-       __dummy; \
-})
-#define write_cr0(x) \
-       __asm__("movl %0,%%cr0": :"r" (x));
-
-#define read_cr4() ({ \
-       unsigned int __dummy; \
-       __asm__( \
-               "movl %%cr4,%0\n\t" \
-               :"=r" (__dummy)); \
-       __dummy; \
-})
-#define write_cr4(x) \
-       __asm__("movl %0,%%cr4": :"r" (x));
-#define stts() (HYPERVISOR_fpu_taskswitch())
-
-#endif /* __KERNEL__ */
-
-#define wbinvd() \
-       __asm__ __volatile__ ("wbinvd": : :"memory");
-
-static inline unsigned long get_limit(unsigned long segment)
-{
-       unsigned long __limit;
-       __asm__("lsll %1,%0"
-               :"=r" (__limit):"r" (segment));
-       return __limit+1;
-}
-
-#define nop() __asm__ __volatile__ ("nop")
-
-#define xchg(ptr,v) ((__typeof__(*(ptr)))__xchg((unsigned long)(v),(ptr),sizeof(*(ptr))))
-
-#define tas(ptr) (xchg((ptr),1))
-
-struct __xchg_dummy { unsigned long a[100]; };
-#define __xg(x) ((struct __xchg_dummy *)(x))
-
-
-/*
- * The semantics of XCHGCMP8B are a bit strange, this is why
- * there is a loop and the loading of %%eax and %%edx has to
- * be inside. This inlines well in most cases, the cached
- * cost is around ~38 cycles. (in the future we might want
- * to do an SIMD/3DNOW!/MMX/FPU 64-bit store here, but that
- * might have an implicit FPU-save as a cost, so it's not
- * clear which path to go.)
- *
- * chmxchg8b must be used with the lock prefix here to allow
- * the instruction to be executed atomically, see page 3-102
- * of the instruction set reference 24319102.pdf. We need
- * the reader side to see the coherent 64bit value.
- */
-static inline void __set_64bit (unsigned long long * ptr,
-               unsigned int low, unsigned int high)
-{
-       __asm__ __volatile__ (
-               "\n1:\t"
-               "movl (%0), %%eax\n\t"
-               "movl 4(%0), %%edx\n\t"
-               "lock cmpxchg8b (%0)\n\t"
-               "jnz 1b"
-               : /* no outputs */
-               :       "D"(ptr),
-                       "b"(low),
-                       "c"(high)
-               :       "ax","dx","memory");
-}
-
-static inline void __set_64bit_constant (unsigned long long *ptr,
-                                                unsigned long long value)
-{
-       __set_64bit(ptr,(unsigned int)(value), (unsigned int)((value)>>32ULL));
-}
-#define ll_low(x)      *(((unsigned int*)&(x))+0)
-#define ll_high(x)     *(((unsigned int*)&(x))+1)
-
-static inline void __set_64bit_var (unsigned long long *ptr,
-                        unsigned long long value)
-{
-       __set_64bit(ptr,ll_low(value), ll_high(value));
-}
-
-#define set_64bit(ptr,value) \
-(__builtin_constant_p(value) ? \
- __set_64bit_constant(ptr, value) : \
- __set_64bit_var(ptr, value) )
-
-#define _set_64bit(ptr,value) \
-(__builtin_constant_p(value) ? \
- __set_64bit(ptr, (unsigned int)(value), (unsigned int)((value)>>32ULL) ) : \
- __set_64bit(ptr, ll_low(value), ll_high(value)) )
-
-/*
- * Note: no "lock" prefix even on SMP: xchg always implies lock anyway
- * Note 2: xchg has side effect, so that attribute volatile is necessary,
- *       but generally the primitive is invalid, *ptr is output argument. --ANK
- */
-static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
-{
-       switch (size) {
-               case 1:
-                       __asm__ __volatile__("xchgb %b0,%1"
-                               :"=q" (x)
-                               :"m" (*__xg(ptr)), "0" (x)
-                               :"memory");
-                       break;
-               case 2:
-                       __asm__ __volatile__("xchgw %w0,%1"
-                               :"=r" (x)
-                               :"m" (*__xg(ptr)), "0" (x)
-                               :"memory");
-                       break;
-               case 4:
-                       __asm__ __volatile__("xchgl %0,%1"
-                               :"=r" (x)
-                               :"m" (*__xg(ptr)), "0" (x)
-                               :"memory");
-                       break;
-       }
-       return x;
-}
-
-/*
- * Atomic compare and exchange.  Compare OLD with MEM, if identical,
- * store NEW in MEM.  Return the initial value in MEM.  Success is
- * indicated by comparing RETURN with OLD.
- */
-
-#ifdef CONFIG_X86_CMPXCHG
-#define __HAVE_ARCH_CMPXCHG 1
-
-static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
-                                     unsigned long new, int size)
-{
-       unsigned long prev;
-       switch (size) {
-       case 1:
-               __asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2"
-                                    : "=a"(prev)
-                                    : "q"(new), "m"(*__xg(ptr)), "0"(old)
-                                    : "memory");
-               return prev;
-       case 2:
-               __asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2"
-                                    : "=a"(prev)
-                                    : "q"(new), "m"(*__xg(ptr)), "0"(old)
-                                    : "memory");
-               return prev;
-       case 4:
-               __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2"
-                                    : "=a"(prev)
-                                    : "q"(new), "m"(*__xg(ptr)), "0"(old)
-                                    : "memory");
-               return prev;
-       }
-       return old;
-}
-
-#define cmpxchg(ptr,o,n)\
-       ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\
-                                       (unsigned long)(n),sizeof(*(ptr))))
-    
-#else
-/* Compiling for a 386 proper. Is it worth implementing via cli/sti?  */
-#endif
-
-/*
- * Force strict CPU ordering.
- * And yes, this is required on UP too when we're talking
- * to devices.
- *
- * For now, "wmb()" doesn't actually do anything, as all
- * Intel CPU's follow what Intel calls a *Processor Order*,
- * in which all writes are seen in the program order even
- * outside the CPU.
- *
- * I expect future Intel CPU's to have a weaker ordering,
- * but I'd also expect them to finally get their act together
- * and add some real memory barriers if so.
- *
- * Some non intel clones support out of order store. wmb() ceases to be a
- * nop for these.
- */
-#define mb()   __asm__ __volatile__ ("lock; addl $0,0(%%esp)": : :"memory")
-#define rmb()  mb()
-
-#ifdef CONFIG_X86_OOSTORE
-#define wmb()  __asm__ __volatile__ ("lock; addl $0,0(%%esp)": : :"memory")
-#else
-#define wmb()  __asm__ __volatile__ ("": : :"memory")
-#endif
-
-#ifdef CONFIG_SMP
-#define smp_mb()       mb()
-#define smp_rmb()      rmb()
-#define smp_wmb()      wmb()
-#define set_mb(var, value) do { xchg(&var, value); } while (0)
-#else
-#define smp_mb()       barrier()
-#define smp_rmb()      barrier()
-#define smp_wmb()      barrier()
-#define set_mb(var, value) do { var = value; barrier(); } while (0)
-#endif
-
-#define set_wmb(var, value) do { var = value; wmb(); } while (0)
-
-
-#define __save_flags(x)                                                       \
-do {                                                                          \
-    (x) = test_bit(EVENTS_MASTER_ENABLE_BIT,                                  \
-                   &HYPERVISOR_shared_info->events_mask);                     \
-    barrier();                                                                \
-} while (0)
-
-#define __restore_flags(x)                                                    \
-do {                                                                          \
-    shared_info_t *_shared = HYPERVISOR_shared_info;                          \
-    if (x) set_bit(EVENTS_MASTER_ENABLE_BIT, &_shared->events_mask);          \
-    barrier();                                                                \
-    if ( unlikely(_shared->events) && (x) ) do_hypervisor_callback(NULL);     \
-} while (0)
-
-#define __cli()                                                               \
-do {                                                                          \
-    clear_bit(EVENTS_MASTER_ENABLE_BIT, &HYPERVISOR_shared_info->events_mask);\
-    barrier();                                                                \
-} while (0)
-
-#define __sti()                                                               \
-do {                                                                          \
-    shared_info_t *_shared = HYPERVISOR_shared_info;                          \
-    set_bit(EVENTS_MASTER_ENABLE_BIT, &_shared->events_mask);                 \
-    barrier();                                                                \
-    if ( unlikely(_shared->events) ) do_hypervisor_callback(NULL);            \
-} while (0)
-
-#define safe_halt()             ((void)0)
-
-#define __save_and_cli(x)      do { __save_flags(x); __cli(); } while(0);
-#define __save_and_sti(x)      do { __save_flags(x); __sti(); } while(0);
-
-#define local_irq_save(x)                                                     \
-do {                                                                          \
-    (x) = test_and_clear_bit(EVENTS_MASTER_ENABLE_BIT,                        \
-                             &HYPERVISOR_shared_info->events_mask);           \
-    barrier();                                                                \
-} while (0)
-#define local_irq_restore(x)    __restore_flags(x)
-#define local_irq_disable()     __cli()
-#define local_irq_enable()      __sti()
-
-
-#ifdef CONFIG_SMP
-#error no SMP
-extern void __global_cli(void);
-extern void __global_sti(void);
-extern unsigned long __global_save_flags(void);
-extern void __global_restore_flags(unsigned long);
-#define cli() __global_cli()
-#define sti() __global_sti()
-#define save_flags(x) ((x)=__global_save_flags())
-#define restore_flags(x) __global_restore_flags(x)
-#define save_and_cli(x) do { save_flags(x); cli(); } while(0);
-#define save_and_sti(x) do { save_flags(x); sti(); } while(0);
-
-#else
-
-#define cli() __cli()
-#define sti() __sti()
-#define save_flags(x) __save_flags(x)
-#define restore_flags(x) __restore_flags(x)
-#define save_and_cli(x) __save_and_cli(x)
-#define save_and_sti(x) __save_and_sti(x)
-
-#endif
-
-/*
- * disable hlt during certain critical i/o operations
- */
-#define HAVE_DISABLE_HLT
-void disable_hlt(void);
-void enable_hlt(void);
-
-extern unsigned long dmi_broken;
-extern int is_sony_vaio_laptop;
-
-#define BROKEN_ACPI_Sx         0x0001
-#define BROKEN_INIT_AFTER_S1   0x0002
-
-#endif
diff --git a/xenolinux-2.4.21-sparse/include/asm-xeno/vga.h b/xenolinux-2.4.21-sparse/include/asm-xeno/vga.h
deleted file mode 100644 (file)
index d0624cf..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *     Access to VGA videoram
- *
- *     (c) 1998 Martin Mares <mj@ucw.cz>
- */
-
-#ifndef _LINUX_ASM_VGA_H_
-#define _LINUX_ASM_VGA_H_
-
-#include <asm/io.h>
-
-extern unsigned char *vgacon_mmap;
-
-static unsigned long VGA_MAP_MEM(unsigned long x)
-{
-    if( vgacon_mmap == NULL )
-    {
-        /* This is our first time in this function. This whole thing
-           is a rather grim hack. We know we're going to get asked 
-           to map a 32KB region between 0xb0000 and 0xb8000 because
-           that's what VGAs are. We used the boot time permanent 
-           fixed map region, and map it to machine pages.
-        */
-        if( x != 0xb8000 )
-            panic("Argghh! VGA Console is weird. 1:%08lx\n",x);
-
-        vgacon_mmap = (unsigned char*) bt_ioremap( 0xa0000, 128*1024 );
-        return (unsigned long) (vgacon_mmap+x-0xa0000);
-    }
-    else
-    {
-        if( x != 0xc0000 && x != 0xa0000 ) /* vidmem_end or charmap fonts */
-            panic("Argghh! VGA Console is weird. 2:%08lx\n",x);  
-       return (unsigned long) (vgacon_mmap+x-0xa0000);
-    }
-    return 0;
-}
-
-static inline unsigned char vga_readb(unsigned char * x) { return (*(x)); }
-static inline void vga_writeb(unsigned char x, unsigned char *y) { *(y) = (x); }
-
-#endif
diff --git a/xenolinux-2.4.21-sparse/include/linux/blk.h b/xenolinux-2.4.21-sparse/include/linux/blk.h
deleted file mode 100644 (file)
index 6f5a738..0000000
+++ /dev/null
@@ -1,411 +0,0 @@
-#ifndef _BLK_H
-#define _BLK_H
-
-#include <linux/blkdev.h>
-#include <linux/locks.h>
-#include <linux/config.h>
-#include <linux/spinlock.h>
-
-/*
- * Spinlock for protecting the request queue which
- * is mucked around with in interrupts on potentially
- * multiple CPU's..
- */
-extern spinlock_t io_request_lock;
-
-/*
- * Initialization functions.
- */
-extern int isp16_init(void);
-extern int cdu31a_init(void);
-extern int acsi_init(void);
-extern int mcd_init(void);
-extern int mcdx_init(void);
-extern int sbpcd_init(void);
-extern int aztcd_init(void);
-extern int sony535_init(void);
-extern int gscd_init(void);
-extern int cm206_init(void);
-extern int optcd_init(void);
-extern int sjcd_init(void);
-extern int cdi_init(void);
-extern int hd_init(void);
-extern int ide_init(void);
-extern int xd_init(void);
-extern int mfm_init(void);
-extern int loop_init(void);
-extern int md_init(void);
-extern int ap_init(void);
-extern int ddv_init(void);
-extern int z2_init(void);
-extern int swim3_init(void);
-extern int swimiop_init(void);
-extern int amiga_floppy_init(void);
-extern int atari_floppy_init(void);
-extern int ez_init(void);
-extern int bpcd_init(void);
-extern int ps2esdi_init(void);
-extern int jsfd_init(void);
-extern int viodasd_init(void);
-extern int viocd_init(void);
-
-#if defined(CONFIG_ARCH_S390)
-extern int dasd_init(void);
-extern int xpram_init(void);
-extern int tapeblock_init(void);
-#endif /* CONFIG_ARCH_S390 */
-
-#if defined(CONFIG_XENOLINUX_BLOCK)
-extern int xlblk_init(void);
-extern int xlseg_init(void);
-extern int xlseg_proc_init(void);
-#endif /* CONFIG_ARCH_XENO */
-
-extern void set_device_ro(kdev_t dev,int flag);
-void add_blkdev_randomness(int major);
-
-extern int floppy_init(void);
-extern int rd_doload;          /* 1 = load ramdisk, 0 = don't load */
-extern int rd_prompt;          /* 1 = prompt for ramdisk, 0 = don't prompt */
-extern int rd_image_start;     /* starting block # of image */
-
-#ifdef CONFIG_BLK_DEV_INITRD
-
-#define INITRD_MINOR 250 /* shouldn't collide with /dev/ram* too soon ... */
-
-extern unsigned long initrd_start,initrd_end;
-extern int initrd_below_start_ok; /* 1 if it is not an error if initrd_start < memory_start */
-void initrd_init(void);
-
-#endif
-
-                
-/*
- * end_request() and friends. Must be called with the request queue spinlock
- * acquired. All functions called within end_request() _must_be_ atomic.
- *
- * Several drivers define their own end_request and call
- * end_that_request_first() and end_that_request_last()
- * for parts of the original function. This prevents
- * code duplication in drivers.
- */
-
-static inline void blkdev_dequeue_request(struct request * req)
-{
-       list_del(&req->queue);
-}
-
-int end_that_request_first(struct request *req, int uptodate, char *name);
-void end_that_request_last(struct request *req);
-
-#if defined(MAJOR_NR) || defined(IDE_DRIVER)
-
-#undef DEVICE_ON
-#undef DEVICE_OFF
-
-/*
- * Add entries as needed.
- */
-
-#ifdef IDE_DRIVER
-
-#define DEVICE_NR(device)      (MINOR(device) >> PARTN_BITS)
-#define DEVICE_NAME "ide"
-
-#elif (MAJOR_NR == RAMDISK_MAJOR)
-
-/* ram disk */
-#define DEVICE_NAME "ramdisk"
-#define DEVICE_NR(device) (MINOR(device))
-#define DEVICE_NO_RANDOM
-
-#elif (MAJOR_NR == Z2RAM_MAJOR)
-
-/* Zorro II Ram */
-#define DEVICE_NAME "Z2RAM"
-#define DEVICE_REQUEST do_z2_request
-#define DEVICE_NR(device) (MINOR(device))
-
-#elif (MAJOR_NR == FLOPPY_MAJOR)
-
-static void floppy_off(unsigned int nr);
-
-#define DEVICE_NAME "floppy"
-#define DEVICE_INTR do_floppy
-#define DEVICE_REQUEST do_fd_request
-#define DEVICE_NR(device) ( (MINOR(device) & 3) | ((MINOR(device) & 0x80 ) >> 5 ))
-#define DEVICE_OFF(device) floppy_off(DEVICE_NR(device))
-
-#elif (MAJOR_NR == HD_MAJOR)
-
-/* Hard disk:  timeout is 6 seconds. */
-#define DEVICE_NAME "hard disk"
-#define DEVICE_INTR do_hd
-#define TIMEOUT_VALUE (6*HZ)
-#define DEVICE_REQUEST do_hd_request
-#define DEVICE_NR(device) (MINOR(device)>>6)
-
-#elif (SCSI_DISK_MAJOR(MAJOR_NR))
-
-#define DEVICE_NAME "scsidisk"
-#define TIMEOUT_VALUE (2*HZ)
-#define DEVICE_NR(device) (((MAJOR(device) & SD_MAJOR_MASK) << (8 - 4)) + (MINOR(device) >> 4))
-
-/* Kludge to use the same number for both char and block major numbers */
-#elif  (MAJOR_NR == MD_MAJOR) && defined(MD_DRIVER)
-
-#define DEVICE_NAME "Multiple devices driver"
-#define DEVICE_REQUEST do_md_request
-#define DEVICE_NR(device) (MINOR(device))
-
-#elif (MAJOR_NR == SCSI_TAPE_MAJOR)
-
-#define DEVICE_NAME "scsitape"
-#define DEVICE_INTR do_st  
-#define DEVICE_NR(device) (MINOR(device) & 0x7f)
-
-#elif (MAJOR_NR == OSST_MAJOR)
-
-#define DEVICE_NAME "onstream" 
-#define DEVICE_INTR do_osst
-#define DEVICE_NR(device) (MINOR(device) & 0x7f) 
-#define DEVICE_ON(device) 
-#define DEVICE_OFF(device) 
-
-#elif (MAJOR_NR == SCSI_CDROM_MAJOR)
-
-#define DEVICE_NAME "CD-ROM"
-#define DEVICE_NR(device) (MINOR(device))
-
-#elif (MAJOR_NR == XT_DISK_MAJOR)
-
-#define DEVICE_NAME "xt disk"
-#define DEVICE_REQUEST do_xd_request
-#define DEVICE_NR(device) (MINOR(device) >> 6)
-
-#elif (MAJOR_NR == PS2ESDI_MAJOR)
-
-#define DEVICE_NAME "PS/2 ESDI"
-#define DEVICE_REQUEST do_ps2esdi_request
-#define DEVICE_NR(device) (MINOR(device) >> 6)
-
-#elif (MAJOR_NR == CDU31A_CDROM_MAJOR)
-
-#define DEVICE_NAME "CDU31A"
-#define DEVICE_REQUEST do_cdu31a_request
-#define DEVICE_NR(device) (MINOR(device))
-
-#elif (MAJOR_NR == ACSI_MAJOR) && (defined(CONFIG_ATARI_ACSI) || defined(CONFIG_ATARI_ACSI_MODULE))
-
-#define DEVICE_NAME "ACSI"
-#define DEVICE_INTR do_acsi
-#define DEVICE_REQUEST do_acsi_request
-#define DEVICE_NR(device) (MINOR(device) >> 4)
-
-#elif (MAJOR_NR == MITSUMI_CDROM_MAJOR)
-
-#define DEVICE_NAME "Mitsumi CD-ROM"
-/* #define DEVICE_INTR do_mcd */
-#define DEVICE_REQUEST do_mcd_request
-#define DEVICE_NR(device) (MINOR(device))
-
-#elif (MAJOR_NR == MITSUMI_X_CDROM_MAJOR)
-
-#define DEVICE_NAME "Mitsumi CD-ROM"
-/* #define DEVICE_INTR do_mcdx */
-#define DEVICE_REQUEST do_mcdx_request
-#define DEVICE_NR(device) (MINOR(device))
-
-#elif (MAJOR_NR == MATSUSHITA_CDROM_MAJOR)
-
-#define DEVICE_NAME "Matsushita CD-ROM controller #1"
-#define DEVICE_REQUEST do_sbpcd_request
-#define DEVICE_NR(device) (MINOR(device))
-
-#elif (MAJOR_NR == MATSUSHITA_CDROM2_MAJOR)
-
-#define DEVICE_NAME "Matsushita CD-ROM controller #2"
-#define DEVICE_REQUEST do_sbpcd2_request
-#define DEVICE_NR(device) (MINOR(device))
-
-#elif (MAJOR_NR == MATSUSHITA_CDROM3_MAJOR)
-
-#define DEVICE_NAME "Matsushita CD-ROM controller #3"
-#define DEVICE_REQUEST do_sbpcd3_request
-#define DEVICE_NR(device) (MINOR(device))
-
-#elif (MAJOR_NR == MATSUSHITA_CDROM4_MAJOR)
-
-#define DEVICE_NAME "Matsushita CD-ROM controller #4"
-#define DEVICE_REQUEST do_sbpcd4_request
-#define DEVICE_NR(device) (MINOR(device))
-
-#elif (MAJOR_NR == AZTECH_CDROM_MAJOR)
-
-#define DEVICE_NAME "Aztech CD-ROM"
-#define DEVICE_REQUEST do_aztcd_request
-#define DEVICE_NR(device) (MINOR(device))
-
-#elif (MAJOR_NR == CDU535_CDROM_MAJOR)
-
-#define DEVICE_NAME "SONY-CDU535"
-#define DEVICE_INTR do_cdu535
-#define DEVICE_REQUEST do_cdu535_request
-#define DEVICE_NR(device) (MINOR(device))
-
-#elif (MAJOR_NR == GOLDSTAR_CDROM_MAJOR)
-
-#define DEVICE_NAME "Goldstar R420"
-#define DEVICE_REQUEST do_gscd_request
-#define DEVICE_NR(device) (MINOR(device))
-
-#elif (MAJOR_NR == CM206_CDROM_MAJOR)
-#define DEVICE_NAME "Philips/LMS CD-ROM cm206"
-#define DEVICE_REQUEST do_cm206_request
-#define DEVICE_NR(device) (MINOR(device))
-
-#elif (MAJOR_NR == OPTICS_CDROM_MAJOR)
-
-#define DEVICE_NAME "DOLPHIN 8000AT CD-ROM"
-#define DEVICE_REQUEST do_optcd_request
-#define DEVICE_NR(device) (MINOR(device))
-
-#elif (MAJOR_NR == SANYO_CDROM_MAJOR)
-
-#define DEVICE_NAME "Sanyo H94A CD-ROM"
-#define DEVICE_REQUEST do_sjcd_request
-#define DEVICE_NR(device) (MINOR(device))
-
-#elif (MAJOR_NR == APBLOCK_MAJOR)
-
-#define DEVICE_NAME "apblock"
-#define DEVICE_REQUEST ap_request
-#define DEVICE_NR(device) (MINOR(device))
-
-#elif (MAJOR_NR == DDV_MAJOR)
-
-#define DEVICE_NAME "ddv"
-#define DEVICE_REQUEST ddv_request
-#define DEVICE_NR(device) (MINOR(device)>>PARTN_BITS)
-
-#elif (MAJOR_NR == MFM_ACORN_MAJOR)
-
-#define DEVICE_NAME "mfm disk"
-#define DEVICE_INTR do_mfm
-#define DEVICE_REQUEST do_mfm_request
-#define DEVICE_NR(device) (MINOR(device) >> 6)
-
-#elif (MAJOR_NR == NBD_MAJOR)
-
-#define DEVICE_NAME "nbd"
-#define DEVICE_REQUEST do_nbd_request
-#define DEVICE_NR(device) (MINOR(device))
-
-#elif (MAJOR_NR == MDISK_MAJOR)
-
-#define DEVICE_NAME "mdisk"
-#define DEVICE_REQUEST mdisk_request
-#define DEVICE_NR(device) (MINOR(device))
-
-#elif (MAJOR_NR == DASD_MAJOR)
-
-#define DEVICE_NAME "dasd"
-#define DEVICE_REQUEST do_dasd_request
-#define DEVICE_NR(device) (MINOR(device) >> PARTN_BITS)
-
-#elif (MAJOR_NR == I2O_MAJOR)
-
-#define DEVICE_NAME "I2O block"
-#define DEVICE_REQUEST i2ob_request
-#define DEVICE_NR(device) (MINOR(device)>>4)
-
-#elif (MAJOR_NR == COMPAQ_SMART2_MAJOR)
-
-#define DEVICE_NAME "ida"
-#define TIMEOUT_VALUE (25*HZ)
-#define DEVICE_REQUEST do_ida_request
-#define DEVICE_NR(device) (MINOR(device) >> 4)
-
-#endif /* MAJOR_NR == whatever */
-
-/* provide DEVICE_xxx defaults, if not explicitly defined
- * above in the MAJOR_NR==xxx if-elif tree */
-#ifndef DEVICE_ON
-#define DEVICE_ON(device) do {} while (0)
-#endif
-#ifndef DEVICE_OFF
-#define DEVICE_OFF(device) do {} while (0)
-#endif
-
-#if (MAJOR_NR != SCSI_TAPE_MAJOR) && (MAJOR_NR != OSST_MAJOR)
-#if !defined(IDE_DRIVER)
-
-#ifndef CURRENT
-#define CURRENT blkdev_entry_next_request(&blk_dev[MAJOR_NR].request_queue.queue_head)
-#endif
-#ifndef QUEUE_EMPTY
-#define QUEUE_EMPTY list_empty(&blk_dev[MAJOR_NR].request_queue.queue_head)
-#endif
-
-#ifndef DEVICE_NAME
-#define DEVICE_NAME "unknown"
-#endif
-
-#define CURRENT_DEV DEVICE_NR(CURRENT->rq_dev)
-
-#ifdef DEVICE_INTR
-static void (*DEVICE_INTR)(void) = NULL;
-#endif
-
-#define SET_INTR(x) (DEVICE_INTR = (x))
-
-#ifdef DEVICE_REQUEST
-static void (DEVICE_REQUEST)(request_queue_t *);
-#endif 
-  
-#ifdef DEVICE_INTR
-#define CLEAR_INTR SET_INTR(NULL)
-#else
-#define CLEAR_INTR
-#endif
-
-#define INIT_REQUEST \
-       if (QUEUE_EMPTY) {\
-               CLEAR_INTR; \
-               return; \
-       } \
-       if (MAJOR(CURRENT->rq_dev) != MAJOR_NR) \
-               panic(DEVICE_NAME ": request list destroyed"); \
-       if (CURRENT->bh) { \
-               if (!buffer_locked(CURRENT->bh)) \
-                       panic(DEVICE_NAME ": block not locked"); \
-       }
-
-#endif /* !defined(IDE_DRIVER) */
-
-
-#ifndef LOCAL_END_REQUEST      /* If we have our own end_request, we do not want to include this mess */
-
-#if ! SCSI_BLK_MAJOR(MAJOR_NR) && (MAJOR_NR != COMPAQ_SMART2_MAJOR)
-
-static inline void end_request(int uptodate) {
-       struct request *req = CURRENT;
-
-       if (end_that_request_first(req, uptodate, DEVICE_NAME))
-               return;
-
-#ifndef DEVICE_NO_RANDOM
-       add_blkdev_randomness(MAJOR(req->rq_dev));
-#endif
-       DEVICE_OFF(req->rq_dev);
-       blkdev_dequeue_request(req);
-       end_that_request_last(req);
-}
-
-#endif /* ! SCSI_BLK_MAJOR(MAJOR_NR) */
-#endif /* LOCAL_END_REQUEST */
-
-#endif /* (MAJOR_NR != SCSI_TAPE_MAJOR) */
-#endif /* defined(MAJOR_NR) || defined(IDE_DRIVER) */
-
-#endif /* _BLK_H */
diff --git a/xenolinux-2.4.21-sparse/include/linux/major.h b/xenolinux-2.4.21-sparse/include/linux/major.h
deleted file mode 100644 (file)
index f311bd4..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-#ifndef _LINUX_MAJOR_H
-#define _LINUX_MAJOR_H
-
-/*
- * This file has definitions for major device numbers.
- * For the device number assignments, see Documentation/devices.txt.
- */
-
-/* limits */
-
-/*
- * Important: Don't change this to 256.  Major number 255 is and must be
- * reserved for future expansion into a larger dev_t space.
- */
-#define MAX_CHRDEV     255
-#define MAX_BLKDEV     255
-
-#define UNNAMED_MAJOR  0
-#define MEM_MAJOR      1
-#define RAMDISK_MAJOR  1
-#define FLOPPY_MAJOR   2
-#define PTY_MASTER_MAJOR 2
-#define IDE0_MAJOR     3
-#define PTY_SLAVE_MAJOR 3
-#define HD_MAJOR       IDE0_MAJOR
-#define TTY_MAJOR      4
-#define TTYAUX_MAJOR   5
-#define LP_MAJOR       6
-#define VCS_MAJOR      7
-#define LOOP_MAJOR     7
-#define SCSI_DISK0_MAJOR 8
-#define SCSI_TAPE_MAJOR        9
-#define MD_MAJOR        9
-#define MISC_MAJOR     10
-#define SCSI_CDROM_MAJOR 11
-#define        MUX_MAJOR       11      /* PA-RISC only */
-#define QIC02_TAPE_MAJOR 12
-#define XT_DISK_MAJOR  13
-#define SOUND_MAJOR    14
-#define CDU31A_CDROM_MAJOR 15
-#define JOYSTICK_MAJOR 15
-#define GOLDSTAR_CDROM_MAJOR 16
-#define OPTICS_CDROM_MAJOR 17
-#define SANYO_CDROM_MAJOR 18
-#define CYCLADES_MAJOR  19
-#define CYCLADESAUX_MAJOR 20
-#define MITSUMI_X_CDROM_MAJOR 20
-#define MFM_ACORN_MAJOR 21     /* ARM Linux /dev/mfm */
-#define SCSI_GENERIC_MAJOR 21
-#define Z8530_MAJOR 34
-#define DIGI_MAJOR 23
-#define IDE1_MAJOR     22
-#define DIGICU_MAJOR 22
-#define MITSUMI_CDROM_MAJOR 23
-#define CDU535_CDROM_MAJOR 24
-#define STL_SERIALMAJOR 24
-#define MATSUSHITA_CDROM_MAJOR 25
-#define STL_CALLOUTMAJOR 25
-#define MATSUSHITA_CDROM2_MAJOR 26
-#define QIC117_TAPE_MAJOR 27
-#define MATSUSHITA_CDROM3_MAJOR 27
-#define MATSUSHITA_CDROM4_MAJOR 28
-#define STL_SIOMEMMAJOR 28
-#define ACSI_MAJOR     28
-#define AZTECH_CDROM_MAJOR 29
-#define GRAPHDEV_MAJOR 29      /* SparcLinux & Linux/68k /dev/fb */
-#define SHMIQ_MAJOR    85      /* Linux/mips, SGI /dev/shmiq */
-#define CM206_CDROM_MAJOR 32
-#define IDE2_MAJOR     33
-#define IDE3_MAJOR     34
-#define XPRAM_MAJOR     35      /* expanded storage on S/390 = "slow ram" */
-                                /* proposed by Peter                      */
-#define NETLINK_MAJOR  36
-#define PS2ESDI_MAJOR  36
-#define IDETAPE_MAJOR  37
-#define Z2RAM_MAJOR    37
-#define APBLOCK_MAJOR   38   /* AP1000 Block device */
-#define DDV_MAJOR       39   /* AP1000 DDV block device */
-#define NBD_MAJOR      43   /* Network block device    */
-#define RISCOM8_NORMAL_MAJOR 48
-#define DAC960_MAJOR   48      /* 48..55 */
-#define RISCOM8_CALLOUT_MAJOR 49
-#define MKISS_MAJOR    55
-#define DSP56K_MAJOR    55   /* DSP56001 processor device */
-
-#define IDE4_MAJOR     56
-#define IDE5_MAJOR     57
-
-#define LVM_BLK_MAJOR  58      /* Logical Volume Manager */
-
-#define SCSI_DISK1_MAJOR       65
-#define SCSI_DISK2_MAJOR       66
-#define SCSI_DISK3_MAJOR       67
-#define SCSI_DISK4_MAJOR       68
-#define SCSI_DISK5_MAJOR       69
-#define SCSI_DISK6_MAJOR       70
-#define SCSI_DISK7_MAJOR       71
-
-
-#define COMPAQ_SMART2_MAJOR    72
-#define COMPAQ_SMART2_MAJOR1   73
-#define COMPAQ_SMART2_MAJOR2   74
-#define COMPAQ_SMART2_MAJOR3   75
-#define COMPAQ_SMART2_MAJOR4   76
-#define COMPAQ_SMART2_MAJOR5   77
-#define COMPAQ_SMART2_MAJOR6   78
-#define COMPAQ_SMART2_MAJOR7   79
-
-#define SPECIALIX_NORMAL_MAJOR 75
-#define SPECIALIX_CALLOUT_MAJOR 76
-
-#define COMPAQ_CISS_MAJOR      104
-#define COMPAQ_CISS_MAJOR1     105
-#define COMPAQ_CISS_MAJOR2      106
-#define COMPAQ_CISS_MAJOR3      107
-#define COMPAQ_CISS_MAJOR4      108
-#define COMPAQ_CISS_MAJOR5      109
-#define COMPAQ_CISS_MAJOR6      110
-#define COMPAQ_CISS_MAJOR7      111
-
-#define ATARAID_MAJOR          114
-
-#define DASD_MAJOR      94     /* Official assignations from Peter */
-
-#define MDISK_MAJOR     95     /* Official assignations from Peter */
-
-#define I2O_MAJOR              80      /* 80->87 */
-
-#define IDE6_MAJOR     88
-#define IDE7_MAJOR     89
-#define IDE8_MAJOR     90
-#define IDE9_MAJOR     91
-
-#define UBD_MAJOR      98
-
-#define AURORA_MAJOR 79
-
-#define JSFD_MAJOR     99
-
-#define PHONE_MAJOR    100
-
-#define LVM_CHAR_MAJOR 109     /* Logical Volume Manager */
-
-#define        UMEM_MAJOR      116     /* http://www.umem.com/ Battery Backed RAM */
-
-#define        UMEM_MAJOR      116     /* http://www.umem.com/ Battery Backed RAM */
-
-/*
- * XLVIRT supports 16 devices of <= 16 partitions each.
- * eg. xvda == (125, 0), xvdb == (125, 16), ...
- */
-#define XLVIRT_MAJOR    125
-
-#define RTF_MAJOR      150
-#define RAW_MAJOR      162
-
-#define USB_ACM_MAJOR          166
-#define USB_ACM_AUX_MAJOR      167
-#define USB_CHAR_MAJOR         180
-
-#define UNIX98_PTY_MASTER_MAJOR        128
-#define UNIX98_PTY_MAJOR_COUNT 8
-#define UNIX98_PTY_SLAVE_MAJOR (UNIX98_PTY_MASTER_MAJOR+UNIX98_PTY_MAJOR_COUNT)
-
-#define VXVM_MAJOR             199     /* VERITAS volume i/o driver    */
-#define VXSPEC_MAJOR           200     /* VERITAS volume config driver */
-#define VXDMP_MAJOR            201     /* VERITAS volume multipath driver */
-
-#define MSR_MAJOR              202
-#define CPUID_MAJOR            203
-
-#define OSST_MAJOR     206     /* OnStream-SCx0 SCSI tape */
-
-#define IBM_TTY3270_MAJOR       227    /* Official allocations now */
-#define IBM_FS3270_MAJOR        228
-
-/*
- * Tests for SCSI devices.
- */
-
-#define SCSI_DISK_MAJOR(M) ((M) == SCSI_DISK0_MAJOR || \
-  ((M) >= SCSI_DISK1_MAJOR && (M) <= SCSI_DISK7_MAJOR))
-  
-#define SCSI_BLK_MAJOR(M) \
-  (SCSI_DISK_MAJOR(M)  \
-   || (M) == SCSI_CDROM_MAJOR)
-
-static __inline__ int scsi_blk_major(int m) {
-       return SCSI_BLK_MAJOR(m);
-}
-
-/*
- * Tests for IDE devices
- */
-#define IDE_DISK_MAJOR(M)      ((M) == IDE0_MAJOR || (M) == IDE1_MAJOR || \
-                               (M) == IDE2_MAJOR || (M) == IDE3_MAJOR || \
-                               (M) == IDE4_MAJOR || (M) == IDE5_MAJOR || \
-                               (M) == IDE6_MAJOR || (M) == IDE7_MAJOR || \
-                               (M) == IDE8_MAJOR || (M) == IDE9_MAJOR)
-
-static __inline__ int ide_blk_major(int m)
-{
-       return IDE_DISK_MAJOR(m);
-}
-
-#endif
diff --git a/xenolinux-2.4.21-sparse/include/linux/sunrpc/debug.h b/xenolinux-2.4.21-sparse/include/linux/sunrpc/debug.h
deleted file mode 100644 (file)
index 67dbfb8..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * linux/include/linux/sunrpc/debug.h
- *
- * Debugging support for sunrpc module
- *
- * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de>
- */
-
-#ifndef _LINUX_SUNRPC_DEBUG_H_
-#define _LINUX_SUNRPC_DEBUG_H_
-
-#include <linux/config.h>
-
-#include <linux/timer.h>
-#include <linux/tqueue.h>
-
-/*
- * Enable RPC debugging/profiling.
- */
-/*#ifdef CONFIG_SYSCTL*/
-/*#define  RPC_DEBUG*/
-/*#endif*/
-/* #define  RPC_PROFILE */
-
-/*
- * RPC debug facilities
- */
-#define RPCDBG_XPRT            0x0001
-#define RPCDBG_CALL            0x0002
-#define RPCDBG_DEBUG           0x0004
-#define RPCDBG_NFS             0x0008
-#define RPCDBG_AUTH            0x0010
-#define RPCDBG_PMAP            0x0020
-#define RPCDBG_SCHED           0x0040
-#define RPCDBG_SVCSOCK         0x0100
-#define RPCDBG_SVCDSP          0x0200
-#define RPCDBG_MISC            0x0400
-#define RPCDBG_ALL             0x7fff
-
-#ifdef __KERNEL__
-
-/*
- * Debugging macros etc
- */
-#ifdef RPC_DEBUG
-extern unsigned int            rpc_debug;
-extern unsigned int            nfs_debug;
-extern unsigned int            nfsd_debug;
-extern unsigned int            nlm_debug;
-#endif
-
-#define dprintk(args...)       dfprintk(FACILITY, ## args)
-
-#undef ifdebug
-#ifdef RPC_DEBUG                       
-# define ifdebug(fac)          if (rpc_debug & RPCDBG_##fac)
-# define dfprintk(fac, args...)        do { ifdebug(fac) printk(args); } while(0)
-# define RPC_IFDEBUG(x)                x
-#else
-# define dfprintk(fac, args...)        do ; while (0)
-# define RPC_IFDEBUG(x)
-#endif
-
-#ifdef RPC_PROFILE
-# define pprintk(args...)      printk(## args)
-#else
-# define pprintk(args...)      do ; while (0)
-#endif
-
-/*
- * Sysctl interface for RPC debugging
- */
-#ifdef RPC_DEBUG
-void           rpc_register_sysctl(void);
-void           rpc_unregister_sysctl(void);
-#endif
-
-#endif /* __KERNEL__ */
-
-/*
- * Declarations for the sysctl debug interface, which allows to read or
- * change the debug flags for rpc, nfs, nfsd, and lockd. Since the sunrpc
- * module currently registers its sysctl table dynamically, the sysctl path
- * for module FOO is <CTL_SUNRPC, CTL_FOODEBUG>.
- */
-#define CTL_SUNRPC     7249    /* arbitrary and hopefully unused */
-
-enum {
-       CTL_RPCDEBUG = 1,
-       CTL_NFSDEBUG,
-       CTL_NFSDDEBUG,
-       CTL_NLMDEBUG,
-};
-
-#endif /* _LINUX_SUNRPC_DEBUG_H_ */
diff --git a/xenolinux-2.4.21-sparse/init/do_mounts.c b/xenolinux-2.4.21-sparse/init/do_mounts.c
deleted file mode 100644 (file)
index e848a37..0000000
+++ /dev/null
@@ -1,1067 +0,0 @@
-#define __KERNEL_SYSCALLS__
-#include <linux/config.h>
-#include <linux/slab.h>
-#include <linux/devfs_fs_kernel.h>
-#include <linux/unistd.h>
-#include <linux/ctype.h>
-#include <linux/blk.h>
-#include <linux/fd.h>
-#include <linux/tty.h>
-#include <linux/init.h>
-
-#include <linux/nfs_fs.h>
-#include <linux/nfs_fs_sb.h>
-#include <linux/nfs_mount.h>
-#include <linux/minix_fs.h>
-#include <linux/ext2_fs.h>
-#include <linux/romfs_fs.h>
-
-#define BUILD_CRAMDISK
-
-extern int get_filesystem_list(char * buf);
-
-extern asmlinkage long sys_mount(char *dev_name, char *dir_name, char *type,
-        unsigned long flags, void *data);
-extern asmlinkage long sys_mkdir(const char *name, int mode);
-extern asmlinkage long sys_chdir(const char *name);
-extern asmlinkage long sys_fchdir(int fd);
-extern asmlinkage long sys_chroot(const char *name);
-extern asmlinkage long sys_unlink(const char *name);
-extern asmlinkage long sys_symlink(const char *old, const char *new);
-extern asmlinkage long sys_mknod(const char *name, int mode, dev_t dev);
-extern asmlinkage long sys_umount(char *name, int flags);
-extern asmlinkage long sys_ioctl(int fd, int cmd, unsigned long arg);
-
-#ifdef CONFIG_BLK_DEV_INITRD
-unsigned int real_root_dev;    /* do_proc_dointvec cannot handle kdev_t */
-static int __initdata mount_initrd = 1;
-
-static int __init no_initrd(char *str)
-{
-       mount_initrd = 0;
-       return 1;
-}
-
-__setup("noinitrd", no_initrd);
-#else
-static int __initdata mount_initrd = 0;
-#endif
-
-int __initdata rd_doload;      /* 1 = load RAM disk, 0 = don't load */
-
-int root_mountflags = MS_RDONLY | MS_VERBOSE;
-static char root_device_name[64];
-
-/* this is initialized in init/main.c */
-kdev_t ROOT_DEV;
-
-static int do_devfs = 0;
-
-static int __init load_ramdisk(char *str)
-{
-       rd_doload = simple_strtol(str,NULL,0) & 3;
-       return 1;
-}
-__setup("load_ramdisk=", load_ramdisk);
-
-static int __init readonly(char *str)
-{
-       if (*str)
-               return 0;
-       root_mountflags |= MS_RDONLY;
-       return 1;
-}
-
-static int __init readwrite(char *str)
-{
-       if (*str)
-               return 0;
-       root_mountflags &= ~MS_RDONLY;
-       return 1;
-}
-
-__setup("ro", readonly);
-__setup("rw", readwrite);
-
-static struct dev_name_struct {
-       const char *name;
-       const int num;
-} root_dev_names[] __initdata = {
-       { "nfs",     0x00ff },
-       { "hda",     0x0300 },
-       { "hdb",     0x0340 },
-       { "loop",    0x0700 },
-       { "hdc",     0x1600 },
-       { "hdd",     0x1640 },
-       { "hde",     0x2100 },
-       { "hdf",     0x2140 },
-       { "hdg",     0x2200 },
-       { "hdh",     0x2240 },
-       { "hdi",     0x3800 },
-       { "hdj",     0x3840 },
-       { "hdk",     0x3900 },
-       { "hdl",     0x3940 },
-       { "hdm",     0x5800 },
-       { "hdn",     0x5840 },
-       { "hdo",     0x5900 },
-       { "hdp",     0x5940 },
-       { "hdq",     0x5A00 },
-       { "hdr",     0x5A40 },
-       { "hds",     0x5B00 },
-       { "hdt",     0x5B40 },
-       { "sda",     0x0800 },
-       { "sdb",     0x0810 },
-       { "sdc",     0x0820 },
-       { "sdd",     0x0830 },
-       { "sde",     0x0840 },
-       { "sdf",     0x0850 },
-       { "sdg",     0x0860 },
-       { "sdh",     0x0870 },
-       { "sdi",     0x0880 },
-       { "sdj",     0x0890 },
-       { "sdk",     0x08a0 },
-       { "sdl",     0x08b0 },
-       { "sdm",     0x08c0 },
-       { "sdn",     0x08d0 },
-       { "sdo",     0x08e0 },
-       { "sdp",     0x08f0 },
-       { "ada",     0x1c00 },
-       { "adb",     0x1c10 },
-       { "adc",     0x1c20 },
-       { "add",     0x1c30 },
-       { "ade",     0x1c40 },
-       { "fd",      0x0200 },
-       { "md",      0x0900 },       
-       { "xda",     0x0d00 },
-       { "xdb",     0x0d40 },
-       { "ram",     0x0100 },
-       { "scd",     0x0b00 },
-       { "mcd",     0x1700 },
-       { "cdu535",  0x1800 },
-       { "sonycd",  0x1800 },
-       { "aztcd",   0x1d00 },
-       { "cm206cd", 0x2000 },
-       { "gscd",    0x1000 },
-       { "sbpcd",   0x1900 },
-       { "eda",     0x2400 },
-       { "edb",     0x2440 },
-       { "pda",        0x2d00 },
-       { "pdb",        0x2d10 },
-       { "pdc",        0x2d20 },
-       { "pdd",        0x2d30 },
-       { "pcd",        0x2e00 },
-       { "pf",         0x2f00 },
-       { "apblock", APBLOCK_MAJOR << 8},
-       { "ddv", DDV_MAJOR << 8},
-       { "jsfd",    JSFD_MAJOR << 8},
-#if defined(CONFIG_ARCH_S390)
-       { "dasda", (DASD_MAJOR << MINORBITS) },
-       { "dasdb", (DASD_MAJOR << MINORBITS) + (1 << 2) },
-       { "dasdc", (DASD_MAJOR << MINORBITS) + (2 << 2) },
-       { "dasdd", (DASD_MAJOR << MINORBITS) + (3 << 2) },
-       { "dasde", (DASD_MAJOR << MINORBITS) + (4 << 2) },
-       { "dasdf", (DASD_MAJOR << MINORBITS) + (5 << 2) },
-       { "dasdg", (DASD_MAJOR << MINORBITS) + (6 << 2) },
-       { "dasdh", (DASD_MAJOR << MINORBITS) + (7 << 2) },
-#endif
-       { "ida/c0d0p",0x4800 },
-       { "ida/c0d1p",0x4810 },
-       { "ida/c0d2p",0x4820 },
-       { "ida/c0d3p",0x4830 },
-       { "ida/c0d4p",0x4840 },
-       { "ida/c0d5p",0x4850 },
-       { "ida/c0d6p",0x4860 },
-       { "ida/c0d7p",0x4870 },
-       { "ida/c0d8p",0x4880 },
-       { "ida/c0d9p",0x4890 },
-       { "ida/c0d10p",0x48A0 },
-       { "ida/c0d11p",0x48B0 },
-       { "ida/c0d12p",0x48C0 },
-       { "ida/c0d13p",0x48D0 },
-       { "ida/c0d14p",0x48E0 },
-       { "ida/c0d15p",0x48F0 },
-       { "ida/c1d0p",0x4900 },
-       { "ida/c2d0p",0x4A00 },
-       { "ida/c3d0p",0x4B00 },
-       { "ida/c4d0p",0x4C00 },
-       { "ida/c5d0p",0x4D00 },
-       { "ida/c6d0p",0x4E00 },
-       { "ida/c7d0p",0x4F00 }, 
-       { "cciss/c0d0p",0x6800 },
-       { "cciss/c0d1p",0x6810 },
-       { "cciss/c0d2p",0x6820 },
-       { "cciss/c0d3p",0x6830 },
-       { "cciss/c0d4p",0x6840 },
-       { "cciss/c0d5p",0x6850 },
-       { "cciss/c0d6p",0x6860 },
-       { "cciss/c0d7p",0x6870 },
-       { "cciss/c0d8p",0x6880 },
-       { "cciss/c0d9p",0x6890 },
-       { "cciss/c0d10p",0x68A0 },
-       { "cciss/c0d11p",0x68B0 },
-       { "cciss/c0d12p",0x68C0 },
-       { "cciss/c0d13p",0x68D0 },
-       { "cciss/c0d14p",0x68E0 },
-       { "cciss/c0d15p",0x68F0 },
-       { "cciss/c1d0p",0x6900 },
-       { "cciss/c2d0p",0x6A00 },
-       { "cciss/c3d0p",0x6B00 },
-       { "cciss/c4d0p",0x6C00 },
-       { "cciss/c5d0p",0x6D00 },
-       { "cciss/c6d0p",0x6E00 },
-       { "cciss/c7d0p",0x6F00 },
-       { "ataraid/d0p",0x7200 },
-       { "ataraid/d1p",0x7210 },
-       { "ataraid/d2p",0x7220 },
-       { "ataraid/d3p",0x7230 },
-       { "ataraid/d4p",0x7240 },
-       { "ataraid/d5p",0x7250 },
-       { "ataraid/d6p",0x7260 },
-       { "ataraid/d7p",0x7270 },
-       { "ataraid/d8p",0x7280 },
-       { "ataraid/d9p",0x7290 },
-       { "ataraid/d10p",0x72A0 },
-       { "ataraid/d11p",0x72B0 },
-       { "ataraid/d12p",0x72C0 },
-       { "ataraid/d13p",0x72D0 },
-       { "ataraid/d14p",0x72E0 },
-       { "ataraid/d15p",0x72F0 },
-        { "rd/c0d0p",0x3000 },
-        { "rd/c0d0p1",0x3001 },
-        { "rd/c0d0p2",0x3002 },
-        { "rd/c0d0p3",0x3003 },
-        { "rd/c0d0p4",0x3004 },
-        { "rd/c0d0p5",0x3005 },
-        { "rd/c0d0p6",0x3006 },
-        { "rd/c0d0p7",0x3007 },
-        { "rd/c0d0p8",0x3008 },
-        { "rd/c0d1p",0x3008 },
-        { "rd/c0d1p1",0x3009 },
-        { "rd/c0d1p2",0x300a },
-        { "rd/c0d1p3",0x300b },
-        { "rd/c0d1p4",0x300c },
-        { "rd/c0d1p5",0x300d },
-        { "rd/c0d1p6",0x300e },
-        { "rd/c0d1p7",0x300f },
-        { "rd/c0d1p8",0x3010 },
-       { "nftla", 0x5d00 },
-       { "nftlb", 0x5d10 },
-       { "nftlc", 0x5d20 },
-       { "nftld", 0x5d30 },
-       { "ftla", 0x2c00 },
-       { "ftlb", 0x2c08 },
-       { "ftlc", 0x2c10 },
-       { "ftld", 0x2c18 },
-       { "mtdblock", 0x1f00 },
-       { "nb", 0x2b00 },
-#if defined(CONFIG_XENOLINUX_BLOCK)
-        { "xvda", 0x7D00 }, { "xvdb", 0x7D10 },
-        { "xvdc", 0x7D20 }, { "xvdd", 0x7D30 },
-        { "xvde", 0x7D40 }, { "xvdf", 0x7D50 },
-        { "xvdg", 0x7D60 }, { "xvdh", 0x7D70 },
-        { "xvdi", 0x7D80 }, { "xvdj", 0x7D90 },
-        { "xvdk", 0x7DA0 }, { "xvdl", 0x7DB0 },
-        { "xvdm", 0x7DC0 }, { "xvdn", 0x7DD0 },
-        { "xvdo", 0x7DE0 }, { "xvdp", 0x7DF0 },
-#endif
-       { NULL, 0 }
-};
-
-kdev_t __init name_to_kdev_t(char *line)
-{
-       int base = 0, offs;
-       char *end;
-
-       if (strncmp(line,"/dev/",5) == 0) {
-               struct dev_name_struct *dev = root_dev_names;
-               line += 5;
-               do {
-                       int len = strlen(dev->name);
-                       if (strncmp(line,dev->name,len) == 0) {
-                               line += len;
-                               base = dev->num;
-                               break;
-                       }
-                       dev++;
-               } while (dev->name);
-       }
-       offs = simple_strtoul(line, &end, base?10:16);
-       if (*end)
-               offs = 0;
-       return to_kdev_t(base + offs);
-}
-
-static int __init root_dev_setup(char *line)
-{
-       int i;
-       char ch;
-
-       ROOT_DEV = name_to_kdev_t(line);
-       memset (root_device_name, 0, sizeof root_device_name);
-       if (strncmp (line, "/dev/", 5) == 0) line += 5;
-       for (i = 0; i < sizeof root_device_name - 1; ++i)
-       {
-           ch = line[i];
-           if ( isspace (ch) || (ch == ',') || (ch == '\0') ) break;
-           root_device_name[i] = ch;
-       }
-       return 1;
-}
-
-__setup("root=", root_dev_setup);
-
-static char * __initdata root_mount_data;
-static int __init root_data_setup(char *str)
-{
-       root_mount_data = str;
-       return 1;
-}
-
-static char * __initdata root_fs_names;
-static int __init fs_names_setup(char *str)
-{
-       root_fs_names = str;
-       return 1;
-}
-
-__setup("rootflags=", root_data_setup);
-__setup("rootfstype=", fs_names_setup);
-
-static void __init get_fs_names(char *page)
-{
-       char *s = page;
-
-       if (root_fs_names) {
-               strcpy(page, root_fs_names);
-               while (*s++) {
-                       if (s[-1] == ',')
-                               s[-1] = '\0';
-               }
-       } else {
-               int len = get_filesystem_list(page);
-               char *p, *next;
-
-               page[len] = '\0';
-               for (p = page-1; p; p = next) {
-                       next = strchr(++p, '\n');
-                       if (*p++ != '\t')
-                               continue;
-                       while ((*s++ = *p++) != '\n')
-                               ;
-                       s[-1] = '\0';
-               }
-       }
-       *s = '\0';
-}
-static void __init mount_block_root(char *name, int flags)
-{
-       char *fs_names = __getname();
-       char *p;
-
-       get_fs_names(fs_names);
-retry:
-       for (p = fs_names; *p; p += strlen(p)+1) {
-               int err = sys_mount(name, "/root", p, flags, root_mount_data);
-               switch (err) {
-                       case 0:
-                               goto out;
-                       case -EACCES:
-                               flags |= MS_RDONLY;
-                               goto retry;
-                       case -EINVAL:
-                               continue;
-               }
-               /*
-                * Allow the user to distinguish between failed open
-                * and bad superblock on root device.
-                */
-               printk ("VFS: Cannot open root device \"%s\" or %s\n",
-                       root_device_name, kdevname (ROOT_DEV));
-               printk ("Please append a correct \"root=\" boot option\n");
-               panic("VFS: Unable to mount root fs on %s",
-                       kdevname(ROOT_DEV));
-       }
-       panic("VFS: Unable to mount root fs on %s", kdevname(ROOT_DEV));
-out:
-       putname(fs_names);
-       sys_chdir("/root");
-       ROOT_DEV = current->fs->pwdmnt->mnt_sb->s_dev;
-       printk("VFS: Mounted root (%s filesystem)%s.\n",
-               current->fs->pwdmnt->mnt_sb->s_type->name,
-               (current->fs->pwdmnt->mnt_sb->s_flags & MS_RDONLY) ? " readonly" : "");
-}
-#ifdef CONFIG_ROOT_NFS
-static int __init mount_nfs_root(void)
-{
-       void *data = nfs_root_data();
-
-       if (data && sys_mount("/dev/root","/root","nfs",root_mountflags,data) == 0)
-               return 1;
-       return 0;
-}
-#endif
-
-static int __init create_dev(char *name, kdev_t dev, char *devfs_name)
-{
-       void *handle;
-       char path[64];
-       int n;
-
-       sys_unlink(name);
-       if (!do_devfs)
-               return sys_mknod(name, S_IFBLK|0600, kdev_t_to_nr(dev));
-
-       handle = devfs_find_handle(NULL, dev ? NULL : devfs_name,
-                               MAJOR(dev), MINOR(dev), DEVFS_SPECIAL_BLK, 1);
-       if (!handle)
-               return -1;
-       n = devfs_generate_path(handle, path + 5, sizeof (path) - 5);
-       if (n < 0)
-               return -1;
-       return sys_symlink(path + n + 5, name);
-}
-
-#if defined(CONFIG_BLK_DEV_RAM) || defined(CONFIG_BLK_DEV_FD)
-static void __init change_floppy(char *fmt, ...)
-{
-       struct termios termios;
-       char buf[80];
-       char c;
-       int fd;
-       va_list args;
-       va_start(args, fmt);
-       vsprintf(buf, fmt, args);
-       va_end(args);
-       fd = open("/dev/root", O_RDWR | O_NDELAY, 0);
-       if (fd >= 0) {
-               sys_ioctl(fd, FDEJECT, 0);
-               close(fd);
-       }
-       printk(KERN_NOTICE "VFS: Insert %s and press ENTER\n", buf);
-       fd = open("/dev/console", O_RDWR, 0);
-       if (fd >= 0) {
-               sys_ioctl(fd, TCGETS, (long)&termios);
-               termios.c_lflag &= ~ICANON;
-               sys_ioctl(fd, TCSETSF, (long)&termios);
-               read(fd, &c, 1);
-               termios.c_lflag |= ICANON;
-               sys_ioctl(fd, TCSETSF, (long)&termios);
-               close(fd);
-       }
-}
-#endif
-
-#ifdef CONFIG_BLK_DEV_RAM
-
-int __initdata rd_prompt = 1;  /* 1 = prompt for RAM disk, 0 = don't prompt */
-
-static int __init prompt_ramdisk(char *str)
-{
-       rd_prompt = simple_strtol(str,NULL,0) & 1;
-       return 1;
-}
-__setup("prompt_ramdisk=", prompt_ramdisk);
-
-int __initdata rd_image_start;         /* starting block # of image */
-
-static int __init ramdisk_start_setup(char *str)
-{
-       rd_image_start = simple_strtol(str,NULL,0);
-       return 1;
-}
-__setup("ramdisk_start=", ramdisk_start_setup);
-
-static int __init crd_load(int in_fd, int out_fd);
-
-/*
- * This routine tries to find a RAM disk image to load, and returns the
- * number of blocks to read for a non-compressed image, 0 if the image
- * is a compressed image, and -1 if an image with the right magic
- * numbers could not be found.
- *
- * We currently check for the following magic numbers:
- *     minix
- *     ext2
- *     romfs
- *     gzip
- */
-static int __init 
-identify_ramdisk_image(int fd, int start_block)
-{
-       const int size = 512;
-       struct minix_super_block *minixsb;
-       struct ext2_super_block *ext2sb;
-       struct romfs_super_block *romfsb;
-       int nblocks = -1;
-       unsigned char *buf;
-
-       buf = kmalloc(size, GFP_KERNEL);
-       if (buf == 0)
-               return -1;
-
-       minixsb = (struct minix_super_block *) buf;
-       ext2sb = (struct ext2_super_block *) buf;
-       romfsb = (struct romfs_super_block *) buf;
-       memset(buf, 0xe5, size);
-
-       /*
-        * Read block 0 to test for gzipped kernel
-        */
-       lseek(fd, start_block * BLOCK_SIZE, 0);
-       read(fd, buf, size);
-
-       /*
-        * If it matches the gzip magic numbers, return -1
-        */
-       if (buf[0] == 037 && ((buf[1] == 0213) || (buf[1] == 0236))) {
-               printk(KERN_NOTICE
-                      "RAMDISK: Compressed image found at block %d\n",
-                      start_block);
-               nblocks = 0;
-               goto done;
-       }
-
-       /* romfs is at block zero too */
-       if (romfsb->word0 == ROMSB_WORD0 &&
-           romfsb->word1 == ROMSB_WORD1) {
-               printk(KERN_NOTICE
-                      "RAMDISK: romfs filesystem found at block %d\n",
-                      start_block);
-               nblocks = (ntohl(romfsb->size)+BLOCK_SIZE-1)>>BLOCK_SIZE_BITS;
-               goto done;
-       }
-
-       /*
-        * Read block 1 to test for minix and ext2 superblock
-        */
-       lseek(fd, (start_block+1) * BLOCK_SIZE, 0);
-       read(fd, buf, size);
-
-       /* Try minix */
-       if (minixsb->s_magic == MINIX_SUPER_MAGIC ||
-           minixsb->s_magic == MINIX_SUPER_MAGIC2) {
-               printk(KERN_NOTICE
-                      "RAMDISK: Minix filesystem found at block %d\n",
-                      start_block);
-               nblocks = minixsb->s_nzones << minixsb->s_log_zone_size;
-               goto done;
-       }
-
-       /* Try ext2 */
-       if (ext2sb->s_magic == cpu_to_le16(EXT2_SUPER_MAGIC)) {
-               printk(KERN_NOTICE
-                      "RAMDISK: ext2 filesystem found at block %d\n",
-                      start_block);
-               nblocks = le32_to_cpu(ext2sb->s_blocks_count);
-               goto done;
-       }
-
-       printk(KERN_NOTICE
-              "RAMDISK: Couldn't find valid RAM disk image starting at %d.\n",
-              start_block);
-       
-done:
-       lseek(fd, start_block * BLOCK_SIZE, 0);
-       kfree(buf);
-       return nblocks;
-}
-#endif
-
-static int __init rd_load_image(char *from)
-{
-       int res = 0;
-
-#ifdef CONFIG_BLK_DEV_RAM
-       int in_fd, out_fd;
-       unsigned long rd_blocks, devblocks;
-       int nblocks, i;
-       char *buf;
-       unsigned short rotate = 0;
-#if !defined(CONFIG_ARCH_S390) && !defined(CONFIG_PPC_ISERIES)
-       char rotator[4] = { '|' , '/' , '-' , '\\' };
-#endif
-
-       out_fd = open("/dev/ram", O_RDWR, 0);
-       if (out_fd < 0)
-               goto out;
-
-       in_fd = open(from, O_RDONLY, 0);
-       if (in_fd < 0)
-               goto noclose_input;
-
-       nblocks = identify_ramdisk_image(in_fd, rd_image_start);
-       if (nblocks < 0)
-               goto done;
-
-       if (nblocks == 0) {
-#ifdef BUILD_CRAMDISK
-               if (crd_load(in_fd, out_fd) == 0)
-                       goto successful_load;
-#else
-               printk(KERN_NOTICE
-                      "RAMDISK: Kernel does not support compressed "
-                      "RAM disk images\n");
-#endif
-               goto done;
-       }
-
-       /*
-        * NOTE NOTE: nblocks suppose that the blocksize is BLOCK_SIZE, so
-        * rd_load_image will work only with filesystem BLOCK_SIZE wide!
-        * So make sure to use 1k blocksize while generating ext2fs
-        * ramdisk-images.
-        */
-       if (sys_ioctl(out_fd, BLKGETSIZE, (unsigned long)&rd_blocks) < 0)
-               rd_blocks = 0;
-       else
-               rd_blocks >>= 1;
-
-       if (nblocks > rd_blocks) {
-               printk("RAMDISK: image too big! (%d/%lu blocks)\n",
-                      nblocks, rd_blocks);
-               goto done;
-       }
-               
-       /*
-        * OK, time to copy in the data
-        */
-       buf = kmalloc(BLOCK_SIZE, GFP_KERNEL);
-       if (buf == 0) {
-               printk(KERN_ERR "RAMDISK: could not allocate buffer\n");
-               goto done;
-       }
-
-       if (sys_ioctl(in_fd, BLKGETSIZE, (unsigned long)&devblocks) < 0)
-               devblocks = 0;
-       else
-               devblocks >>= 1;
-
-       if (strcmp(from, "/dev/initrd") == 0)
-               devblocks = nblocks;
-
-       if (devblocks == 0) {
-               printk(KERN_ERR "RAMDISK: could not determine device size\n");
-               goto done;
-       }
-
-       printk(KERN_NOTICE "RAMDISK: Loading %d blocks [%ld disk%s] into ram disk... ", 
-               nblocks, ((nblocks-1)/devblocks)+1, nblocks>devblocks ? "s" : "");
-       for (i=0; i < nblocks; i++) {
-               if (i && (i % devblocks == 0)) {
-                       printk("done disk #%ld.\n", i/devblocks);
-                       rotate = 0;
-                       if (close(in_fd)) {
-                               printk("Error closing the disk.\n");
-                               goto noclose_input;
-                       }
-                       change_floppy("disk #%d", i/devblocks+1);
-                       in_fd = open(from, O_RDONLY, 0);
-                       if (in_fd < 0)  {
-                               printk("Error opening disk.\n");
-                               goto noclose_input;
-                       }
-                       printk("Loading disk #%ld... ", i/devblocks+1);
-               }
-               read(in_fd, buf, BLOCK_SIZE);
-               write(out_fd, buf, BLOCK_SIZE);
-#if !defined(CONFIG_ARCH_S390) && !defined(CONFIG_PPC_ISERIES)
-               if (!(i % 16)) {
-                       printk("%c\b", rotator[rotate & 0x3]);
-                       rotate++;
-               }
-#endif
-       }
-       printk("done.\n");
-       kfree(buf);
-
-successful_load:
-       res = 1;
-done:
-       close(in_fd);
-noclose_input:
-       close(out_fd);
-out:
-       sys_unlink("/dev/ram");
-#endif
-       return res;
-}
-
-static int __init rd_load_disk(int n)
-{
-#ifdef CONFIG_BLK_DEV_RAM
-       if (rd_prompt)
-               change_floppy("root floppy disk to be loaded into RAM disk");
-       create_dev("/dev/ram", MKDEV(RAMDISK_MAJOR, n), NULL);
-#endif
-       return rd_load_image("/dev/root");
-}
-
-#ifdef CONFIG_DEVFS_FS
-
-static void __init convert_name(char *prefix, char *name, char *p, int part)
-{
-       int host, bus, target, lun;
-       char dest[64];
-       char src[64];
-       char *base = p - 1;
-
-       /*  Decode "c#b#t#u#"  */
-       if (*p++ != 'c')
-               return;
-       host = simple_strtol(p, &p, 10);
-       if (*p++ != 'b')
-               return;
-       bus = simple_strtol(p, &p, 10);
-       if (*p++ != 't')
-               return;
-       target = simple_strtol(p, &p, 10);
-       if (*p++ != 'u')
-               return;
-       lun = simple_strtol(p, &p, 10);
-       if (!part)
-               sprintf(dest, "%s/host%d/bus%d/target%d/lun%d",
-                               prefix, host, bus, target, lun);
-       else if (*p++ == 'p')
-               sprintf(dest, "%s/host%d/bus%d/target%d/lun%d/part%s",
-                               prefix, host, bus, target, lun, p);
-       else
-               sprintf(dest, "%s/host%d/bus%d/target%d/lun%d/disc",
-                               prefix, host, bus, target, lun);
-       *base = '\0';
-       sprintf(src, "/dev/%s", name);
-       sys_mkdir(src, 0755);
-       *base = '/';
-       sprintf(src, "/dev/%s", name);
-       sys_symlink(dest, src);
-}
-
-static void __init devfs_make_root(char *name)
-{
-
-       if (!strncmp(name, "sd/", 3))
-               convert_name("../scsi", name, name+3, 1);
-       else if (!strncmp(name, "sr/", 3))
-               convert_name("../scsi", name, name+3, 0);
-       else if (!strncmp(name, "ide/hd/", 7))
-               convert_name("..", name, name + 7, 1);
-       else if (!strncmp(name, "ide/cd/", 7))
-               convert_name("..", name, name + 7, 0);
-}
-#else
-static void __init devfs_make_root(char *name)
-{
-}
-#endif
-
-static void __init mount_root(void)
-{
-#ifdef CONFIG_ROOT_NFS
-       if (MAJOR(ROOT_DEV) == UNNAMED_MAJOR) {
-               if (mount_nfs_root()) {
-                       sys_chdir("/root");
-                       ROOT_DEV = current->fs->pwdmnt->mnt_sb->s_dev;
-                       printk("VFS: Mounted root (nfs filesystem).\n");
-                       return;
-               }
-               printk(KERN_ERR "VFS: Unable to mount root fs via NFS, trying floppy.\n");
-               ROOT_DEV = MKDEV(FLOPPY_MAJOR, 0);
-       }
-#endif
-printk("root_device_name = %s\n",root_device_name);
-       devfs_make_root(root_device_name);
-       create_dev("/dev/root", ROOT_DEV, root_device_name);
-#ifdef CONFIG_BLK_DEV_FD
-       if (MAJOR(ROOT_DEV) == FLOPPY_MAJOR) {
-               /* rd_doload is 2 for a dual initrd/ramload setup */
-               if (rd_doload==2) {
-                       if (rd_load_disk(1)) {
-                               ROOT_DEV = MKDEV(RAMDISK_MAJOR, 1);
-                               create_dev("/dev/root", ROOT_DEV, NULL);
-                       }
-               } else
-                       change_floppy("root floppy");
-       }
-#endif
-       mount_block_root("/dev/root", root_mountflags);
-}
-
-#ifdef CONFIG_BLK_DEV_INITRD
-static int old_fd, root_fd;
-static int do_linuxrc(void * shell)
-{
-       static char *argv[] = { "linuxrc", NULL, };
-       extern char * envp_init[];
-
-       close(old_fd);
-       close(root_fd);
-       close(0);
-       close(1);
-       close(2);
-       setsid();
-       (void) open("/dev/console",O_RDWR,0);
-       (void) dup(0);
-       (void) dup(0);
-       return execve(shell, argv, envp_init);
-}
-
-#endif
-
-static void __init handle_initrd(void)
-{
-#ifdef CONFIG_BLK_DEV_INITRD
-       int ram0 = kdev_t_to_nr(MKDEV(RAMDISK_MAJOR,0));
-       int error;
-       int i, pid;
-
-       create_dev("/dev/root.old", ram0, NULL);
-       /* mount initrd on rootfs' /root */
-       mount_block_root("/dev/root.old", root_mountflags & ~MS_RDONLY);
-       sys_mkdir("/old", 0700);
-       root_fd = open("/", 0, 0);
-       old_fd = open("/old", 0, 0);
-       /* move initrd over / and chdir/chroot in initrd root */
-       sys_chdir("/root");
-       sys_mount(".", "/", NULL, MS_MOVE, NULL);
-       sys_chroot(".");
-       mount_devfs_fs ();
-
-       pid = kernel_thread(do_linuxrc, "/linuxrc", SIGCHLD);
-       if (pid > 0) {
-               while (pid != wait(&i))
-                       yield();
-       }
-
-       /* move initrd to rootfs' /old */
-       sys_fchdir(old_fd);
-       sys_mount("/", ".", NULL, MS_MOVE, NULL);
-       /* switch root and cwd back to / of rootfs */
-       sys_fchdir(root_fd);
-       sys_chroot(".");
-       sys_umount("/old/dev", 0);
-       close(old_fd);
-       close(root_fd);
-
-       if (real_root_dev == ram0) {
-               sys_chdir("/old");
-               return;
-       }
-
-       ROOT_DEV = real_root_dev;
-       mount_root();
-
-       printk(KERN_NOTICE "Trying to move old root to /initrd ... ");
-       error = sys_mount("/old", "/root/initrd", NULL, MS_MOVE, NULL);
-       if (!error)
-               printk("okay\n");
-       else {
-               int fd = open("/dev/root.old", O_RDWR, 0);
-               printk("failed\n");
-               printk(KERN_NOTICE "Unmounting old root\n");
-               sys_umount("/old", MNT_DETACH);
-               printk(KERN_NOTICE "Trying to free ramdisk memory ... ");
-               if (fd < 0) {
-                       error = fd;
-               } else {
-                       error = sys_ioctl(fd, BLKFLSBUF, 0);
-                       close(fd);
-               }
-               printk(!error ? "okay\n" : "failed\n");
-       }
-#endif
-}
-
-static int __init initrd_load(void)
-{
-#ifdef CONFIG_BLK_DEV_INITRD
-       create_dev("/dev/ram", MKDEV(RAMDISK_MAJOR, 0), NULL);
-       create_dev("/dev/initrd", MKDEV(RAMDISK_MAJOR, INITRD_MINOR), NULL);
-#endif
-       return rd_load_image("/dev/initrd");
-}
-
-/*
- * Prepare the namespace - decide what/where to mount, load ramdisks, etc.
- */
-void prepare_namespace(void)
-{
-       int is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;
-#ifdef CONFIG_ALL_PPC
-       extern void arch_discover_root(void);
-       arch_discover_root();
-#endif /* CONFIG_ALL_PPC */
-#ifdef CONFIG_BLK_DEV_INITRD
-       if (!initrd_start)
-               mount_initrd = 0;
-       real_root_dev = ROOT_DEV;
-#endif
-       sys_mkdir("/dev", 0700);
-       sys_mkdir("/root", 0700);
-       sys_mknod("/dev/console", S_IFCHR|0600, MKDEV(TTYAUX_MAJOR, 1));
-#ifdef CONFIG_DEVFS_FS
-       sys_mount("devfs", "/dev", "devfs", 0, NULL);
-       do_devfs = 1;
-#endif
-
-       create_dev("/dev/root", ROOT_DEV, NULL);
-       if (mount_initrd) {
-               if (initrd_load() && ROOT_DEV != MKDEV(RAMDISK_MAJOR, 0)) {
-                       handle_initrd();
-                       goto out;
-               }
-       } else if (is_floppy && rd_doload && rd_load_disk(0))
-               ROOT_DEV = MKDEV(RAMDISK_MAJOR, 0);
-       mount_root();
-out:
-       sys_umount("/dev", 0);
-       sys_mount(".", "/", NULL, MS_MOVE, NULL);
-       sys_chroot(".");
-       mount_devfs_fs ();
-}
-
-#if defined(BUILD_CRAMDISK) && defined(CONFIG_BLK_DEV_RAM)
-
-/*
- * gzip declarations
- */
-
-#define OF(args)  args
-
-#ifndef memzero
-#define memzero(s, n)     memset ((s), 0, (n))
-#endif
-
-typedef unsigned char  uch;
-typedef unsigned short ush;
-typedef unsigned long  ulg;
-
-#define INBUFSIZ 4096
-#define WSIZE 0x8000    /* window size--must be a power of two, and */
-                       /*  at least 32K for zip's deflate method */
-
-static uch *inbuf;
-static uch *window;
-
-static unsigned insize;  /* valid bytes in inbuf */
-static unsigned inptr;   /* index of next byte to be processed in inbuf */
-static unsigned outcnt;  /* bytes in output buffer */
-static int exit_code;
-static long bytes_out;
-static int crd_infd, crd_outfd;
-
-#define get_byte()  (inptr < insize ? inbuf[inptr++] : fill_inbuf())
-               
-/* Diagnostic functions (stubbed out) */
-#define Assert(cond,msg)
-#define Trace(x)
-#define Tracev(x)
-#define Tracevv(x)
-#define Tracec(c,x)
-#define Tracecv(c,x)
-
-#define STATIC static
-
-static int  fill_inbuf(void);
-static void flush_window(void);
-static void *malloc(int size);
-static void free(void *where);
-static void error(char *m);
-static void gzip_mark(void **);
-static void gzip_release(void **);
-
-#include "../lib/inflate.c"
-
-static void __init *malloc(int size)
-{
-       return kmalloc(size, GFP_KERNEL);
-}
-
-static void __init free(void *where)
-{
-       kfree(where);
-}
-
-static void __init gzip_mark(void **ptr)
-{
-}
-
-static void __init gzip_release(void **ptr)
-{
-}
-
-
-/* ===========================================================================
- * Fill the input buffer. This is called only when the buffer is empty
- * and at least one byte is really needed.
- */
-static int __init fill_inbuf(void)
-{
-       if (exit_code) return -1;
-       
-       insize = read(crd_infd, inbuf, INBUFSIZ);
-       if (insize == 0) return -1;
-
-       inptr = 1;
-
-       return inbuf[0];
-}
-
-/* ===========================================================================
- * Write the output window window[0..outcnt-1] and update crc and bytes_out.
- * (Used for the decompressed data only.)
- */
-static void __init flush_window(void)
-{
-    ulg c = crc;         /* temporary variable */
-    unsigned n;
-    uch *in, ch;
-    
-    write(crd_outfd, window, outcnt);
-    in = window;
-    for (n = 0; n < outcnt; n++) {
-           ch = *in++;
-           c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
-    }
-    crc = c;
-    bytes_out += (ulg)outcnt;
-    outcnt = 0;
-}
-
-static void __init error(char *x)
-{
-       printk(KERN_ERR "%s", x);
-       exit_code = 1;
-}
-
-static int __init crd_load(int in_fd, int out_fd)
-{
-       int result;
-
-       insize = 0;             /* valid bytes in inbuf */
-       inptr = 0;              /* index of next byte to be processed in inbuf */
-       outcnt = 0;             /* bytes in output buffer */
-       exit_code = 0;
-       bytes_out = 0;
-       crc = (ulg)0xffffffffL; /* shift register contents */
-
-       crd_infd = in_fd;
-       crd_outfd = out_fd;
-       inbuf = kmalloc(INBUFSIZ, GFP_KERNEL);
-       if (inbuf == 0) {
-               printk(KERN_ERR "RAMDISK: Couldn't allocate gzip buffer\n");
-               return -1;
-       }
-       window = kmalloc(WSIZE, GFP_KERNEL);
-       if (window == 0) {
-               printk(KERN_ERR "RAMDISK: Couldn't allocate gzip window\n");
-               kfree(inbuf);
-               return -1;
-       }
-       makecrc();
-       result = gunzip();
-       kfree(inbuf);
-       kfree(window);
-       return result;
-}
-
-#endif  /* BUILD_CRAMDISK && CONFIG_BLK_DEV_RAM */
diff --git a/xenolinux-2.4.21-sparse/kernel/panic.c b/xenolinux-2.4.21-sparse/kernel/panic.c
deleted file mode 100644 (file)
index 90a782e..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- *  linux/kernel/panic.c
- *
- *  Copyright (C) 1991, 1992  Linus Torvalds
- */
-
-/*
- * This function is used through-out the kernel (including mm and fs)
- * to indicate a major problem.
- */
-#include <linux/config.h>
-#include <linux/sched.h>
-#include <linux/delay.h>
-#include <linux/reboot.h>
-#include <linux/notifier.h>
-#include <linux/init.h>
-#include <linux/sysrq.h>
-#include <linux/interrupt.h>
-
-asmlinkage void sys_sync(void);        /* it's really int */
-
-int panic_timeout;
-
-struct notifier_block *panic_notifier_list;
-
-static int __init panic_setup(char *str)
-{
-       panic_timeout = simple_strtoul(str, NULL, 0);
-       return 1;
-}
-
-__setup("panic=", panic_setup);
-
-/**
- *     panic - halt the system
- *     @fmt: The text string to print
- *
- *     Display a message, then perform cleanups. Functions in the panic
- *     notifier list are called after the filesystem cache is flushed (when possible).
- *
- *     This function never returns.
- */
-NORET_TYPE void panic(const char * fmt, ...)
-{
-       static char buf[1024];
-       va_list args;
-#if defined(CONFIG_ARCH_S390)
-        unsigned long caller = (unsigned long) __builtin_return_address(0);
-#endif
-
-       bust_spinlocks(1);
-       va_start(args, fmt);
-       vsprintf(buf, fmt, args);
-       va_end(args);
-       printk(KERN_EMERG "Kernel panic: %s\n",buf);
-       if (in_interrupt())
-               printk(KERN_EMERG "In interrupt handler - not syncing\n");
-       else if (!current->pid)
-               printk(KERN_EMERG "In idle task - not syncing\n");
-       else
-               sys_sync();
-       bust_spinlocks(0);
-
-#ifdef CONFIG_SMP
-       smp_send_stop();
-#endif
-
-       notifier_call_chain(&panic_notifier_list, 0, NULL);
-
-       if (panic_timeout > 0)
-       {
-               /*
-                * Delay timeout seconds before rebooting the machine. 
-                * We can't use the "normal" timers since we just panicked..
-                */
-               printk(KERN_EMERG "Rebooting in %d seconds..",panic_timeout);
-               mdelay(panic_timeout*1000);
-               /*
-                *      Should we run the reboot notifier. For the moment Im
-                *      choosing not too. It might crash, be corrupt or do
-                *      more harm than good for other reasons.
-                */
-               machine_restart(NULL);
-       }
-#ifdef __sparc__
-       {
-               extern int stop_a_enabled;
-               /* Make sure the user can actually press L1-A */
-               stop_a_enabled = 1;
-               printk("Press L1-A to return to the boot prom\n");
-       }
-#endif
-#if defined(CONFIG_ARCH_S390)
-        disabled_wait(caller);
-#endif
-       sti();
-       for(;;) {
-#if defined(CONFIG_X86) && defined(CONFIG_VT) 
-               extern void panic_blink(void);
-               panic_blink(); 
-#endif
-               CHECK_EMERGENCY_SYNC
-#if defined(CONFIG_XENO)
-                HYPERVISOR_exit();
-#endif
-       }
-}
-
-/**
- *     print_tainted - return a string to represent the kernel taint state.
- *
- *     The string is overwritten by the next call to print_taint().
- */
-const char *print_tainted()
-{
-       static char buf[20];
-       if (tainted) {
-               snprintf(buf, sizeof(buf), "Tainted: %c%c",
-                       tainted & 1 ? 'P' : 'G',
-                       tainted & 2 ? 'F' : ' ');
-       }
-       else
-               snprintf(buf, sizeof(buf), "Not tainted");
-       return(buf);
-}
-
-int tainted = 0;
-
-/*
- * A BUG() call in an inline function in a header should be avoided,
- * because it can seriously bloat the kernel.  So here we have
- * helper functions.
- * We lose the BUG()-time file-and-line info this way, but it's
- * usually not very useful from an inline anyway.  The backtrace
- * tells us what we want to know.
- */
-
-void __out_of_line_bug(int line)
-{
-       printk("kernel BUG in header file at line %d\n", line);
-
-       BUG();
-
-       /* Satisfy __attribute__((noreturn)) */
-       for ( ; ; )
-               ;
-}
diff --git a/xenolinux-2.4.21-sparse/kernel/printk.c b/xenolinux-2.4.21-sparse/kernel/printk.c
deleted file mode 100644 (file)
index 46f16f3..0000000
+++ /dev/null
@@ -1,691 +0,0 @@
-/*
- *  linux/kernel/printk.c
- *
- *  Copyright (C) 1991, 1992  Linus Torvalds
- *
- * Modified to make sys_syslog() more flexible: added commands to
- * return the last 4k of kernel messages, regardless of whether
- * they've been read or not.  Added option to suppress kernel printk's
- * to the console.  Added hook for sending the console messages
- * elsewhere, in preparation for a serial line console (someday).
- * Ted Ts'o, 2/11/93.
- * Modified for sysctl support, 1/8/97, Chris Horn.
- * Fixed SMP synchronization, 08/08/99, Manfred Spraul 
- *     manfreds@colorfullife.com
- * Rewrote bits to get rid of console_lock
- *     01Mar01 Andrew Morton <andrewm@uow.edu.au>
- */
-
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/tty.h>
-#include <linux/tty_driver.h>
-#include <linux/smp_lock.h>
-#include <linux/console.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/interrupt.h>                   /* For in_interrupt() */
-#include <linux/config.h>
-
-#include <asm/uaccess.h>
-
-#if defined(CONFIG_MULTIQUAD) || defined(CONFIG_IA64)
-#define LOG_BUF_LEN    (65536)
-#elif defined(CONFIG_ARCH_S390)
-#define LOG_BUF_LEN    (131072)
-#elif defined(CONFIG_SMP)
-#define LOG_BUF_LEN    (32768)
-#else  
-#define LOG_BUF_LEN    (16384)                 /* This must be a power of two */
-#endif
-
-#define LOG_BUF_MASK   (LOG_BUF_LEN-1)
-
-#ifndef arch_consoles_callable
-#define arch_consoles_callable() (1)
-#endif
-
-/* printk's without a loglevel use this.. */
-#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */
-
-/* We show everything that is MORE important than this.. */
-#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
-#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */
-
-DECLARE_WAIT_QUEUE_HEAD(log_wait);
-
-int console_printk[4] = {
-       DEFAULT_CONSOLE_LOGLEVEL,       /* console_loglevel */
-       DEFAULT_MESSAGE_LOGLEVEL,       /* default_message_loglevel */
-       MINIMUM_CONSOLE_LOGLEVEL,       /* minimum_console_loglevel */
-       DEFAULT_CONSOLE_LOGLEVEL,       /* default_console_loglevel */
-};
-
-int oops_in_progress;
-
-/*
- * console_sem protects the console_drivers list, and also
- * provides serialisation for access to the entire console
- * driver system.
- */
-static DECLARE_MUTEX(console_sem);
-struct console *console_drivers;
-
-/*
- * logbuf_lock protects log_buf, log_start, log_end, con_start and logged_chars
- * It is also used in interesting ways to provide interlocking in
- * release_console_sem().
- */
-static spinlock_t logbuf_lock = SPIN_LOCK_UNLOCKED;
-
-static char log_buf[LOG_BUF_LEN];
-#define LOG_BUF(idx) (log_buf[(idx) & LOG_BUF_MASK])
-
-/*
- * The indices into log_buf are not constrained to LOG_BUF_LEN - they
- * must be masked before subscripting
- */
-static unsigned long log_start;                        /* Index into log_buf: next char to be read by syslog() */
-static unsigned long con_start;                        /* Index into log_buf: next char to be sent to consoles */
-static unsigned long log_end;                  /* Index into log_buf: most-recently-written-char + 1 */
-static unsigned long logged_chars;             /* Number of chars produced since last read+clear operation */
-
-struct console_cmdline console_cmdline[MAX_CMDLINECONSOLES];
-static int preferred_console = -1;
-
-/* Flag: console code may call schedule() */
-static int console_may_schedule;
-
-/*
- *     Setup a list of consoles. Called from init/main.c
- */
-static int __init console_setup(char *str)
-{
-       struct console_cmdline *c;
-       char name[sizeof(c->name)];
-       char *s, *options;
-       int i, idx;
-
-       /*
-        *      Decode str into name, index, options.
-        */
-       if (str[0] >= '0' && str[0] <= '9') {
-               strcpy(name, "ttyS");
-               strncpy(name + 4, str, sizeof(name) - 5);
-       } else
-               strncpy(name, str, sizeof(name) - 1);
-       name[sizeof(name) - 1] = 0;
-       if ((options = strchr(str, ',')) != NULL)
-               *(options++) = 0;
-#ifdef __sparc__
-       if (!strcmp(str, "ttya"))
-               strcpy(name, "ttyS0");
-       if (!strcmp(str, "ttyb"))
-               strcpy(name, "ttyS1");
-#endif
-       for(s = name; *s; s++)
-               if (*s >= '0' && *s <= '9')
-                       break;
-       idx = simple_strtoul(s, NULL, 10);
-       *s = 0;
-
-       /*
-        *      See if this tty is not yet registered, and
-        *      if we have a slot free.
-        */
-       for(i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
-               if (strcmp(console_cmdline[i].name, name) == 0 &&
-                         console_cmdline[i].index == idx) {
-                               preferred_console = i;
-                               return 1;
-               }
-       if (i == MAX_CMDLINECONSOLES)
-               return 1;
-       preferred_console = i;
-       c = &console_cmdline[i];
-       memcpy(c->name, name, sizeof(c->name));
-       c->options = options;
-       c->index = idx;
-       return 1;
-}
-
-__setup("console=", console_setup);
-
-/*
- * Commands to do_syslog:
- *
- *     0 -- Close the log.  Currently a NOP.
- *     1 -- Open the log. Currently a NOP.
- *     2 -- Read from the log.
- *     3 -- Read all messages remaining in the ring buffer.
- *     4 -- Read and clear all messages remaining in the ring buffer
- *     5 -- Clear ring buffer.
- *     6 -- Disable printk's to console
- *     7 -- Enable printk's to console
- *     8 -- Set level of messages printed to console
- *     9 -- Return number of unread characters in the log buffer
- */
-int do_syslog(int type, char * buf, int len)
-{
-       unsigned long i, j, limit, count;
-       int do_clear = 0;
-       char c;
-       int error = 0;
-
-       switch (type) {
-       case 0:         /* Close log */
-               break;
-       case 1:         /* Open log */
-               break;
-       case 2:         /* Read from log */
-               error = -EINVAL;
-               if (!buf || len < 0)
-                       goto out;
-               error = 0;
-               if (!len)
-                       goto out;
-               error = verify_area(VERIFY_WRITE,buf,len);
-               if (error)
-                       goto out;
-               error = wait_event_interruptible(log_wait, (log_start - log_end));
-               if (error)
-                       goto out;
-               i = 0;
-               spin_lock_irq(&logbuf_lock);
-               while ((log_start != log_end) && i < len) {
-                       c = LOG_BUF(log_start);
-                       log_start++;
-                       spin_unlock_irq(&logbuf_lock);
-                       __put_user(c,buf);
-                       buf++;
-                       i++;
-                       spin_lock_irq(&logbuf_lock);
-               }
-               spin_unlock_irq(&logbuf_lock);
-               error = i;
-               break;
-       case 4:         /* Read/clear last kernel messages */
-               do_clear = 1; 
-               /* FALL THRU */
-       case 3:         /* Read last kernel messages */
-               error = -EINVAL;
-               if (!buf || len < 0)
-                       goto out;
-               error = 0;
-               if (!len)
-                       goto out;
-               error = verify_area(VERIFY_WRITE,buf,len);
-               if (error)
-                       goto out;
-               count = len;
-               if (count > LOG_BUF_LEN)
-                       count = LOG_BUF_LEN;
-               spin_lock_irq(&logbuf_lock);
-               if (count > logged_chars)
-                       count = logged_chars;
-               if (do_clear)
-                       logged_chars = 0;
-               limit = log_end;
-               /*
-                * __put_user() could sleep, and while we sleep
-                * printk() could overwrite the messages 
-                * we try to copy to user space. Therefore
-                * the messages are copied in reverse. <manfreds>
-                */
-               for(i=0;i < count;i++) {
-                       j = limit-1-i;
-                       if (j+LOG_BUF_LEN < log_end)
-                               break;
-                       c = LOG_BUF(j);
-                       spin_unlock_irq(&logbuf_lock);
-                       __put_user(c,&buf[count-1-i]);
-                       spin_lock_irq(&logbuf_lock);
-               }
-               spin_unlock_irq(&logbuf_lock);
-               error = i;
-               if(i != count) {
-                       int offset = count-error;
-                       /* buffer overflow during copy, correct user buffer. */
-                       for(i=0;i<error;i++) {
-                               __get_user(c,&buf[i+offset]);
-                               __put_user(c,&buf[i]);
-                       }
-               }
-
-               break;
-       case 5:         /* Clear ring buffer */
-               spin_lock_irq(&logbuf_lock);
-               logged_chars = 0;
-               spin_unlock_irq(&logbuf_lock);
-               break;
-       case 6:         /* Disable logging to console */
-               spin_lock_irq(&logbuf_lock);
-               console_loglevel = minimum_console_loglevel;
-               spin_unlock_irq(&logbuf_lock);
-               break;
-       case 7:         /* Enable logging to console */
-               spin_lock_irq(&logbuf_lock);
-               console_loglevel = default_console_loglevel;
-               spin_unlock_irq(&logbuf_lock);
-               break;
-       case 8:         /* Set level of messages printed to console */
-               error = -EINVAL;
-               if (len < 1 || len > 8)
-                       goto out;
-               if (len < minimum_console_loglevel)
-                       len = minimum_console_loglevel;
-               spin_lock_irq(&logbuf_lock);
-               console_loglevel = len;
-               spin_unlock_irq(&logbuf_lock);
-               error = 0;
-               break;
-       case 9:         /* Number of chars in the log buffer */
-               spin_lock_irq(&logbuf_lock);
-               error = log_end - log_start;
-               spin_unlock_irq(&logbuf_lock);
-               break;
-       default:
-               error = -EINVAL;
-               break;
-       }
-out:
-       return error;
-}
-
-asmlinkage long sys_syslog(int type, char * buf, int len)
-{
-       if ((type != 3) && !capable(CAP_SYS_ADMIN))
-               return -EPERM;
-       return do_syslog(type, buf, len);
-}
-
-/*
- * Call the console drivers on a range of log_buf
- */
-static void __call_console_drivers(unsigned long start, unsigned long end)
-{
-       struct console *con;
-
-       for (con = console_drivers; con; con = con->next) {
-               if ((con->flags & CON_ENABLED) && con->write)
-                       con->write(con, &LOG_BUF(start), end - start);
-       }
-}
-
-/*
- * Write out chars from start to end - 1 inclusive
- */
-static void _call_console_drivers(unsigned long start, unsigned long end, int msg_log_level)
-{
-       if (msg_log_level < console_loglevel && console_drivers && start != end) {
-               if ((start & LOG_BUF_MASK) > (end & LOG_BUF_MASK)) {
-                       /* wrapped write */
-                       __call_console_drivers(start & LOG_BUF_MASK, LOG_BUF_LEN);
-                       __call_console_drivers(0, end & LOG_BUF_MASK);
-               } else {
-                       __call_console_drivers(start, end);
-               }
-       }
-}
-
-/*
- * Call the console drivers, asking them to write out
- * log_buf[start] to log_buf[end - 1].
- * The console_sem must be held.
- */
-static void call_console_drivers(unsigned long start, unsigned long end)
-{
-       unsigned long cur_index, start_print;
-       static int msg_level = -1;
-
-       if (((long)(start - end)) > 0)
-               BUG();
-
-       cur_index = start;
-       start_print = start;
-       while (cur_index != end) {
-               if (    msg_level < 0 &&
-                       ((end - cur_index) > 2) &&
-                       LOG_BUF(cur_index + 0) == '<' &&
-                       LOG_BUF(cur_index + 1) >= '0' &&
-                       LOG_BUF(cur_index + 1) <= '7' &&
-                       LOG_BUF(cur_index + 2) == '>')
-               {
-                       msg_level = LOG_BUF(cur_index + 1) - '0';
-                       cur_index += 3;
-                       start_print = cur_index;
-               }
-               while (cur_index != end) {
-                       char c = LOG_BUF(cur_index);
-                       cur_index++;
-
-                       if (c == '\n') {
-                               if (msg_level < 0) {
-                                       /*
-                                        * printk() has already given us loglevel tags in
-                                        * the buffer.  This code is here in case the
-                                        * log buffer has wrapped right round and scribbled
-                                        * on those tags
-                                        */
-                                       msg_level = default_message_loglevel;
-                               }
-                               _call_console_drivers(start_print, cur_index, msg_level);
-                               msg_level = -1;
-                               start_print = cur_index;
-                               break;
-                       }
-               }
-       }
-       _call_console_drivers(start_print, end, msg_level);
-}
-
-static void emit_log_char(char c)
-{
-       LOG_BUF(log_end) = c;
-       log_end++;
-       if (log_end - log_start > LOG_BUF_LEN)
-               log_start = log_end - LOG_BUF_LEN;
-       if (log_end - con_start > LOG_BUF_LEN)
-               con_start = log_end - LOG_BUF_LEN;
-       if (logged_chars < LOG_BUF_LEN)
-               logged_chars++;
-}
-
-/*
- * This is printk.  It can be called from any context.  We want it to work.
- * 
- * We try to grab the console_sem.  If we succeed, it's easy - we log the output and
- * call the console drivers.  If we fail to get the semaphore we place the output
- * into the log buffer and return.  The current holder of the console_sem will
- * notice the new output in release_console_sem() and will send it to the
- * consoles before releasing the semaphore.
- *
- * One effect of this deferred printing is that code which calls printk() and
- * then changes console_loglevel may break. This is because console_loglevel
- * is inspected when the actual printing occurs.
- */
-asmlinkage int printk(const char *fmt, ...)
-{
-       va_list args;
-       unsigned long flags;
-       int printed_len;
-       char *p;
-       static char printk_buf[1024];
-       static int log_level_unknown = 1;
-
-       if (oops_in_progress) {
-               /* If a crash is occurring, make sure we can't deadlock */
-               spin_lock_init(&logbuf_lock);
-               /* And make sure that we print immediately */
-               init_MUTEX(&console_sem);
-       }
-
-       /* This stops the holder of console_sem just where we want him */
-       spin_lock_irqsave(&logbuf_lock, flags);
-
-       /* Emit the output into the temporary buffer */
-       va_start(args, fmt);
-       printed_len = vsnprintf(printk_buf, sizeof(printk_buf), fmt, args);
-       va_end(args);
-
-#if 0
-// Useful Hack if things are going wrong very early in the day
-(void)HYPERVISOR_console_write(printk_buf, sizeof(printk_buf));
-#endif
-       /*
-        * Copy the output into log_buf.  If the caller didn't provide
-        * appropriate log level tags, we insert them here
-        */
-       for (p = printk_buf; *p; p++) {
-               if (log_level_unknown) {
-                       if (p[0] != '<' || p[1] < '0' || p[1] > '7' || p[2] != '>') {
-                               emit_log_char('<');
-                               emit_log_char(default_message_loglevel + '0');
-                               emit_log_char('>');
-                       }
-                       log_level_unknown = 0;
-               }
-               emit_log_char(*p);
-               if (*p == '\n')
-                       log_level_unknown = 1;
-       }
-
-       if (!arch_consoles_callable()) {
-               /*
-                * On some architectures, the consoles are not usable
-                * on secondary CPUs early in the boot process.
-                */
-               spin_unlock_irqrestore(&logbuf_lock, flags);
-               goto out;
-       }
-       if (!down_trylock(&console_sem)) {
-               /*
-                * We own the drivers.  We can drop the spinlock and let
-                * release_console_sem() print the text
-                */
-               spin_unlock_irqrestore(&logbuf_lock, flags);
-               console_may_schedule = 0;
-               release_console_sem();
-       } else {
-               /*
-                * Someone else owns the drivers.  We drop the spinlock, which
-                * allows the semaphore holder to proceed and to call the
-                * console drivers with the output which we just produced.
-                */
-               spin_unlock_irqrestore(&logbuf_lock, flags);
-       }
-out:
-       return printed_len;
-}
-EXPORT_SYMBOL(printk);
-
-/**
- * acquire_console_sem - lock the console system for exclusive use.
- *
- * Acquires a semaphore which guarantees that the caller has
- * exclusive access to the console system and the console_drivers list.
- *
- * Can sleep, returns nothing.
- */
-void acquire_console_sem(void)
-{
-       if (in_interrupt())
-               BUG();
-       down(&console_sem);
-       console_may_schedule = 1;
-}
-EXPORT_SYMBOL(acquire_console_sem);
-
-/**
- * release_console_sem - unlock the console system
- *
- * Releases the semaphore which the caller holds on the console system
- * and the console driver list.
- *
- * While the semaphore was held, console output may have been buffered
- * by printk().  If this is the case, release_console_sem() emits
- * the output prior to releasing the semaphore.
- *
- * If there is output waiting for klogd, we wake it up.
- *
- * release_console_sem() may be called from any context.
- */
-void release_console_sem(void)
-{
-       unsigned long flags;
-       unsigned long _con_start, _log_end;
-       unsigned long must_wake_klogd = 0;
-
-       for ( ; ; ) {
-               spin_lock_irqsave(&logbuf_lock, flags);
-               must_wake_klogd |= log_start - log_end;
-               if (con_start == log_end)
-                       break;                  /* Nothing to print */
-               _con_start = con_start;
-               _log_end = log_end;
-               con_start = log_end;            /* Flush */
-               spin_unlock_irqrestore(&logbuf_lock, flags);
-               call_console_drivers(_con_start, _log_end);
-       }
-       console_may_schedule = 0;
-       up(&console_sem);
-       spin_unlock_irqrestore(&logbuf_lock, flags);
-       if (must_wake_klogd && !oops_in_progress)
-               wake_up_interruptible(&log_wait);
-}
-
-/** console_conditional_schedule - yield the CPU if required
- *
- * If the console code is currently allowed to sleep, and
- * if this CPU should yield the CPU to another task, do
- * so here.
- *
- * Must be called within acquire_console_sem().
- */
-void console_conditional_schedule(void)
-{
-       if (console_may_schedule && current->need_resched) {
-               set_current_state(TASK_RUNNING);
-               schedule();
-       }
-}
-
-void console_print(const char *s)
-{
-       printk(KERN_EMERG "%s", s);
-}
-EXPORT_SYMBOL(console_print);
-
-void console_unblank(void)
-{
-       struct console *c;
-
-       acquire_console_sem();
-       for (c = console_drivers; c != NULL; c = c->next)
-               if ((c->flags & CON_ENABLED) && c->unblank)
-                       c->unblank();
-       release_console_sem();
-}
-EXPORT_SYMBOL(console_unblank);
-
-/*
- * The console driver calls this routine during kernel initialization
- * to register the console printing procedure with printk() and to
- * print any messages that were printed by the kernel before the
- * console driver was initialized.
- */
-void register_console(struct console * console)
-{
-       int     i;
-       unsigned long flags;
-
-       /*
-        *      See if we want to use this console driver. If we
-        *      didn't select a console we take the first one
-        *      that registers here.
-        */
-       if (preferred_console < 0) {
-               if (console->index < 0)
-                       console->index = 0;
-               if (console->setup == NULL ||
-                   console->setup(console, NULL) == 0) {
-                       console->flags |= CON_ENABLED | CON_CONSDEV;
-                       preferred_console = 0;
-               }
-       }
-
-       /*
-        *      See if this console matches one we selected on
-        *      the command line.
-        */
-       for(i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++) {
-               if (strcmp(console_cmdline[i].name, console->name) != 0)
-                       continue;
-               if (console->index >= 0 &&
-                   console->index != console_cmdline[i].index)
-                       continue;
-               if (console->index < 0)
-                       console->index = console_cmdline[i].index;
-               if (console->setup &&
-                   console->setup(console, console_cmdline[i].options) != 0)
-                       break;
-               console->flags |= CON_ENABLED;
-               console->index = console_cmdline[i].index;
-               if (i == preferred_console)
-                       console->flags |= CON_CONSDEV;
-               break;
-       }
-
-       if (!(console->flags & CON_ENABLED))
-               return;
-
-       /*
-        *      Put this console in the list - keep the
-        *      preferred driver at the head of the list.
-        */
-       acquire_console_sem();
-       if ((console->flags & CON_CONSDEV) || console_drivers == NULL) {
-               console->next = console_drivers;
-               console_drivers = console;
-       } else {
-               console->next = console_drivers->next;
-               console_drivers->next = console;
-       }
-       if (console->flags & CON_PRINTBUFFER) {
-               /*
-                * release_console_sem() will print out the buffered messages for us.
-                */
-               spin_lock_irqsave(&logbuf_lock, flags);
-               con_start = log_start;
-               spin_unlock_irqrestore(&logbuf_lock, flags);
-       }
-       release_console_sem();
-}
-EXPORT_SYMBOL(register_console);
-
-int unregister_console(struct console * console)
-{
-        struct console *a,*b;
-       int res = 1;
-
-       acquire_console_sem();
-       if (console_drivers == console) {
-               console_drivers=console->next;
-               res = 0;
-       } else {
-               for (a=console_drivers->next, b=console_drivers ;
-                    a; b=a, a=b->next) {
-                       if (a == console) {
-                               b->next = a->next;
-                               res = 0;
-                               break;
-                       }  
-               }
-       }
-       
-       /* If last console is removed, we re-enable picking the first
-        * one that gets registered. Without that, pmac early boot console
-        * would prevent fbcon from taking over.
-        */
-       if (console_drivers == NULL)
-               preferred_console = -1;
-               
-
-       release_console_sem();
-       return res;
-}
-EXPORT_SYMBOL(unregister_console);
-       
-/**
- * tty_write_message - write a message to a certain tty, not just the console.
- *
- * This is used for messages that need to be redirected to a specific tty.
- * We don't put it into the syslog queue right now maybe in the future if
- * really needed.
- */
-void tty_write_message(struct tty_struct *tty, char *msg)
-{
-       if (tty && tty->driver.write)
-               tty->driver.write(tty, 0, msg, strlen(msg));
-       return;
-}
diff --git a/xenolinux-2.4.21-sparse/lndir-rel b/xenolinux-2.4.21-sparse/lndir-rel
deleted file mode 100755 (executable)
index d0bd863..0000000
Binary files a/xenolinux-2.4.21-sparse/lndir-rel and /dev/null differ
diff --git a/xenolinux-2.4.21-sparse/mkbuildtree b/xenolinux-2.4.21-sparse/mkbuildtree
deleted file mode 100755 (executable)
index 0d5581a..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-#!/bin/sh
-
-# mkbuildtree <build tree>
-#
-# Creates symbolic links in <build tree> for the sparse tree
-# in the current directory.
-
-# Script to determine the relative path between two directories.
-# Copyright (c) D. J. Hawkey Jr. 2002
-# Fixed for Xen project by K. Fraser in 2003.  
-abs_to_rel ()
-{
-       local CWD SRCPATH
-                
-       if [ "$1" != "/" -a "${1##*[^/]}" = "/" ]; then
-               SRCPATH=${1%?}
-       else
-               SRCPATH=$1
-       fi
-       if [ "$2" != "/" -a "${2##*[^/]}" = "/" ]; then
-               DESTPATH=${2%?}
-       else
-               DESTPATH=$2
-       fi
-
-       CWD=$PWD
-       [ "${1%%[^/]*}" != "/" ] && cd $1 && SRCPATH=$PWD
-       [ "${2%%[^/]*}" != "/" ] && cd $2 && DESTPATH=$PWD
-       [ "$CWD" != "$PWD" ] && cd $CWD
-
-       BASEPATH=$SRCPATH
-
-       [ "$SRCPATH" = "$DESTPATH" ] && DESTPATH="." && return
-       [ "$SRCPATH" = "/" ] && DESTPATH=${DESTPATH#?} && return
-
-       while [ "$BASEPATH/" != "${DESTPATH%${DESTPATH#$BASEPATH/}}" ]; do
-          BASEPATH=${BASEPATH%/*}
-       done
-
-       SRCPATH=${SRCPATH#$BASEPATH}
-        DESTPATH=${DESTPATH#$BASEPATH}
-        DESTPATH=${DESTPATH#?}
-       while [ -n "$SRCPATH" ]; do
-               SRCPATH=${SRCPATH%/*}
-               DESTPATH="../$DESTPATH"
-       done
-
-       [ -z "$BASEPATH" ] && BASEPATH="/"
-       [ "${DESTPATH##*[^/]}" = "/" ] && DESTPATH=${DESTPATH%?}
-}
-
-
-[ "$1" == "" ] && { echo "Syntax: $0 <linux tree to xenify>"; exit 1; }
-
-# Get absolute path to the destination directory
-pushd . >/dev/null
-cd ${1}
-AD=`pwd`
-popd >/dev/null
-
-# Get absolute path to the source directory
-AS=`pwd`
-
-# Get path to source, relative to destination
-abs_to_rel ${AD} ${AS}
-RS=$DESTPATH
-
-# Remove old copies of files and directories at the destination
-for i in `find . -type f -o -type l` ; do rm -f ${AD}/${i#./} ; done
-
-# We now work from the destination directory
-cd ${AD}
-
-# Create symlinks of files and directories which exist in the sparse source
-${AS}/lndir-rel -silent ${RS}
-rm -f mkbuildtree lndir-rel
-
-## There are a whole bunch of special symlinks, mostly for files
-## which are identical in the i386 and xeno-i386 architecture-dependent
-## subdirectories.
-
-# This first symlink is special: it links to shared files in Xen's source tree
-rm -rf ${AD}/include/asm-xeno/hypervisor-ifs
-mkdir  ${AD}/include/asm-xeno/hypervisor-ifs
-cd     ${AD}/include/asm-xeno/hypervisor-ifs
-${AS}/lndir-rel -silent ../../../${RS}/../xen/include/hypervisor-ifs
-
-# The remainder are the i386 -> xeno-i386 links
-cd ..
-ln -sf ../asm-i386/a.out.h 
-ln -sf ../asm-i386/apicdef.h 
-ln -sf ../asm-i386/apic.h 
-ln -sf ../asm-i386/atomic.h 
-ln -sf ../asm-i386/bitops.h 
-ln -sf ../asm-i386/boot.h 
-ln -sf ../asm-i386/byteorder.h 
-ln -sf ../asm-i386/cache.h 
-ln -sf ../asm-i386/checksum.h 
-ln -sf ../asm-i386/cpufeature.h 
-ln -sf ../asm-i386/current.h 
-ln -sf ../asm-i386/debugreg.h 
-ln -sf ../asm-i386/delay.h 
-ln -sf ../asm-i386/div64.h 
-ln -sf ../asm-i386/dma.h 
-ln -sf ../asm-i386/elf.h 
-ln -sf ../asm-i386/errno.h 
-ln -sf ../asm-i386/fcntl.h 
-ln -sf ../asm-i386/floppy.h 
-ln -sf ../asm-i386/hardirq.h 
-ln -sf ../asm-i386/hdreg.h 
-ln -sf ../asm-i386/i387.h 
-ln -sf ../asm-i386/ide.h 
-ln -sf ../asm-i386/init.h 
-ln -sf ../asm-i386/io.h
-ln -sf ../asm-i386/io_apic.h
-ln -sf ../asm-i386/ioctl.h
-ln -sf ../asm-i386/ioctls.h
-ln -sf ../asm-i386/ipcbuf.h
-ln -sf ../asm-i386/ipc.h 
-ln -sf ../asm-i386/kmap_types.h
-ln -sf ../asm-i386/ldt.h 
-ln -sf ../asm-i386/linux_logo.h
-ln -sf ../asm-i386/locks.h 
-ln -sf ../asm-i386/math_emu.h
-ln -sf ../asm-i386/mc146818rtc.h
-ln -sf ../asm-i386/mca_dma.h 
-ln -sf ../asm-i386/mman.h 
-ln -sf ../asm-i386/mmu.h 
-ln -sf ../asm-i386/mmx.h 
-ln -sf ../asm-i386/module.h 
-ln -sf ../asm-i386/mpspec.h 
-ln -sf ../asm-i386/msgbuf.h 
-ln -sf ../asm-i386/msr.h 
-ln -sf ../asm-i386/mtrr.h 
-ln -sf ../asm-i386/namei.h 
-ln -sf ../asm-i386/param.h 
-ln -sf ../asm-i386/parport.h 
-ln -sf ../asm-i386/pgtable-3level.h 
-ln -sf ../asm-i386/poll.h 
-ln -sf ../asm-i386/posix_types.h 
-ln -sf ../asm-i386/resource.h 
-ln -sf ../asm-i386/rwlock.h 
-ln -sf ../asm-i386/rwsem.h 
-ln -sf ../asm-i386/scatterlist.h
-ln -sf ../asm-i386/semaphore.h 
-ln -sf ../asm-i386/sembuf.h 
-ln -sf ../asm-i386/serial.h 
-ln -sf ../asm-i386/setup.h 
-ln -sf ../asm-i386/shmbuf.h 
-ln -sf ../asm-i386/shmparam.h 
-ln -sf ../asm-i386/sigcontext.h 
-ln -sf ../asm-i386/siginfo.h 
-ln -sf ../asm-i386/signal.h 
-ln -sf ../asm-i386/smplock.h 
-ln -sf ../asm-i386/socket.h 
-ln -sf ../asm-i386/sockios.h 
-ln -sf ../asm-i386/softirq.h 
-ln -sf ../asm-i386/spinlock.h 
-ln -sf ../asm-i386/statfs.h 
-ln -sf ../asm-i386/stat.h 
-ln -sf ../asm-i386/string-486.h 
-ln -sf ../asm-i386/string.h 
-ln -sf ../asm-i386/termbits.h 
-ln -sf ../asm-i386/termios.h 
-ln -sf ../asm-i386/timex.h 
-ln -sf ../asm-i386/tlb.h 
-ln -sf ../asm-i386/types.h 
-ln -sf ../asm-i386/uaccess.h 
-ln -sf ../asm-i386/ucontext.h 
-ln -sf ../asm-i386/unaligned.h
-ln -sf ../asm-i386/unistd.h 
-ln -sf ../asm-i386/user.h 
-ln -sf ../asm-i386/xor.h 
-
-cd ../../arch/xeno/kernel
-ln -sf ../../i386/kernel/i387.c
-ln -sf ../../i386/kernel/init_task.c
-ln -sf ../../i386/kernel/ptrace.c
-ln -sf ../../i386/kernel/semaphore.c 
-ln -sf ../../i386/kernel/sys_i386.c 
-cd ../lib
-ln -sf ../../i386/lib/checksum.S 
-ln -sf ../../i386/lib/dec_and_lock.c 
-ln -sf ../../i386/lib/getuser.S 
-ln -sf ../../i386/lib/iodebug.c 
-ln -sf ../../i386/lib/memcpy.c 
-ln -sf ../../i386/lib/mmx.c
-ln -sf ../../i386/lib/old-checksum.c 
-ln -sf ../../i386/lib/strstr.c 
-ln -sf ../../i386/lib/usercopy.c 
-cd ../mm
-ln -sf ../../i386/mm/extable.c 
-ln -sf ../../i386/mm/pageattr.c 
diff --git a/xenolinux-2.4.21-sparse/mm/memory.c b/xenolinux-2.4.21-sparse/mm/memory.c
deleted file mode 100644 (file)
index f06ad4b..0000000
+++ /dev/null
@@ -1,1511 +0,0 @@
-/*
- *  linux/mm/memory.c
- *
- *  Copyright (C) 1991, 1992, 1993, 1994  Linus Torvalds
- */
-
-/*
- * demand-loading started 01.12.91 - seems it is high on the list of
- * things wanted, and it should be easy to implement. - Linus
- */
-
-/*
- * Ok, demand-loading was easy, shared pages a little bit tricker. Shared
- * pages started 02.12.91, seems to work. - Linus.
- *
- * Tested sharing by executing about 30 /bin/sh: under the old kernel it
- * would have taken more than the 6M I have free, but it worked well as
- * far as I could see.
- *
- * Also corrected some "invalidate()"s - I wasn't doing enough of them.
- */
-
-/*
- * Real VM (paging to/from disk) started 18.12.91. Much more work and
- * thought has to go into this. Oh, well..
- * 19.12.91  -  works, somewhat. Sometimes I get faults, don't know why.
- *             Found it. Everything seems to work now.
- * 20.12.91  -  Ok, making the swap-device changeable like the root.
- */
-
-/*
- * 05.04.94  -  Multi-page memory management added for v1.1.
- *             Idea by Alex Bligh (alex@cconcepts.co.uk)
- *
- * 16.07.99  -  Support of BIGMEM added by Gerhard Wichert, Siemens AG
- *             (Gerhard.Wichert@pdb.siemens.de)
- */
-
-#include <linux/mm.h>
-#include <linux/mman.h>
-#include <linux/swap.h>
-#include <linux/smp_lock.h>
-#include <linux/swapctl.h>
-#include <linux/iobuf.h>
-#include <linux/highmem.h>
-#include <linux/pagemap.h>
-#include <linux/module.h>
-
-#include <asm/pgalloc.h>
-#include <asm/uaccess.h>
-#include <asm/tlb.h>
-
-unsigned long max_mapnr;
-unsigned long num_physpages;
-unsigned long num_mappedpages;
-void * high_memory;
-struct page *highmem_start_page;
-
-/*
- * We special-case the C-O-W ZERO_PAGE, because it's such
- * a common occurrence (no need to read the page to know
- * that it's zero - better for the cache and memory subsystem).
- */
-static inline void copy_cow_page(struct page * from, struct page * to, unsigned long address)
-{
-       if (from == ZERO_PAGE(address)) {
-               clear_user_highpage(to, address);
-               return;
-       }
-       copy_user_highpage(to, from, address);
-}
-
-mem_map_t * mem_map;
-
-/*
- * Called by TLB shootdown 
- */
-void __free_pte(pte_t pte)
-{
-       struct page *page = pte_page(pte);
-       if ((!VALID_PAGE(page)) || PageReserved(page))
-               return;
-       if (pte_dirty(pte))
-               set_page_dirty(page);           
-       free_page_and_swap_cache(page);
-}
-
-
-/*
- * Note: this doesn't free the actual pages themselves. That
- * has been handled earlier when unmapping all the memory regions.
- */
-static inline void free_one_pmd(pmd_t * dir)
-{
-       pte_t * pte;
-
-       if (pmd_none(*dir))
-               return;
-       if (pmd_bad(*dir)) {
-               pmd_ERROR(*dir);
-               pmd_clear(dir);
-               return;
-       }
-       pte = pte_offset(dir, 0);
-       pmd_clear(dir);
-       pte_free(pte);
-}
-
-static inline void free_one_pgd(pgd_t * dir)
-{
-       int j;
-       pmd_t * pmd;
-
-       if (pgd_none(*dir))
-               return;
-       if (pgd_bad(*dir)) {
-               pgd_ERROR(*dir);
-               pgd_clear(dir);
-               return;
-       }
-       pmd = pmd_offset(dir, 0);
-       pgd_clear(dir);
-       for (j = 0; j < PTRS_PER_PMD ; j++) {
-               prefetchw(pmd+j+(PREFETCH_STRIDE/16));
-               free_one_pmd(pmd+j);
-       }
-       pmd_free(pmd);
-}
-
-/* Low and high watermarks for page table cache.
-   The system should try to have pgt_water[0] <= cache elements <= pgt_water[1]
- */
-int pgt_cache_water[2] = { 25, 50 };
-
-/* Returns the number of pages freed */
-int check_pgt_cache(void)
-{
-       return do_check_pgt_cache(pgt_cache_water[0], pgt_cache_water[1]);
-}
-
-
-/*
- * This function clears all user-level page tables of a process - this
- * is needed by execve(), so that old pages aren't in the way.
- */
-void clear_page_tables(struct mm_struct *mm, unsigned long first, int nr)
-{
-       pgd_t * page_dir = mm->pgd;
-
-       spin_lock(&mm->page_table_lock);
-       page_dir += first;
-       do {
-               free_one_pgd(page_dir);
-               page_dir++;
-       } while (--nr);
-       XENO_flush_page_update_queue();
-       spin_unlock(&mm->page_table_lock);
-
-       /* keep the page table cache within bounds */
-       check_pgt_cache();
-}
-
-#define PTE_TABLE_MASK ((PTRS_PER_PTE-1) * sizeof(pte_t))
-#define PMD_TABLE_MASK ((PTRS_PER_PMD-1) * sizeof(pmd_t))
-
-/*
- * copy one vm_area from one task to the other. Assumes the page tables
- * already present in the new task to be cleared in the whole range
- * covered by this vma.
- *
- * 08Jan98 Merged into one routine from several inline routines to reduce
- *         variable count and make things faster. -jj
- *
- * dst->page_table_lock is held on entry and exit,
- * but may be dropped within pmd_alloc() and pte_alloc().
- */
-int copy_page_range(struct mm_struct *dst, struct mm_struct *src,
-                       struct vm_area_struct *vma)
-{
-       pgd_t * src_pgd, * dst_pgd;
-       unsigned long address = vma->vm_start;
-       unsigned long end = vma->vm_end;
-       unsigned long cow = (vma->vm_flags & (VM_SHARED | VM_MAYWRITE)) == VM_MAYWRITE;
-
-       src_pgd = pgd_offset(src, address)-1;
-       dst_pgd = pgd_offset(dst, address)-1;
-
-       for (;;) {
-               pmd_t * src_pmd, * dst_pmd;
-
-               src_pgd++; dst_pgd++;
-               
-               /* copy_pmd_range */
-               
-               if (pgd_none(*src_pgd))
-                       goto skip_copy_pmd_range;
-               if (pgd_bad(*src_pgd)) {
-                       pgd_ERROR(*src_pgd);
-                       pgd_clear(src_pgd);
-skip_copy_pmd_range:   address = (address + PGDIR_SIZE) & PGDIR_MASK;
-                       if (!address || (address >= end))
-                               goto out;
-                       continue;
-               }
-
-               src_pmd = pmd_offset(src_pgd, address);
-               dst_pmd = pmd_alloc(dst, dst_pgd, address);
-               if (!dst_pmd)
-                       goto nomem;
-
-               do {
-                       pte_t * src_pte, * dst_pte;
-               
-                       /* copy_pte_range */
-               
-                       if (pmd_none(*src_pmd))
-                               goto skip_copy_pte_range;
-                       if (pmd_bad(*src_pmd)) {
-                               pmd_ERROR(*src_pmd);
-                               pmd_clear(src_pmd);
-skip_copy_pte_range:           address = (address + PMD_SIZE) & PMD_MASK;
-                               if (address >= end)
-                                       goto out;
-                               goto cont_copy_pmd_range;
-                       }
-
-                       src_pte = pte_offset(src_pmd, address);
-                       dst_pte = pte_alloc(dst, dst_pmd, address);
-                       if (!dst_pte)
-                               goto nomem;
-
-                       spin_lock(&src->page_table_lock);                       
-                       do {
-                               pte_t pte = *src_pte;
-                               struct page *ptepage;
-                               
-                               /* copy_one_pte */
-
-                               if (pte_none(pte))
-                                       goto cont_copy_pte_range_noset;
-                               if (!pte_present(pte)) {
-                                       swap_duplicate(pte_to_swp_entry(pte));
-                                       goto cont_copy_pte_range;
-                               }
-                               ptepage = pte_page(pte);
-                               if ((!VALID_PAGE(ptepage)) || 
-                                   PageReserved(ptepage))
-                                       goto cont_copy_pte_range;
-
-                               /* If it's a COW mapping, write protect it both in the parent and the child */
-                               if (cow && pte_write(pte)) {
-                                       /* XENO modification: modified ordering here to avoid RaW hazard. */
-                                       pte = *src_pte;
-                                       pte = pte_wrprotect(pte);
-                                       ptep_set_wrprotect(src_pte);
-                               }
-
-                               /* If it's a shared mapping, mark it clean in the child */
-                               if (vma->vm_flags & VM_SHARED)
-                                       pte = pte_mkclean(pte);
-                               pte = pte_mkold(pte);
-                               get_page(ptepage);
-                               dst->rss++;
-
-cont_copy_pte_range:           set_pte(dst_pte, pte);
-cont_copy_pte_range_noset:     address += PAGE_SIZE;
-                               if (address >= end)
-                                       goto out_unlock;
-                               src_pte++;
-                               dst_pte++;
-                       } while ((unsigned long)src_pte & PTE_TABLE_MASK);
-                       spin_unlock(&src->page_table_lock);
-               
-cont_copy_pmd_range:   src_pmd++;
-                       dst_pmd++;
-               } while ((unsigned long)src_pmd & PMD_TABLE_MASK);
-       }
-out_unlock:
-       spin_unlock(&src->page_table_lock);
-out:
-       return 0;
-nomem:
-       return -ENOMEM;
-}
-
-/*
- * Return indicates whether a page was freed so caller can adjust rss
- */
-static inline void forget_pte(pte_t page)
-{
-       if (!pte_none(page)) {
-               printk("forget_pte: old mapping existed!\n");
-               BUG();
-       }
-}
-
-static inline int zap_pte_range(mmu_gather_t *tlb, pmd_t * pmd, unsigned long address, unsigned long size)
-{
-       unsigned long offset;
-       pte_t * ptep;
-       int freed = 0;
-
-       if (pmd_none(*pmd))
-               return 0;
-       if (pmd_bad(*pmd)) {
-               pmd_ERROR(*pmd);
-               pmd_clear(pmd);
-               return 0;
-       }
-       ptep = pte_offset(pmd, address);
-       offset = address & ~PMD_MASK;
-       if (offset + size > PMD_SIZE)
-               size = PMD_SIZE - offset;
-       size &= PAGE_MASK;
-       for (offset=0; offset < size; ptep++, offset += PAGE_SIZE) {
-               pte_t pte = *ptep;
-               if (pte_none(pte))
-                       continue;
-               if (pte_present(pte)) {
-                       struct page *page = pte_page(pte);
-#if defined(CONFIG_XENO_PRIV)
-                       if (pte_io(pte)) {
-                               queue_l1_entry_update(
-                                       __pa(ptep)|PGREQ_UNCHECKED_UPDATE, 0);
-                               continue;
-                       }
-#endif
-                       if (VALID_PAGE(page) && !PageReserved(page))
-                               freed ++;
-                       /* This will eventually call __free_pte on the pte. */
-                       tlb_remove_page(tlb, ptep, address + offset);
-               } else {
-                       free_swap_and_cache(pte_to_swp_entry(pte));
-                       pte_clear(ptep);
-               }
-       }
-
-       return freed;
-}
-
-static inline int zap_pmd_range(mmu_gather_t *tlb, pgd_t * dir, unsigned long address, unsigned long size)
-{
-       pmd_t * pmd;
-       unsigned long end;
-       int freed;
-
-       if (pgd_none(*dir))
-               return 0;
-       if (pgd_bad(*dir)) {
-               pgd_ERROR(*dir);
-               pgd_clear(dir);
-               return 0;
-       }
-       pmd = pmd_offset(dir, address);
-       end = address + size;
-       if (end > ((address + PGDIR_SIZE) & PGDIR_MASK))
-               end = ((address + PGDIR_SIZE) & PGDIR_MASK);
-       freed = 0;
-       do {
-               freed += zap_pte_range(tlb, pmd, address, end - address);
-               address = (address + PMD_SIZE) & PMD_MASK; 
-               pmd++;
-       } while (address < end);
-       return freed;
-}
-
-/*
- * remove user pages in a given range.
- */
-void zap_page_range(struct mm_struct *mm, unsigned long address, unsigned long size)
-{
-       mmu_gather_t *tlb;
-       pgd_t * dir;
-       unsigned long start = address, end = address + size;
-       int freed = 0;
-
-       dir = pgd_offset(mm, address);
-
-       /*
-        * This is a long-lived spinlock. That's fine.
-        * There's no contention, because the page table
-        * lock only protects against kswapd anyway, and
-        * even if kswapd happened to be looking at this
-        * process we _want_ it to get stuck.
-        */
-       if (address >= end)
-               BUG();
-       spin_lock(&mm->page_table_lock);
-       flush_cache_range(mm, address, end);
-       tlb = tlb_gather_mmu(mm);
-
-       do {
-               freed += zap_pmd_range(tlb, dir, address, end - address);
-               address = (address + PGDIR_SIZE) & PGDIR_MASK;
-               dir++;
-       } while (address && (address < end));
-
-       /* this will flush any remaining tlb entries */
-       tlb_finish_mmu(tlb, start, end);
-
-       /*
-        * Update rss for the mm_struct (not necessarily current->mm)
-        * Notice that rss is an unsigned long.
-        */
-       if (mm->rss > freed)
-               mm->rss -= freed;
-       else
-               mm->rss = 0;
-       spin_unlock(&mm->page_table_lock);
-}
-
-/*
- * Do a quick page-table lookup for a single page. 
- */
-static struct page * follow_page(struct mm_struct *mm, unsigned long address, int write) 
-{
-       pgd_t *pgd;
-       pmd_t *pmd;
-       pte_t *ptep, pte;
-
-       pgd = pgd_offset(mm, address);
-       if (pgd_none(*pgd) || pgd_bad(*pgd))
-               goto out;
-
-       pmd = pmd_offset(pgd, address);
-       if (pmd_none(*pmd) || pmd_bad(*pmd))
-               goto out;
-
-       ptep = pte_offset(pmd, address);
-       if (!ptep)
-               goto out;
-
-       pte = *ptep;
-       if (pte_present(pte)) {
-               if (!write ||
-                   (pte_write(pte) && pte_dirty(pte)))
-                       return pte_page(pte);
-       }
-
-out:
-       return 0;
-}
-
-/* 
- * Given a physical address, is there a useful struct page pointing to
- * it?  This may become more complex in the future if we start dealing
- * with IO-aperture pages in kiobufs.
- */
-
-static inline struct page * get_page_map(struct page *page)
-{
-       if (!VALID_PAGE(page))
-               return 0;
-       return page;
-}
-
-/*
- * Please read Documentation/cachetlb.txt before using this function,
- * accessing foreign memory spaces can cause cache coherency problems.
- *
- * Accessing a VM_IO area is even more dangerous, therefore the function
- * fails if pages is != NULL and a VM_IO area is found.
- */
-int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, unsigned long start,
-               int len, int write, int force, struct page **pages, struct vm_area_struct **vmas)
-{
-       int i;
-       unsigned int flags;
-
-       /*
-        * Require read or write permissions.
-        * If 'force' is set, we only require the "MAY" flags.
-        */
-       flags = write ? (VM_WRITE | VM_MAYWRITE) : (VM_READ | VM_MAYREAD);
-       flags &= force ? (VM_MAYREAD | VM_MAYWRITE) : (VM_READ | VM_WRITE);
-       i = 0;
-
-       do {
-               struct vm_area_struct * vma;
-
-               vma = find_extend_vma(mm, start);
-
-               if ( !vma || (pages && vma->vm_flags & VM_IO) || !(flags & vma->vm_flags) )
-                       return i ? : -EFAULT;
-
-               spin_lock(&mm->page_table_lock);
-               do {
-                       struct page *map;
-                       while (!(map = follow_page(mm, start, write))) {
-                               spin_unlock(&mm->page_table_lock);
-                               switch (handle_mm_fault(mm, vma, start, write)) {
-                               case 1:
-                                       tsk->min_flt++;
-                                       break;
-                               case 2:
-                                       tsk->maj_flt++;
-                                       break;
-                               case 0:
-                                       if (i) return i;
-                                       return -EFAULT;
-                               default:
-                                       if (i) return i;
-                                       return -ENOMEM;
-                               }
-                               spin_lock(&mm->page_table_lock);
-                       }
-                       if (pages) {
-                               pages[i] = get_page_map(map);
-                               /* FIXME: call the correct function,
-                                * depending on the type of the found page
-                                */
-                               if (!pages[i])
-                                       goto bad_page;
-                               page_cache_get(pages[i]);
-                       }
-                       if (vmas)
-                               vmas[i] = vma;
-                       i++;
-                       start += PAGE_SIZE;
-                       len--;
-               } while(len && start < vma->vm_end);
-               spin_unlock(&mm->page_table_lock);
-       } while(len);
-out:
-       return i;
-
-       /*
-        * We found an invalid page in the VMA.  Release all we have
-        * so far and fail.
-        */
-bad_page:
-       spin_unlock(&mm->page_table_lock);
-       while (i--)
-               page_cache_release(pages[i]);
-       i = -EFAULT;
-       goto out;
-}
-
-EXPORT_SYMBOL(get_user_pages);
-
-/*
- * Force in an entire range of pages from the current process's user VA,
- * and pin them in physical memory.  
- */
-#define dprintk(x...)
-
-int map_user_kiobuf(int rw, struct kiobuf *iobuf, unsigned long va, size_t len)
-{
-       int pgcount, err;
-       struct mm_struct *      mm;
-       
-       /* Make sure the iobuf is not already mapped somewhere. */
-       if (iobuf->nr_pages)
-               return -EINVAL;
-
-       mm = current->mm;
-       dprintk ("map_user_kiobuf: begin\n");
-       
-       pgcount = (va + len + PAGE_SIZE - 1)/PAGE_SIZE - va/PAGE_SIZE;
-       /* mapping 0 bytes is not permitted */
-       if (!pgcount) BUG();
-       err = expand_kiobuf(iobuf, pgcount);
-       if (err)
-               return err;
-
-       iobuf->locked = 0;
-       iobuf->offset = va & (PAGE_SIZE-1);
-       iobuf->length = len;
-       
-       /* Try to fault in all of the necessary pages */
-       down_read(&mm->mmap_sem);
-       /* rw==READ means read from disk, write into memory area */
-       err = get_user_pages(current, mm, va, pgcount,
-                       (rw==READ), 0, iobuf->maplist, NULL);
-       up_read(&mm->mmap_sem);
-       if (err < 0) {
-               unmap_kiobuf(iobuf);
-               dprintk ("map_user_kiobuf: end %d\n", err);
-               return err;
-       }
-       iobuf->nr_pages = err;
-       while (pgcount--) {
-               /* FIXME: flush superflous for rw==READ,
-                * probably wrong function for rw==WRITE
-                */
-               flush_dcache_page(iobuf->maplist[pgcount]);
-       }
-       dprintk ("map_user_kiobuf: end OK\n");
-       return 0;
-}
-
-/*
- * Mark all of the pages in a kiobuf as dirty 
- *
- * We need to be able to deal with short reads from disk: if an IO error
- * occurs, the number of bytes read into memory may be less than the
- * size of the kiobuf, so we have to stop marking pages dirty once the
- * requested byte count has been reached.
- *
- * Must be called from process context - set_page_dirty() takes VFS locks.
- */
-
-void mark_dirty_kiobuf(struct kiobuf *iobuf, int bytes)
-{
-       int index, offset, remaining;
-       struct page *page;
-       
-       index = iobuf->offset >> PAGE_SHIFT;
-       offset = iobuf->offset & ~PAGE_MASK;
-       remaining = bytes;
-       if (remaining > iobuf->length)
-               remaining = iobuf->length;
-       
-       while (remaining > 0 && index < iobuf->nr_pages) {
-               page = iobuf->maplist[index];
-               
-               if (!PageReserved(page))
-                       set_page_dirty(page);
-
-               remaining -= (PAGE_SIZE - offset);
-               offset = 0;
-               index++;
-       }
-}
-
-/*
- * Unmap all of the pages referenced by a kiobuf.  We release the pages,
- * and unlock them if they were locked. 
- */
-
-void unmap_kiobuf (struct kiobuf *iobuf) 
-{
-       int i;
-       struct page *map;
-       
-       for (i = 0; i < iobuf->nr_pages; i++) {
-               map = iobuf->maplist[i];
-               if (map) {
-                       if (iobuf->locked)
-                               UnlockPage(map);
-                       /* FIXME: cache flush missing for rw==READ
-                        * FIXME: call the correct reference counting function
-                        */
-                       page_cache_release(map);
-               }
-       }
-       
-       iobuf->nr_pages = 0;
-       iobuf->locked = 0;
-}
-
-
-/*
- * Lock down all of the pages of a kiovec for IO.
- *
- * If any page is mapped twice in the kiovec, we return the error -EINVAL.
- *
- * The optional wait parameter causes the lock call to block until all
- * pages can be locked if set.  If wait==0, the lock operation is
- * aborted if any locked pages are found and -EAGAIN is returned.
- */
-
-int lock_kiovec(int nr, struct kiobuf *iovec[], int wait)
-{
-       struct kiobuf *iobuf;
-       int i, j;
-       struct page *page, **ppage;
-       int doublepage = 0;
-       int repeat = 0;
-       
- repeat:
-       
-       for (i = 0; i < nr; i++) {
-               iobuf = iovec[i];
-
-               if (iobuf->locked)
-                       continue;
-
-               ppage = iobuf->maplist;
-               for (j = 0; j < iobuf->nr_pages; ppage++, j++) {
-                       page = *ppage;
-                       if (!page)
-                               continue;
-                       
-                       if (TryLockPage(page)) {
-                               while (j--) {
-                                       struct page *tmp = *--ppage;
-                                       if (tmp)
-                                               UnlockPage(tmp);
-                               }
-                               goto retry;
-                       }
-               }
-               iobuf->locked = 1;
-       }
-
-       return 0;
-       
- retry:
-       
-       /* 
-        * We couldn't lock one of the pages.  Undo the locking so far,
-        * wait on the page we got to, and try again.  
-        */
-       
-       unlock_kiovec(nr, iovec);
-       if (!wait)
-               return -EAGAIN;
-       
-       /* 
-        * Did the release also unlock the page we got stuck on?
-        */
-       if (!PageLocked(page)) {
-               /* 
-                * If so, we may well have the page mapped twice
-                * in the IO address range.  Bad news.  Of
-                * course, it _might_ just be a coincidence,
-                * but if it happens more than once, chances
-                * are we have a double-mapped page. 
-                */
-               if (++doublepage >= 3) 
-                       return -EINVAL;
-               
-               /* Try again...  */
-               wait_on_page(page);
-       }
-       
-       if (++repeat < 16)
-               goto repeat;
-       return -EAGAIN;
-}
-
-/*
- * Unlock all of the pages of a kiovec after IO.
- */
-
-int unlock_kiovec(int nr, struct kiobuf *iovec[])
-{
-       struct kiobuf *iobuf;
-       int i, j;
-       struct page *page, **ppage;
-       
-       for (i = 0; i < nr; i++) {
-               iobuf = iovec[i];
-
-               if (!iobuf->locked)
-                       continue;
-               iobuf->locked = 0;
-               
-               ppage = iobuf->maplist;
-               for (j = 0; j < iobuf->nr_pages; ppage++, j++) {
-                       page = *ppage;
-                       if (!page)
-                               continue;
-                       UnlockPage(page);
-               }
-       }
-       return 0;
-}
-
-static inline void zeromap_pte_range(pte_t * pte, unsigned long address,
-                                     unsigned long size, pgprot_t prot)
-{
-       unsigned long end;
-
-       address &= ~PMD_MASK;
-       end = address + size;
-       if (end > PMD_SIZE)
-               end = PMD_SIZE;
-       do {
-               pte_t zero_pte = pte_wrprotect(mk_pte(ZERO_PAGE(address), prot));
-               pte_t oldpage = ptep_get_and_clear(pte);
-               set_pte(pte, zero_pte);
-               forget_pte(oldpage);
-               address += PAGE_SIZE;
-               pte++;
-       } while (address && (address < end));
-}
-
-static inline int zeromap_pmd_range(struct mm_struct *mm, pmd_t * pmd, unsigned long address,
-                                    unsigned long size, pgprot_t prot)
-{
-       unsigned long end;
-
-       address &= ~PGDIR_MASK;
-       end = address + size;
-       if (end > PGDIR_SIZE)
-               end = PGDIR_SIZE;
-       do {
-               pte_t * pte = pte_alloc(mm, pmd, address);
-               if (!pte)
-                       return -ENOMEM;
-               zeromap_pte_range(pte, address, end - address, prot);
-               address = (address + PMD_SIZE) & PMD_MASK;
-               pmd++;
-       } while (address && (address < end));
-       return 0;
-}
-
-int zeromap_page_range(unsigned long address, unsigned long size, pgprot_t prot)
-{
-       int error = 0;
-       pgd_t * dir;
-       unsigned long beg = address;
-       unsigned long end = address + size;
-       struct mm_struct *mm = current->mm;
-
-       dir = pgd_offset(mm, address);
-       flush_cache_range(mm, beg, end);
-       if (address >= end)
-               BUG();
-
-       spin_lock(&mm->page_table_lock);
-       do {
-               pmd_t *pmd = pmd_alloc(mm, dir, address);
-               error = -ENOMEM;
-               if (!pmd)
-                       break;
-               error = zeromap_pmd_range(mm, pmd, address, end - address, prot);
-               if (error)
-                       break;
-               address = (address + PGDIR_SIZE) & PGDIR_MASK;
-               dir++;
-       } while (address && (address < end));
-       spin_unlock(&mm->page_table_lock);
-       flush_tlb_range(mm, beg, end);
-       return error;
-}
-
-/*
- * maps a range of physical memory into the requested pages. the old
- * mappings are removed. any references to nonexistent pages results
- * in null mappings (currently treated as "copy-on-access")
- */
-static inline void remap_pte_range(pte_t * pte, unsigned long address, unsigned long size,
-       unsigned long phys_addr, pgprot_t prot)
-{
-       unsigned long end;
-
-       address &= ~PMD_MASK;
-       end = address + size;
-       if (end > PMD_SIZE)
-               end = PMD_SIZE;
-       do {
-               struct page *page;
-               pte_t oldpage;
-               oldpage = ptep_get_and_clear(pte);
-
-               page = virt_to_page(__va(phys_addr));
-               if ((!VALID_PAGE(page)) || PageReserved(page))
-                       set_pte(pte, mk_pte_phys(phys_addr, prot));
-               forget_pte(oldpage);
-               address += PAGE_SIZE;
-               phys_addr += PAGE_SIZE;
-               pte++;
-       } while (address && (address < end));
-}
-
-static inline int remap_pmd_range(struct mm_struct *mm, pmd_t * pmd, unsigned long address, unsigned long size,
-       unsigned long phys_addr, pgprot_t prot)
-{
-       unsigned long end;
-
-       address &= ~PGDIR_MASK;
-       end = address + size;
-       if (end > PGDIR_SIZE)
-               end = PGDIR_SIZE;
-       phys_addr -= address;
-       do {
-               pte_t * pte = pte_alloc(mm, pmd, address);
-               if (!pte)
-                       return -ENOMEM;
-               remap_pte_range(pte, address, end - address, address + phys_addr, prot);
-               address = (address + PMD_SIZE) & PMD_MASK;
-               pmd++;
-       } while (address && (address < end));
-       return 0;
-}
-
-/*  Note: this is only safe if the mm semaphore is held when called. */
-int remap_page_range(unsigned long from, unsigned long phys_addr, unsigned long size, pgprot_t prot)
-{
-       int error = 0;
-       pgd_t * dir;
-       unsigned long beg = from;
-       unsigned long end = from + size;
-       struct mm_struct *mm = current->mm;
-
-       phys_addr -= from;
-       dir = pgd_offset(mm, from);
-       flush_cache_range(mm, beg, end);
-       if (from >= end)
-               BUG();
-
-       spin_lock(&mm->page_table_lock);
-       do {
-               pmd_t *pmd = pmd_alloc(mm, dir, from);
-               error = -ENOMEM;
-               if (!pmd)
-                       break;
-               error = remap_pmd_range(mm, pmd, from, end - from, phys_addr + from, prot);
-               if (error)
-                       break;
-               from = (from + PGDIR_SIZE) & PGDIR_MASK;
-               dir++;
-       } while (from && (from < end));
-       spin_unlock(&mm->page_table_lock);
-       flush_tlb_range(mm, beg, end);
-       return error;
-}
-
-/*
- * Establish a new mapping:
- *  - flush the old one
- *  - update the page tables
- *  - inform the TLB about the new one
- *
- * We hold the mm semaphore for reading and vma->vm_mm->page_table_lock
- */
-static inline void establish_pte(struct vm_area_struct * vma, unsigned long address, pte_t *page_table, pte_t entry)
-{
-       set_pte(page_table, entry);
-       flush_tlb_page(vma, address);
-       update_mmu_cache(vma, address, entry);
-}
-
-/*
- * We hold the mm semaphore for reading and vma->vm_mm->page_table_lock
- */
-static inline void break_cow(struct vm_area_struct * vma, struct page * new_page, unsigned long address, 
-               pte_t *page_table)
-{
-       flush_page_to_ram(new_page);
-       flush_cache_page(vma, address);
-       establish_pte(vma, address, page_table, pte_mkwrite(pte_mkdirty(mk_pte(new_page, vma->vm_page_prot))));
-}
-
-/*
- * This routine handles present pages, when users try to write
- * to a shared page. It is done by copying the page to a new address
- * and decrementing the shared-page counter for the old page.
- *
- * Goto-purists beware: the only reason for goto's here is that it results
- * in better assembly code.. The "default" path will see no jumps at all.
- *
- * Note that this routine assumes that the protection checks have been
- * done by the caller (the low-level page fault routine in most cases).
- * Thus we can safely just mark it writable once we've done any necessary
- * COW.
- *
- * We also mark the page dirty at this point even though the page will
- * change only once the write actually happens. This avoids a few races,
- * and potentially makes it more efficient.
- *
- * We hold the mm semaphore and the page_table_lock on entry and exit
- * with the page_table_lock released.
- */
-static int do_wp_page(struct mm_struct *mm, struct vm_area_struct * vma,
-       unsigned long address, pte_t *page_table, pte_t pte)
-{
-       struct page *old_page, *new_page;
-
-       old_page = pte_page(pte);
-       if (!VALID_PAGE(old_page))
-               goto bad_wp_page;
-
-       if (!TryLockPage(old_page)) {
-               int reuse = can_share_swap_page(old_page);
-               unlock_page(old_page);
-               if (reuse) {
-                       flush_cache_page(vma, address);
-                       establish_pte(vma, address, page_table, pte_mkyoung(pte_mkdirty(pte_mkwrite(pte))));
-                       spin_unlock(&mm->page_table_lock);
-                       return 1;       /* Minor fault */
-               }
-       }
-
-       /*
-        * Ok, we need to copy. Oh, well..
-        */
-       page_cache_get(old_page);
-       spin_unlock(&mm->page_table_lock);
-
-       new_page = alloc_page(GFP_HIGHUSER);
-       if (!new_page)
-               goto no_mem;
-       copy_cow_page(old_page,new_page,address);
-
-       /*
-        * Re-check the pte - we dropped the lock
-        */
-       spin_lock(&mm->page_table_lock);
-       if (pte_same(*page_table, pte)) {
-               if (PageReserved(old_page))
-                       ++mm->rss;
-               break_cow(vma, new_page, address, page_table);
-               lru_cache_add(new_page);
-
-               /* Free the old page.. */
-               new_page = old_page;
-       }
-       spin_unlock(&mm->page_table_lock);
-       page_cache_release(new_page);
-       page_cache_release(old_page);
-       return 1;       /* Minor fault */
-
-bad_wp_page:
-       spin_unlock(&mm->page_table_lock);
-       printk("do_wp_page: bogus page at address %08lx (page 0x%lx)\n",address,(unsigned long)old_page);
-       return -1;
-no_mem:
-       page_cache_release(old_page);
-       return -1;
-}
-
-static void vmtruncate_list(struct vm_area_struct *mpnt, unsigned long pgoff)
-{
-       do {
-               struct mm_struct *mm = mpnt->vm_mm;
-               unsigned long start = mpnt->vm_start;
-               unsigned long end = mpnt->vm_end;
-               unsigned long len = end - start;
-               unsigned long diff;
-
-               /* mapping wholly truncated? */
-               if (mpnt->vm_pgoff >= pgoff) {
-                       zap_page_range(mm, start, len);
-                       continue;
-               }
-
-               /* mapping wholly unaffected? */
-               len = len >> PAGE_SHIFT;
-               diff = pgoff - mpnt->vm_pgoff;
-               if (diff >= len)
-                       continue;
-
-               /* Ok, partially affected.. */
-               start += diff << PAGE_SHIFT;
-               len = (len - diff) << PAGE_SHIFT;
-               zap_page_range(mm, start, len);
-       } while ((mpnt = mpnt->vm_next_share) != NULL);
-}
-
-/*
- * Handle all mappings that got truncated by a "truncate()"
- * system call.
- *
- * NOTE! We have to be ready to update the memory sharing
- * between the file and the memory map for a potential last
- * incomplete page.  Ugly, but necessary.
- */
-int vmtruncate(struct inode * inode, loff_t offset)
-{
-       unsigned long pgoff;
-       struct address_space *mapping = inode->i_mapping;
-       unsigned long limit;
-
-       if (inode->i_size < offset)
-               goto do_expand;
-       inode->i_size = offset;
-       spin_lock(&mapping->i_shared_lock);
-       if (!mapping->i_mmap && !mapping->i_mmap_shared)
-               goto out_unlock;
-
-       pgoff = (offset + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
-       if (mapping->i_mmap != NULL)
-               vmtruncate_list(mapping->i_mmap, pgoff);
-       if (mapping->i_mmap_shared != NULL)
-               vmtruncate_list(mapping->i_mmap_shared, pgoff);
-
-out_unlock:
-       spin_unlock(&mapping->i_shared_lock);
-       truncate_inode_pages(mapping, offset);
-       goto out_truncate;
-
-do_expand:
-       limit = current->rlim[RLIMIT_FSIZE].rlim_cur;
-       if (limit != RLIM_INFINITY && offset > limit)
-               goto out_sig;
-       if (offset > inode->i_sb->s_maxbytes)
-               goto out;
-       inode->i_size = offset;
-
-out_truncate:
-       if (inode->i_op && inode->i_op->truncate) {
-               lock_kernel();
-               inode->i_op->truncate(inode);
-               unlock_kernel();
-       }
-       return 0;
-out_sig:
-       send_sig(SIGXFSZ, current, 0);
-out:
-       return -EFBIG;
-}
-
-/* 
- * Primitive swap readahead code. We simply read an aligned block of
- * (1 << page_cluster) entries in the swap area. This method is chosen
- * because it doesn't cost us any seek time.  We also make sure to queue
- * the 'original' request together with the readahead ones...  
- */
-void swapin_readahead(swp_entry_t entry)
-{
-       int i, num;
-       struct page *new_page;
-       unsigned long offset;
-
-       /*
-        * Get the number of handles we should do readahead io to.
-        */
-       num = valid_swaphandles(entry, &offset);
-       for (i = 0; i < num; offset++, i++) {
-               /* Ok, do the async read-ahead now */
-               new_page = read_swap_cache_async(SWP_ENTRY(SWP_TYPE(entry), offset));
-               if (!new_page)
-                       break;
-               page_cache_release(new_page);
-       }
-       return;
-}
-
-/*
- * We hold the mm semaphore and the page_table_lock on entry and
- * should release the pagetable lock on exit..
- */
-static int do_swap_page(struct mm_struct * mm,
-       struct vm_area_struct * vma, unsigned long address,
-       pte_t * page_table, pte_t orig_pte, int write_access)
-{
-       struct page *page;
-       swp_entry_t entry = pte_to_swp_entry(orig_pte);
-       pte_t pte;
-       int ret = 1;
-
-       spin_unlock(&mm->page_table_lock);
-       page = lookup_swap_cache(entry);
-       if (!page) {
-               swapin_readahead(entry);
-               page = read_swap_cache_async(entry);
-               if (!page) {
-                       /*
-                        * Back out if somebody else faulted in this pte while
-                        * we released the page table lock.
-                        */
-                       int retval;
-                       spin_lock(&mm->page_table_lock);
-                       retval = pte_same(*page_table, orig_pte) ? -1 : 1;
-                       spin_unlock(&mm->page_table_lock);
-                       return retval;
-               }
-
-               /* Had to read the page from swap area: Major fault */
-               ret = 2;
-       }
-
-       mark_page_accessed(page);
-
-       lock_page(page);
-
-       /*
-        * Back out if somebody else faulted in this pte while we
-        * released the page table lock.
-        */
-       spin_lock(&mm->page_table_lock);
-       if (!pte_same(*page_table, orig_pte)) {
-               spin_unlock(&mm->page_table_lock);
-               unlock_page(page);
-               page_cache_release(page);
-               return 1;
-       }
-
-       /* The page isn't present yet, go ahead with the fault. */
-               
-       swap_free(entry);
-       if (vm_swap_full())
-               remove_exclusive_swap_page(page);
-
-       mm->rss++;
-       pte = mk_pte(page, vma->vm_page_prot);
-       if (write_access && can_share_swap_page(page))
-               pte = pte_mkdirty(pte_mkwrite(pte));
-       unlock_page(page);
-
-       flush_page_to_ram(page);
-       flush_icache_page(vma, page);
-       set_pte(page_table, pte);
-
-       /* No need to invalidate - it was non-present before */
-       update_mmu_cache(vma, address, pte);
-       XENO_flush_page_update_queue();
-       spin_unlock(&mm->page_table_lock);
-       return ret;
-}
-
-/*
- * We are called with the MM semaphore and page_table_lock
- * spinlock held to protect against concurrent faults in
- * multithreaded programs. 
- */
-static int do_anonymous_page(struct mm_struct * mm, struct vm_area_struct * vma, pte_t *page_table, int write_access, unsigned long addr)
-{
-       pte_t entry;
-
-       /* Read-only mapping of ZERO_PAGE. */
-       entry = pte_wrprotect(mk_pte(ZERO_PAGE(addr), vma->vm_page_prot));
-
-       /* ..except if it's a write access */
-       if (write_access) {
-               struct page *page;
-
-               /* Allocate our own private page. */
-               spin_unlock(&mm->page_table_lock);
-
-               page = alloc_page(GFP_HIGHUSER);
-               if (!page)
-                       goto no_mem;
-               clear_user_highpage(page, addr);
-
-               spin_lock(&mm->page_table_lock);
-               if (!pte_none(*page_table)) {
-                       page_cache_release(page);
-                       spin_unlock(&mm->page_table_lock);
-                       return 1;
-               }
-               mm->rss++;
-               flush_page_to_ram(page);
-               entry = pte_mkwrite(pte_mkdirty(mk_pte(page, vma->vm_page_prot)));
-               lru_cache_add(page);
-               mark_page_accessed(page);
-       }
-
-       set_pte(page_table, entry);
-
-       /* No need to invalidate - it was non-present before */
-       update_mmu_cache(vma, addr, entry);
-       XENO_flush_page_update_queue();
-       spin_unlock(&mm->page_table_lock);
-       return 1;       /* Minor fault */
-
-no_mem:
-       return -1;
-}
-
-/*
- * do_no_page() tries to create a new page mapping. It aggressively
- * tries to share with existing pages, but makes a separate copy if
- * the "write_access" parameter is true in order to avoid the next
- * page fault.
- *
- * As this is called only for pages that do not currently exist, we
- * do not need to flush old virtual caches or the TLB.
- *
- * This is called with the MM semaphore held and the page table
- * spinlock held. Exit with the spinlock released.
- */
-static int do_no_page(struct mm_struct * mm, struct vm_area_struct * vma,
-       unsigned long address, int write_access, pte_t *page_table)
-{
-       struct page * new_page;
-       pte_t entry;
-
-       if (!vma->vm_ops || !vma->vm_ops->nopage)
-               return do_anonymous_page(mm, vma, page_table, write_access, address);
-       spin_unlock(&mm->page_table_lock);
-
-       new_page = vma->vm_ops->nopage(vma, address & PAGE_MASK, 0);
-
-       if (new_page == NULL)   /* no page was available -- SIGBUS */
-               return 0;
-       if (new_page == NOPAGE_OOM)
-               return -1;
-
-       /*
-        * Should we do an early C-O-W break?
-        */
-       if (write_access && !(vma->vm_flags & VM_SHARED)) {
-               struct page * page = alloc_page(GFP_HIGHUSER);
-               if (!page) {
-                       page_cache_release(new_page);
-                       return -1;
-               }
-               copy_user_highpage(page, new_page, address);
-               page_cache_release(new_page);
-               lru_cache_add(page);
-               new_page = page;
-       }
-
-       spin_lock(&mm->page_table_lock);
-       /*
-        * This silly early PAGE_DIRTY setting removes a race
-        * due to the bad i386 page protection. But it's valid
-        * for other architectures too.
-        *
-        * Note that if write_access is true, we either now have
-        * an exclusive copy of the page, or this is a shared mapping,
-        * so we can make it writable and dirty to avoid having to
-        * handle that later.
-        */
-       /* Only go through if we didn't race with anybody else... */
-       if (pte_none(*page_table)) {
-               ++mm->rss;
-               flush_page_to_ram(new_page);
-               flush_icache_page(vma, new_page);
-               entry = mk_pte(new_page, vma->vm_page_prot);
-               if (write_access)
-                       entry = pte_mkwrite(pte_mkdirty(entry));
-               set_pte(page_table, entry);
-       } else {
-               /* One of our sibling threads was faster, back out. */
-               page_cache_release(new_page);
-               spin_unlock(&mm->page_table_lock);
-               return 1;
-       }
-
-       /* no need to invalidate: a not-present page shouldn't be cached */
-       update_mmu_cache(vma, address, entry);
-       XENO_flush_page_update_queue();
-       spin_unlock(&mm->page_table_lock);
-       return 2;       /* Major fault */
-}
-
-/*
- * These routines also need to handle stuff like marking pages dirty
- * and/or accessed for architectures that don't do it in hardware (most
- * RISC architectures).  The early dirtying is also good on the i386.
- *
- * There is also a hook called "update_mmu_cache()" that architectures
- * with external mmu caches can use to update those (ie the Sparc or
- * PowerPC hashed page tables that act as extended TLBs).
- *
- * Note the "page_table_lock". It is to protect against kswapd removing
- * pages from under us. Note that kswapd only ever _removes_ pages, never
- * adds them. As such, once we have noticed that the page is not present,
- * we can drop the lock early.
- *
- * The adding of pages is protected by the MM semaphore (which we hold),
- * so we don't need to worry about a page being suddenly been added into
- * our VM.
- *
- * We enter with the pagetable spinlock held, we are supposed to
- * release it when done.
- */
-static inline int handle_pte_fault(struct mm_struct *mm,
-       struct vm_area_struct * vma, unsigned long address,
-       int write_access, pte_t * pte)
-{
-       pte_t entry;
-
-       entry = *pte;
-       if (!pte_present(entry)) {
-               /*
-                * If it truly wasn't present, we know that kswapd
-                * and the PTE updates will not touch it later. So
-                * drop the lock.
-                */
-               if (pte_none(entry))
-                       return do_no_page(mm, vma, address, write_access, pte);
-               return do_swap_page(mm, vma, address, pte, entry, write_access);
-       }
-
-       if (write_access) {
-               if (!pte_write(entry))
-                       return do_wp_page(mm, vma, address, pte, entry);
-
-               entry = pte_mkdirty(entry);
-       }
-       entry = pte_mkyoung(entry);
-       establish_pte(vma, address, pte, entry);
-       XENO_flush_page_update_queue();
-       spin_unlock(&mm->page_table_lock);
-       return 1;
-}
-
-/*
- * By the time we get here, we already hold the mm semaphore
- */
-int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct * vma,
-       unsigned long address, int write_access)
-{
-       pgd_t *pgd;
-       pmd_t *pmd;
-
-       current->state = TASK_RUNNING;
-       pgd = pgd_offset(mm, address);
-
-       /*
-        * We need the page table lock to synchronize with kswapd
-        * and the SMP-safe atomic PTE updates.
-        */
-       spin_lock(&mm->page_table_lock);
-       pmd = pmd_alloc(mm, pgd, address);
-
-       if (pmd) {
-               pte_t * pte = pte_alloc(mm, pmd, address);
-               if (pte)
-                       return handle_pte_fault(mm, vma, address, write_access, pte);
-       }
-       spin_unlock(&mm->page_table_lock);
-       return -1;
-}
-
-/*
- * Allocate page middle directory.
- *
- * We've already handled the fast-path in-line, and we own the
- * page table lock.
- *
- * On a two-level page table, this ends up actually being entirely
- * optimized away.
- */
-pmd_t *__pmd_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
-{
-       pmd_t *new;
-
-       /* "fast" allocation can happen without dropping the lock.. */
-       new = pmd_alloc_one_fast(mm, address);
-       if (!new) {
-               spin_unlock(&mm->page_table_lock);
-               new = pmd_alloc_one(mm, address);
-               spin_lock(&mm->page_table_lock);
-               if (!new)
-                       return NULL;
-
-               /*
-                * Because we dropped the lock, we should re-check the
-                * entry, as somebody else could have populated it..
-                */
-               if (!pgd_none(*pgd)) {
-                       pmd_free(new);
-                       goto out;
-               }
-       }
-       pgd_populate(mm, pgd, new);
-out:
-       return pmd_offset(pgd, address);
-}
-
-/*
- * Allocate the page table directory.
- *
- * We've already handled the fast-path in-line, and we own the
- * page table lock.
- */
-pte_t *pte_alloc(struct mm_struct *mm, pmd_t *pmd, unsigned long address)
-{
-       if (pmd_none(*pmd)) {
-               pte_t *new;
-
-               /* "fast" allocation can happen without dropping the lock.. */
-               new = pte_alloc_one_fast(mm, address);
-               if (!new) {
-                       XENO_flush_page_update_queue();
-                       spin_unlock(&mm->page_table_lock);
-                       new = pte_alloc_one(mm, address);
-                       spin_lock(&mm->page_table_lock);
-                       if (!new)
-                               return NULL;
-
-                       /*
-                        * Because we dropped the lock, we should re-check the
-                        * entry, as somebody else could have populated it..
-                        */
-                       if (!pmd_none(*pmd)) {
-                               pte_free(new);
-                               goto out;
-                       }
-               }
-               pmd_populate(mm, pmd, new);
-       }
-out:
-       return pte_offset(pmd, address);
-}
-
-int make_pages_present(unsigned long addr, unsigned long end)
-{
-       int ret, len, write;
-       struct vm_area_struct * vma;
-
-       vma = find_vma(current->mm, addr);
-       write = (vma->vm_flags & VM_WRITE) != 0;
-       if (addr >= end)
-               BUG();
-       if (end > vma->vm_end)
-               BUG();
-       len = (end+PAGE_SIZE-1)/PAGE_SIZE-addr/PAGE_SIZE;
-       ret = get_user_pages(current, current->mm, addr,
-                       len, write, 0, NULL, NULL);
-       return ret == len ? 0 : -1;
-}
-
-struct page * vmalloc_to_page(void * vmalloc_addr)
-{
-       unsigned long addr = (unsigned long) vmalloc_addr;
-       struct page *page = NULL;
-       pmd_t *pmd;
-       pte_t *pte;
-       pgd_t *pgd;
-       
-       pgd = pgd_offset_k(addr);
-       if (!pgd_none(*pgd)) {
-               pmd = pmd_offset(pgd, addr);
-               if (!pmd_none(*pmd)) {
-                       pte = pte_offset(pmd, addr);
-                       if (pte_present(*pte)) {
-                               page = pte_page(*pte);
-                       }
-               }
-       }
-       return page;
-}
diff --git a/xenolinux-2.4.21-sparse/mm/mprotect.c b/xenolinux-2.4.21-sparse/mm/mprotect.c
deleted file mode 100644 (file)
index a6f355d..0000000
+++ /dev/null
@@ -1,344 +0,0 @@
-/*
- *     linux/mm/mprotect.c
- *
- *  (C) Copyright 1994 Linus Torvalds
- */
-#include <linux/slab.h>
-#include <linux/smp_lock.h>
-#include <linux/shm.h>
-#include <linux/mman.h>
-
-#include <asm/uaccess.h>
-#include <asm/pgalloc.h>
-#include <asm/pgtable.h>
-
-static inline void change_pte_range(pmd_t * pmd, unsigned long address,
-       unsigned long size, pgprot_t newprot)
-{
-       pte_t * pte;
-       unsigned long end;
-
-       if (pmd_none(*pmd))
-               return;
-       if (pmd_bad(*pmd)) {
-               pmd_ERROR(*pmd);
-               pmd_clear(pmd);
-               return;
-       }
-       pte = pte_offset(pmd, address);
-       address &= ~PMD_MASK;
-       end = address + size;
-       if (end > PMD_SIZE)
-               end = PMD_SIZE;
-       do {
-               if (pte_present(*pte)) {
-                       pte_t entry;
-
-                       /* Avoid an SMP race with hardware updated dirty/clean
-                        * bits by wiping the pte and then setting the new pte
-                        * into place.
-                        */
-                       entry = ptep_get_and_clear(pte);
-                       set_pte(pte, pte_modify(entry, newprot));
-               }
-               address += PAGE_SIZE;
-               pte++;
-       } while (address && (address < end));
-}
-
-static inline void change_pmd_range(pgd_t * pgd, unsigned long address,
-       unsigned long size, pgprot_t newprot)
-{
-       pmd_t * pmd;
-       unsigned long end;
-
-       if (pgd_none(*pgd))
-               return;
-       if (pgd_bad(*pgd)) {
-               pgd_ERROR(*pgd);
-               pgd_clear(pgd);
-               return;
-       }
-       pmd = pmd_offset(pgd, address);
-       address &= ~PGDIR_MASK;
-       end = address + size;
-       if (end > PGDIR_SIZE)
-               end = PGDIR_SIZE;
-       do {
-               change_pte_range(pmd, address, end - address, newprot);
-               address = (address + PMD_SIZE) & PMD_MASK;
-               pmd++;
-       } while (address && (address < end));
-}
-
-static void change_protection(unsigned long start, unsigned long end, pgprot_t newprot)
-{
-       pgd_t *dir;
-       unsigned long beg = start;
-
-       dir = pgd_offset(current->mm, start);
-       flush_cache_range(current->mm, beg, end);
-       if (start >= end)
-               BUG();
-       spin_lock(&current->mm->page_table_lock);
-       do {
-               change_pmd_range(dir, start, end - start, newprot);
-               start = (start + PGDIR_SIZE) & PGDIR_MASK;
-               dir++;
-       } while (start && (start < end));
-       spin_unlock(&current->mm->page_table_lock);
-       flush_tlb_range(current->mm, beg, end);
-       return;
-}
-
-static inline int mprotect_fixup_all(struct vm_area_struct * vma, struct vm_area_struct ** pprev,
-       int newflags, pgprot_t prot)
-{
-       struct vm_area_struct * prev = *pprev;
-       struct mm_struct * mm = vma->vm_mm;
-
-       if (prev && prev->vm_end == vma->vm_start && can_vma_merge(prev, newflags) &&
-           !vma->vm_file && !(vma->vm_flags & VM_SHARED)) {
-               spin_lock(&mm->page_table_lock);
-               prev->vm_end = vma->vm_end;
-               __vma_unlink(mm, vma, prev);
-               spin_unlock(&mm->page_table_lock);
-
-               kmem_cache_free(vm_area_cachep, vma);
-               mm->map_count--;
-
-               return 0;
-       }
-
-       spin_lock(&mm->page_table_lock);
-       vma->vm_flags = newflags;
-       vma->vm_page_prot = prot;
-       spin_unlock(&mm->page_table_lock);
-
-       *pprev = vma;
-
-       return 0;
-}
-
-static inline int mprotect_fixup_start(struct vm_area_struct * vma, struct vm_area_struct ** pprev,
-       unsigned long end,
-       int newflags, pgprot_t prot)
-{
-       struct vm_area_struct * n, * prev = *pprev;
-
-       *pprev = vma;
-
-       if (prev && prev->vm_end == vma->vm_start && can_vma_merge(prev, newflags) &&
-           !vma->vm_file && !(vma->vm_flags & VM_SHARED)) {
-               spin_lock(&vma->vm_mm->page_table_lock);
-               prev->vm_end = end;
-               vma->vm_start = end;
-               spin_unlock(&vma->vm_mm->page_table_lock);
-
-               return 0;
-       }
-       n = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
-       if (!n)
-               return -ENOMEM;
-       *n = *vma;
-       n->vm_end = end;
-       n->vm_flags = newflags;
-       n->vm_raend = 0;
-       n->vm_page_prot = prot;
-       if (n->vm_file)
-               get_file(n->vm_file);
-       if (n->vm_ops && n->vm_ops->open)
-               n->vm_ops->open(n);
-       vma->vm_pgoff += (end - vma->vm_start) >> PAGE_SHIFT;
-       lock_vma_mappings(vma);
-       spin_lock(&vma->vm_mm->page_table_lock);
-       vma->vm_start = end;
-       __insert_vm_struct(current->mm, n);
-       spin_unlock(&vma->vm_mm->page_table_lock);
-       unlock_vma_mappings(vma);
-
-       return 0;
-}
-
-static inline int mprotect_fixup_end(struct vm_area_struct * vma, struct vm_area_struct ** pprev,
-       unsigned long start,
-       int newflags, pgprot_t prot)
-{
-       struct vm_area_struct * n;
-
-       n = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL);
-       if (!n)
-               return -ENOMEM;
-       *n = *vma;
-       n->vm_start = start;
-       n->vm_pgoff += (n->vm_start - vma->vm_start) >> PAGE_SHIFT;
-       n->vm_flags = newflags;
-       n->vm_raend = 0;
-       n->vm_page_prot = prot;
-       if (n->vm_file)
-               get_file(n->vm_file);
-       if (n->vm_ops && n->vm_ops->open)
-               n->vm_ops->open(n);
-       lock_vma_mappings(vma);
-       spin_lock(&vma->vm_mm->page_table_lock);
-       vma->vm_end = start;
-       __insert_vm_struct(current->mm, n);
-       spin_unlock(&vma->vm_mm->page_table_lock);
-       unlock_vma_mappings(vma);
-
-       *pprev = n;
-
-       return 0;
-}
-
-static inline int mprotect_fixup_middle(struct vm_area_struct * vma, struct vm_area_struct ** pprev,
-       unsigned long start, unsigned long end,
-       int newflags, pgprot_t prot)
-{
-       struct vm_area_struct * left, * right;
-
-       left = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
-       if (!left)
-               return -ENOMEM;
-       right = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
-       if (!right) {
-               kmem_cache_free(vm_area_cachep, left);
-               return -ENOMEM;
-       }
-       *left = *vma;
-       *right = *vma;
-       left->vm_end = start;
-       right->vm_start = end;
-       right->vm_pgoff += (right->vm_start - left->vm_start) >> PAGE_SHIFT;
-       left->vm_raend = 0;
-       right->vm_raend = 0;
-       if (vma->vm_file)
-               atomic_add(2,&vma->vm_file->f_count);
-       if (vma->vm_ops && vma->vm_ops->open) {
-               vma->vm_ops->open(left);
-               vma->vm_ops->open(right);
-       }
-       vma->vm_pgoff += (start - vma->vm_start) >> PAGE_SHIFT;
-       vma->vm_raend = 0;
-       vma->vm_page_prot = prot;
-       lock_vma_mappings(vma);
-       spin_lock(&vma->vm_mm->page_table_lock);
-       vma->vm_start = start;
-       vma->vm_end = end;
-       vma->vm_flags = newflags;
-       __insert_vm_struct(current->mm, left);
-       __insert_vm_struct(current->mm, right);
-       spin_unlock(&vma->vm_mm->page_table_lock);
-       unlock_vma_mappings(vma);
-
-       *pprev = right;
-
-       return 0;
-}
-
-static int mprotect_fixup(struct vm_area_struct * vma, struct vm_area_struct ** pprev,
-       unsigned long start, unsigned long end, unsigned int newflags)
-{
-       pgprot_t newprot;
-       int error;
-
-       if (newflags == vma->vm_flags) {
-               *pprev = vma;
-               return 0;
-       }
-       newprot = protection_map[newflags & 0xf];
-       if (start == vma->vm_start) {
-               if (end == vma->vm_end)
-                       error = mprotect_fixup_all(vma, pprev, newflags, newprot);
-               else
-                       error = mprotect_fixup_start(vma, pprev, end, newflags, newprot);
-       } else if (end == vma->vm_end)
-               error = mprotect_fixup_end(vma, pprev, start, newflags, newprot);
-       else
-               error = mprotect_fixup_middle(vma, pprev, start, end, newflags, newprot);
-
-       if (error)
-               return error;
-
-       change_protection(start, end, newprot);
-       return 0;
-}
-
-asmlinkage long sys_mprotect(unsigned long start, size_t len, unsigned long prot)
-{
-       unsigned long nstart, end, tmp;
-       struct vm_area_struct * vma, * next, * prev;
-       int error = -EINVAL;
-
-       if (start & ~PAGE_MASK)
-               return -EINVAL;
-       len = PAGE_ALIGN(len);
-       end = start + len;
-       if (end < start)
-               return -EINVAL;
-       if (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC))
-               return -EINVAL;
-       if (end == start)
-               return 0;
-
-       down_write(&current->mm->mmap_sem);
-
-       vma = find_vma_prev(current->mm, start, &prev);
-       error = -ENOMEM;
-       if (!vma || vma->vm_start > start)
-               goto out;
-
-#if defined(CONFIG_XENO_PRIV)
-       /* mprotect() unsupported for I/O mappings in Xenolinux. */
-       error = -EINVAL;
-       if (vma->vm_flags & VM_IO)
-               goto out;
-#endif
-
-       for (nstart = start ; ; ) {
-               unsigned int newflags;
-               int last = 0;
-
-               /* Here we know that  vma->vm_start <= nstart < vma->vm_end. */
-
-               newflags = prot | (vma->vm_flags & ~(PROT_READ | PROT_WRITE | PROT_EXEC));
-               if ((newflags & ~(newflags >> 4)) & 0xf) {
-                       error = -EACCES;
-                       goto out;
-               }
-
-               if (vma->vm_end > end) {
-                       error = mprotect_fixup(vma, &prev, nstart, end, newflags);
-                       goto out;
-               }
-               if (vma->vm_end == end)
-                       last = 1;
-
-               tmp = vma->vm_end;
-               next = vma->vm_next;
-               error = mprotect_fixup(vma, &prev, nstart, tmp, newflags);
-               if (error)
-                       goto out;
-               if (last)
-                       break;
-               nstart = tmp;
-               vma = next;
-               if (!vma || vma->vm_start != nstart) {
-                       error = -ENOMEM;
-                       goto out;
-               }
-       }
-       if (next && prev->vm_end == next->vm_start && can_vma_merge(next, prev->vm_flags) &&
-           !prev->vm_file && !(prev->vm_flags & VM_SHARED)) {
-               spin_lock(&prev->vm_mm->page_table_lock);
-               prev->vm_end = next->vm_end;
-               __vma_unlink(prev->vm_mm, next, prev);
-               spin_unlock(&prev->vm_mm->page_table_lock);
-
-               kmem_cache_free(vm_area_cachep, next);
-               prev->vm_mm->map_count--;
-       }
-out:
-       up_write(&current->mm->mmap_sem);
-       return error;
-}
diff --git a/xenolinux-2.4.21-sparse/mm/mremap.c b/xenolinux-2.4.21-sparse/mm/mremap.c
deleted file mode 100644 (file)
index a452b46..0000000
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- *     linux/mm/remap.c
- *
- *     (C) Copyright 1996 Linus Torvalds
- */
-
-#include <linux/slab.h>
-#include <linux/smp_lock.h>
-#include <linux/shm.h>
-#include <linux/mman.h>
-#include <linux/swap.h>
-
-#include <asm/uaccess.h>
-#include <asm/pgalloc.h>
-
-extern int vm_enough_memory(long pages);
-
-static inline pte_t *get_one_pte(struct mm_struct *mm, unsigned long addr)
-{
-       pgd_t * pgd;
-       pmd_t * pmd;
-       pte_t * pte = NULL;
-
-       pgd = pgd_offset(mm, addr);
-       if (pgd_none(*pgd))
-               goto end;
-       if (pgd_bad(*pgd)) {
-               pgd_ERROR(*pgd);
-               pgd_clear(pgd);
-               goto end;
-       }
-
-       pmd = pmd_offset(pgd, addr);
-       if (pmd_none(*pmd))
-               goto end;
-       if (pmd_bad(*pmd)) {
-               pmd_ERROR(*pmd);
-               pmd_clear(pmd);
-               goto end;
-       }
-
-       pte = pte_offset(pmd, addr);
-       if (pte_none(*pte))
-               pte = NULL;
-end:
-       return pte;
-}
-
-static inline pte_t *alloc_one_pte(struct mm_struct *mm, unsigned long addr)
-{
-       pmd_t * pmd;
-       pte_t * pte = NULL;
-
-       pmd = pmd_alloc(mm, pgd_offset(mm, addr), addr);
-       if (pmd)
-               pte = pte_alloc(mm, pmd, addr);
-       return pte;
-}
-
-static inline int copy_one_pte(struct mm_struct *mm, pte_t * src, pte_t * dst)
-{
-       int error = 0;
-       pte_t pte;
-
-       if (!pte_none(*src)) {
-               pte = ptep_get_and_clear(src);
-               if (!dst) {
-                       /* No dest?  We must put it back. */
-                       dst = src;
-                       error++;
-               }
-               set_pte(dst, pte);
-       }
-       return error;
-}
-
-static int move_one_page(struct mm_struct *mm, unsigned long old_addr, unsigned long new_addr)
-{
-       int error = 0;
-       pte_t * src;
-
-       spin_lock(&mm->page_table_lock);
-       src = get_one_pte(mm, old_addr);
-       if (src)
-               error = copy_one_pte(mm, src, alloc_one_pte(mm, new_addr));
-       spin_unlock(&mm->page_table_lock);
-       return error;
-}
-
-static int move_page_tables(struct mm_struct * mm,
-       unsigned long new_addr, unsigned long old_addr, unsigned long len)
-{
-       unsigned long offset = len;
-
-       flush_cache_range(mm, old_addr, old_addr + len);
-
-       /*
-        * This is not the clever way to do this, but we're taking the
-        * easy way out on the assumption that most remappings will be
-        * only a few pages.. This also makes error recovery easier.
-        */
-       while (offset) {
-               offset -= PAGE_SIZE;
-               if (move_one_page(mm, old_addr + offset, new_addr + offset))
-                       goto oops_we_failed;
-       }
-       flush_tlb_range(mm, old_addr, old_addr + len);
-       return 0;
-
-       /*
-        * Ok, the move failed because we didn't have enough pages for
-        * the new page table tree. This is unlikely, but we have to
-        * take the possibility into account. In that case we just move
-        * all the pages back (this will work, because we still have
-        * the old page tables)
-        */
-oops_we_failed:
-       XENO_flush_page_update_queue();
-       flush_cache_range(mm, new_addr, new_addr + len);
-       while ((offset += PAGE_SIZE) < len)
-               move_one_page(mm, new_addr + offset, old_addr + offset);
-       XENO_flush_page_update_queue();
-       zap_page_range(mm, new_addr, len);
-       return -1;
-}
-
-static inline unsigned long move_vma(struct vm_area_struct * vma,
-       unsigned long addr, unsigned long old_len, unsigned long new_len,
-       unsigned long new_addr)
-{
-       struct mm_struct * mm = vma->vm_mm;
-       struct vm_area_struct * new_vma, * next, * prev;
-       int allocated_vma;
-
-       new_vma = NULL;
-       next = find_vma_prev(mm, new_addr, &prev);
-       if (next) {
-               if (prev && prev->vm_end == new_addr &&
-                   can_vma_merge(prev, vma->vm_flags) && !vma->vm_file && !(vma->vm_flags & VM_SHARED)) {
-                       spin_lock(&mm->page_table_lock);
-                       prev->vm_end = new_addr + new_len;
-                       spin_unlock(&mm->page_table_lock);
-                       new_vma = prev;
-                       if (next != prev->vm_next)
-                               BUG();
-                       if (prev->vm_end == next->vm_start && can_vma_merge(next, prev->vm_flags)) {
-                               spin_lock(&mm->page_table_lock);
-                               prev->vm_end = next->vm_end;
-                               __vma_unlink(mm, next, prev);
-                               spin_unlock(&mm->page_table_lock);
-
-                               mm->map_count--;
-                               kmem_cache_free(vm_area_cachep, next);
-                       }
-               } else if (next->vm_start == new_addr + new_len &&
-                          can_vma_merge(next, vma->vm_flags) && !vma->vm_file && !(vma->vm_flags & VM_SHARED)) {
-                       spin_lock(&mm->page_table_lock);
-                       next->vm_start = new_addr;
-                       spin_unlock(&mm->page_table_lock);
-                       new_vma = next;
-               }
-       } else {
-               prev = find_vma(mm, new_addr-1);
-               if (prev && prev->vm_end == new_addr &&
-                   can_vma_merge(prev, vma->vm_flags) && !vma->vm_file && !(vma->vm_flags & VM_SHARED)) {
-                       spin_lock(&mm->page_table_lock);
-                       prev->vm_end = new_addr + new_len;
-                       spin_unlock(&mm->page_table_lock);
-                       new_vma = prev;
-               }
-       }
-
-       allocated_vma = 0;
-       if (!new_vma) {
-               new_vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
-               if (!new_vma)
-                       goto out;
-               allocated_vma = 1;
-       }
-
-       if (!move_page_tables(current->mm, new_addr, addr, old_len)) {
-               if (allocated_vma) {
-                       *new_vma = *vma;
-                       new_vma->vm_start = new_addr;
-                       new_vma->vm_end = new_addr+new_len;
-                       new_vma->vm_pgoff += (addr - vma->vm_start) >> PAGE_SHIFT;
-                       new_vma->vm_raend = 0;
-                       if (new_vma->vm_file)
-                               get_file(new_vma->vm_file);
-                       if (new_vma->vm_ops && new_vma->vm_ops->open)
-                               new_vma->vm_ops->open(new_vma);
-                       insert_vm_struct(current->mm, new_vma);
-               }
-               do_munmap(current->mm, addr, old_len);
-               current->mm->total_vm += new_len >> PAGE_SHIFT;
-               if (new_vma->vm_flags & VM_LOCKED) {
-                       current->mm->locked_vm += new_len >> PAGE_SHIFT;
-                       make_pages_present(new_vma->vm_start,
-                                          new_vma->vm_end);
-               }
-               return new_addr;
-       }
-       if (allocated_vma)
-               kmem_cache_free(vm_area_cachep, new_vma);
- out:
-       return -ENOMEM;
-}
-
-/*
- * Expand (or shrink) an existing mapping, potentially moving it at the
- * same time (controlled by the MREMAP_MAYMOVE flag and available VM space)
- *
- * MREMAP_FIXED option added 5-Dec-1999 by Benjamin LaHaise
- * This option implies MREMAP_MAYMOVE.
- */
-unsigned long do_mremap(unsigned long addr,
-       unsigned long old_len, unsigned long new_len,
-       unsigned long flags, unsigned long new_addr)
-{
-       struct vm_area_struct *vma;
-       unsigned long ret = -EINVAL;
-
-       if (flags & ~(MREMAP_FIXED | MREMAP_MAYMOVE))
-               goto out;
-
-       if (addr & ~PAGE_MASK)
-               goto out;
-
-       old_len = PAGE_ALIGN(old_len);
-       new_len = PAGE_ALIGN(new_len);
-
-       /* new_addr is only valid if MREMAP_FIXED is specified */
-       if (flags & MREMAP_FIXED) {
-               if (new_addr & ~PAGE_MASK)
-                       goto out;
-               if (!(flags & MREMAP_MAYMOVE))
-                       goto out;
-
-               if (new_len > TASK_SIZE || new_addr > TASK_SIZE - new_len)
-                       goto out;
-
-               /* Check if the location we're moving into overlaps the
-                * old location at all, and fail if it does.
-                */
-               if ((new_addr <= addr) && (new_addr+new_len) > addr)
-                       goto out;
-
-               if ((addr <= new_addr) && (addr+old_len) > new_addr)
-                       goto out;
-
-               do_munmap(current->mm, new_addr, new_len);
-       }
-
-       /*
-        * Always allow a shrinking remap: that just unmaps
-        * the unnecessary pages..
-        */
-       ret = addr;
-       if (old_len >= new_len) {
-               do_munmap(current->mm, addr+new_len, old_len - new_len);
-               if (!(flags & MREMAP_FIXED) || (new_addr == addr))
-                       goto out;
-       }
-
-       /*
-        * Ok, we need to grow..  or relocate.
-        */
-       ret = -EFAULT;
-       vma = find_vma(current->mm, addr);
-       if (!vma || vma->vm_start > addr)
-               goto out;
-       /* We can't remap across vm area boundaries */
-       if (old_len > vma->vm_end - addr)
-               goto out;
-       if (vma->vm_flags & VM_DONTEXPAND) {
-               if (new_len > old_len)
-                       goto out;
-       }
-       if (vma->vm_flags & VM_LOCKED) {
-               unsigned long locked = current->mm->locked_vm << PAGE_SHIFT;
-               locked += new_len - old_len;
-               ret = -EAGAIN;
-               if (locked > current->rlim[RLIMIT_MEMLOCK].rlim_cur)
-                       goto out;
-       }
-       ret = -ENOMEM;
-       if ((current->mm->total_vm << PAGE_SHIFT) + (new_len - old_len)
-           > current->rlim[RLIMIT_AS].rlim_cur)
-               goto out;
-       /* Private writable mapping? Check memory availability.. */
-       if ((vma->vm_flags & (VM_SHARED | VM_WRITE)) == VM_WRITE &&
-           !(flags & MAP_NORESERVE)                             &&
-           !vm_enough_memory((new_len - old_len) >> PAGE_SHIFT))
-               goto out;
-
-#if defined(CONFIG_XENO_PRIV)
-       /* mremap() unsupported for I/O mappings in Xenolinux. */
-       ret = -EINVAL;
-       if (vma->vm_flags & VM_IO)
-               goto out;
-#endif
-
-       /* old_len exactly to the end of the area..
-        * And we're not relocating the area.
-        */
-       if (old_len == vma->vm_end - addr &&
-           !((flags & MREMAP_FIXED) && (addr != new_addr)) &&
-           (old_len != new_len || !(flags & MREMAP_MAYMOVE))) {
-               unsigned long max_addr = TASK_SIZE;
-               if (vma->vm_next)
-                       max_addr = vma->vm_next->vm_start;
-               /* can we just expand the current mapping? */
-               if (max_addr - addr >= new_len) {
-                       int pages = (new_len - old_len) >> PAGE_SHIFT;
-                       spin_lock(&vma->vm_mm->page_table_lock);
-                       vma->vm_end = addr + new_len;
-                       spin_unlock(&vma->vm_mm->page_table_lock);
-                       current->mm->total_vm += pages;
-                       if (vma->vm_flags & VM_LOCKED) {
-                               current->mm->locked_vm += pages;
-                               make_pages_present(addr + old_len,
-                                                  addr + new_len);
-                       }
-                       ret = addr;
-                       goto out;
-               }
-       }
-
-       /*
-        * We weren't able to just expand or shrink the area,
-        * we need to create a new one and move it..
-        */
-       ret = -ENOMEM;
-       if (flags & MREMAP_MAYMOVE) {
-               if (!(flags & MREMAP_FIXED)) {
-                       unsigned long map_flags = 0;
-                       if (vma->vm_flags & VM_SHARED)
-                               map_flags |= MAP_SHARED;
-
-                       new_addr = get_unmapped_area(vma->vm_file, 0, new_len, vma->vm_pgoff, map_flags);
-                       ret = new_addr;
-                       if (new_addr & ~PAGE_MASK)
-                               goto out;
-               }
-               ret = move_vma(vma, addr, old_len, new_len, new_addr);
-       }
-out:
-       return ret;
-}
-
-asmlinkage unsigned long sys_mremap(unsigned long addr,
-       unsigned long old_len, unsigned long new_len,
-       unsigned long flags, unsigned long new_addr)
-{
-       unsigned long ret;
-
-       down_write(&current->mm->mmap_sem);
-       ret = do_mremap(addr, old_len, new_len, flags, new_addr);
-       up_write(&current->mm->mmap_sem);
-       return ret;
-}
diff --git a/xenolinux-2.4.21-sparse/mm/swapfile.c b/xenolinux-2.4.21-sparse/mm/swapfile.c
deleted file mode 100644 (file)
index 08e10b2..0000000
+++ /dev/null
@@ -1,1254 +0,0 @@
-/*
- *  linux/mm/swapfile.c
- *
- *  Copyright (C) 1991, 1992, 1993, 1994  Linus Torvalds
- *  Swap reorganised 29.12.95, Stephen Tweedie
- */
-
-#include <linux/slab.h>
-#include <linux/smp_lock.h>
-#include <linux/kernel_stat.h>
-#include <linux/swap.h>
-#include <linux/swapctl.h>
-#include <linux/blkdev.h> /* for blk_size */
-#include <linux/vmalloc.h>
-#include <linux/pagemap.h>
-#include <linux/shm.h>
-
-#include <asm/pgtable.h>
-
-spinlock_t swaplock = SPIN_LOCK_UNLOCKED;
-unsigned int nr_swapfiles;
-int total_swap_pages;
-static int swap_overflow;
-
-static const char Bad_file[] = "Bad swap file entry ";
-static const char Unused_file[] = "Unused swap file entry ";
-static const char Bad_offset[] = "Bad swap offset entry ";
-static const char Unused_offset[] = "Unused swap offset entry ";
-
-struct swap_list_t swap_list = {-1, -1};
-
-struct swap_info_struct swap_info[MAX_SWAPFILES];
-
-#define SWAPFILE_CLUSTER 256
-
-static inline int scan_swap_map(struct swap_info_struct *si)
-{
-       unsigned long offset;
-       /* 
-        * We try to cluster swap pages by allocating them
-        * sequentially in swap.  Once we've allocated
-        * SWAPFILE_CLUSTER pages this way, however, we resort to
-        * first-free allocation, starting a new cluster.  This
-        * prevents us from scattering swap pages all over the entire
-        * swap partition, so that we reduce overall disk seek times
-        * between swap pages.  -- sct */
-       if (si->cluster_nr) {
-               while (si->cluster_next <= si->highest_bit) {
-                       offset = si->cluster_next++;
-                       if (si->swap_map[offset])
-                               continue;
-                       si->cluster_nr--;
-                       goto got_page;
-               }
-       }
-       si->cluster_nr = SWAPFILE_CLUSTER;
-
-       /* try to find an empty (even not aligned) cluster. */
-       offset = si->lowest_bit;
- check_next_cluster:
-       if (offset+SWAPFILE_CLUSTER-1 <= si->highest_bit)
-       {
-               int nr;
-               for (nr = offset; nr < offset+SWAPFILE_CLUSTER; nr++)
-                       if (si->swap_map[nr])
-                       {
-                               offset = nr+1;
-                               goto check_next_cluster;
-                       }
-               /* We found a completly empty cluster, so start
-                * using it.
-                */
-               goto got_page;
-       }
-       /* No luck, so now go finegrined as usual. -Andrea */
-       for (offset = si->lowest_bit; offset <= si->highest_bit ; offset++) {
-               if (si->swap_map[offset])
-                       continue;
-               si->lowest_bit = offset+1;
-       got_page:
-               if (offset == si->lowest_bit)
-                       si->lowest_bit++;
-               if (offset == si->highest_bit)
-                       si->highest_bit--;
-               if (si->lowest_bit > si->highest_bit) {
-                       si->lowest_bit = si->max;
-                       si->highest_bit = 0;
-               }
-               si->swap_map[offset] = 1;
-               nr_swap_pages--;
-               si->cluster_next = offset+1;
-               return offset;
-       }
-       si->lowest_bit = si->max;
-       si->highest_bit = 0;
-       return 0;
-}
-
-swp_entry_t get_swap_page(void)
-{
-       struct swap_info_struct * p;
-       unsigned long offset;
-       swp_entry_t entry;
-       int type, wrapped = 0;
-
-       entry.val = 0;  /* Out of memory */
-       swap_list_lock();
-       type = swap_list.next;
-       if (type < 0)
-               goto out;
-       if (nr_swap_pages <= 0)
-               goto out;
-
-       while (1) {
-               p = &swap_info[type];
-               if ((p->flags & SWP_WRITEOK) == SWP_WRITEOK) {
-                       swap_device_lock(p);
-                       offset = scan_swap_map(p);
-                       swap_device_unlock(p);
-                       if (offset) {
-                               entry = SWP_ENTRY(type,offset);
-                               type = swap_info[type].next;
-                               if (type < 0 ||
-                                       p->prio != swap_info[type].prio) {
-                                               swap_list.next = swap_list.head;
-                               } else {
-                                       swap_list.next = type;
-                               }
-                               goto out;
-                       }
-               }
-               type = p->next;
-               if (!wrapped) {
-                       if (type < 0 || p->prio != swap_info[type].prio) {
-                               type = swap_list.head;
-                               wrapped = 1;
-                       }
-               } else
-                       if (type < 0)
-                               goto out;       /* out of swap space */
-       }
-out:
-       swap_list_unlock();
-       return entry;
-}
-
-static struct swap_info_struct * swap_info_get(swp_entry_t entry)
-{
-       struct swap_info_struct * p;
-       unsigned long offset, type;
-
-       if (!entry.val)
-               goto out;
-       type = SWP_TYPE(entry);
-       if (type >= nr_swapfiles)
-               goto bad_nofile;
-       p = & swap_info[type];
-       if (!(p->flags & SWP_USED))
-               goto bad_device;
-       offset = SWP_OFFSET(entry);
-       if (offset >= p->max)
-               goto bad_offset;
-       if (!p->swap_map[offset])
-               goto bad_free;
-       swap_list_lock();
-       if (p->prio > swap_info[swap_list.next].prio)
-               swap_list.next = type;
-       swap_device_lock(p);
-       return p;
-
-bad_free:
-       printk(KERN_ERR "swap_free: %s%08lx\n", Unused_offset, entry.val);
-       goto out;
-bad_offset:
-       printk(KERN_ERR "swap_free: %s%08lx\n", Bad_offset, entry.val);
-       goto out;
-bad_device:
-       printk(KERN_ERR "swap_free: %s%08lx\n", Unused_file, entry.val);
-       goto out;
-bad_nofile:
-       printk(KERN_ERR "swap_free: %s%08lx\n", Bad_file, entry.val);
-out:
-       return NULL;
-}      
-
-static void swap_info_put(struct swap_info_struct * p)
-{
-       swap_device_unlock(p);
-       swap_list_unlock();
-}
-
-static int swap_entry_free(struct swap_info_struct *p, unsigned long offset)
-{
-       int count = p->swap_map[offset];
-
-       if (count < SWAP_MAP_MAX) {
-               count--;
-               p->swap_map[offset] = count;
-               if (!count) {
-                       if (offset < p->lowest_bit)
-                               p->lowest_bit = offset;
-                       if (offset > p->highest_bit)
-                               p->highest_bit = offset;
-                       nr_swap_pages++;
-               }
-       }
-       return count;
-}
-
-/*
- * Caller has made sure that the swapdevice corresponding to entry
- * is still around or has not been recycled.
- */
-void swap_free(swp_entry_t entry)
-{
-       struct swap_info_struct * p;
-
-       p = swap_info_get(entry);
-       if (p) {
-               swap_entry_free(p, SWP_OFFSET(entry));
-               swap_info_put(p);
-       }
-}
-
-/*
- * Check if we're the only user of a swap page,
- * when the page is locked.
- */
-static int exclusive_swap_page(struct page *page)
-{
-       int retval = 0;
-       struct swap_info_struct * p;
-       swp_entry_t entry;
-
-       entry.val = page->index;
-       p = swap_info_get(entry);
-       if (p) {
-               /* Is the only swap cache user the cache itself? */
-               if (p->swap_map[SWP_OFFSET(entry)] == 1) {
-                       /* Recheck the page count with the pagecache lock held.. */
-                       spin_lock(&pagecache_lock);
-                       if (page_count(page) - !!page->buffers == 2)
-                               retval = 1;
-                       spin_unlock(&pagecache_lock);
-               }
-               swap_info_put(p);
-       }
-       return retval;
-}
-
-/*
- * We can use this swap cache entry directly
- * if there are no other references to it.
- *
- * Here "exclusive_swap_page()" does the real
- * work, but we opportunistically check whether
- * we need to get all the locks first..
- */
-int can_share_swap_page(struct page *page)
-{
-       int retval = 0;
-
-       if (!PageLocked(page))
-               BUG();
-       switch (page_count(page)) {
-       case 3:
-               if (!page->buffers)
-                       break;
-               /* Fallthrough */
-       case 2:
-               if (!PageSwapCache(page))
-                       break;
-               retval = exclusive_swap_page(page);
-               break;
-       case 1:
-               if (PageReserved(page))
-                       break;
-               retval = 1;
-       }
-       return retval;
-}
-
-/*
- * Work out if there are any other processes sharing this
- * swap cache page. Free it if you can. Return success.
- */
-int remove_exclusive_swap_page(struct page *page)
-{
-       int retval;
-       struct swap_info_struct * p;
-       swp_entry_t entry;
-
-       if (!PageLocked(page))
-               BUG();
-       if (!PageSwapCache(page))
-               return 0;
-       if (page_count(page) - !!page->buffers != 2)    /* 2: us + cache */
-               return 0;
-
-       entry.val = page->index;
-       p = swap_info_get(entry);
-       if (!p)
-               return 0;
-
-       /* Is the only swap cache user the cache itself? */
-       retval = 0;
-       if (p->swap_map[SWP_OFFSET(entry)] == 1) {
-               /* Recheck the page count with the pagecache lock held.. */
-               spin_lock(&pagecache_lock);
-               if (page_count(page) - !!page->buffers == 2) {
-                       __delete_from_swap_cache(page);
-                       SetPageDirty(page);
-                       retval = 1;
-               }
-               spin_unlock(&pagecache_lock);
-       }
-       swap_info_put(p);
-
-       if (retval) {
-               block_flushpage(page, 0);
-               swap_free(entry);
-               page_cache_release(page);
-       }
-
-       return retval;
-}
-
-/*
- * Free the swap entry like above, but also try to
- * free the page cache entry if it is the last user.
- */
-void free_swap_and_cache(swp_entry_t entry)
-{
-       struct swap_info_struct * p;
-       struct page *page = NULL;
-
-       p = swap_info_get(entry);
-       if (p) {
-               if (swap_entry_free(p, SWP_OFFSET(entry)) == 1)
-                       page = find_trylock_page(&swapper_space, entry.val);
-               swap_info_put(p);
-       }
-       if (page) {
-               page_cache_get(page);
-               /* Only cache user (+us), or swap space full? Free it! */
-               if (page_count(page) - !!page->buffers == 2 || vm_swap_full()) {
-                       delete_from_swap_cache(page);
-                       SetPageDirty(page);
-               }
-               UnlockPage(page);
-               page_cache_release(page);
-       }
-}
-
-/*
- * The swap entry has been read in advance, and we return 1 to indicate
- * that the page has been used or is no longer needed.
- *
- * Always set the resulting pte to be nowrite (the same as COW pages
- * after one process has exited).  We don't know just how many PTEs will
- * share this swap entry, so be cautious and let do_wp_page work out
- * what to do if a write is requested later.
- */
-/* mmlist_lock and vma->vm_mm->page_table_lock are held */
-static inline void unuse_pte(struct vm_area_struct * vma, unsigned long address,
-       pte_t *dir, swp_entry_t entry, struct page* page)
-{
-       pte_t pte = *dir;
-
-       if (likely(pte_to_swp_entry(pte).val != entry.val))
-               return;
-       if (unlikely(pte_none(pte) || pte_present(pte)))
-               return;
-       get_page(page);
-       set_pte(dir, pte_mkold(mk_pte(page, vma->vm_page_prot)));
-       swap_free(entry);
-       ++vma->vm_mm->rss;
-}
-
-/* mmlist_lock and vma->vm_mm->page_table_lock are held */
-static inline void unuse_pmd(struct vm_area_struct * vma, pmd_t *dir,
-       unsigned long address, unsigned long size, unsigned long offset,
-       swp_entry_t entry, struct page* page)
-{
-       pte_t * pte;
-       unsigned long end;
-
-       if (pmd_none(*dir))
-               return;
-       if (pmd_bad(*dir)) {
-               pmd_ERROR(*dir);
-               pmd_clear(dir);
-               return;
-       }
-       pte = pte_offset(dir, address);
-       offset += address & PMD_MASK;
-       address &= ~PMD_MASK;
-       end = address + size;
-       if (end > PMD_SIZE)
-               end = PMD_SIZE;
-       do {
-               unuse_pte(vma, offset+address-vma->vm_start, pte, entry, page);
-               address += PAGE_SIZE;
-               pte++;
-       } while (address && (address < end));
-}
-
-/* mmlist_lock and vma->vm_mm->page_table_lock are held */
-static inline void unuse_pgd(struct vm_area_struct * vma, pgd_t *dir,
-       unsigned long address, unsigned long size,
-       swp_entry_t entry, struct page* page)
-{
-       pmd_t * pmd;
-       unsigned long offset, end;
-
-       if (pgd_none(*dir))
-               return;
-       if (pgd_bad(*dir)) {
-               pgd_ERROR(*dir);
-               pgd_clear(dir);
-               return;
-       }
-       pmd = pmd_offset(dir, address);
-       offset = address & PGDIR_MASK;
-       address &= ~PGDIR_MASK;
-       end = address + size;
-       if (end > PGDIR_SIZE)
-               end = PGDIR_SIZE;
-       if (address >= end)
-               BUG();
-       do {
-               unuse_pmd(vma, pmd, address, end - address, offset, entry,
-                         page);
-               address = (address + PMD_SIZE) & PMD_MASK;
-               pmd++;
-       } while (address && (address < end));
-}
-
-/* mmlist_lock and vma->vm_mm->page_table_lock are held */
-static void unuse_vma(struct vm_area_struct * vma, pgd_t *pgdir,
-                       swp_entry_t entry, struct page* page)
-{
-       unsigned long start = vma->vm_start, end = vma->vm_end;
-
-       if (start >= end)
-               BUG();
-       do {
-               unuse_pgd(vma, pgdir, start, end - start, entry, page);
-               start = (start + PGDIR_SIZE) & PGDIR_MASK;
-               pgdir++;
-       } while (start && (start < end));
-}
-
-static void unuse_process(struct mm_struct * mm,
-                       swp_entry_t entry, struct page* page)
-{
-       struct vm_area_struct* vma;
-
-       /*
-        * Go through process' page directory.
-        */
-       spin_lock(&mm->page_table_lock);
-       for (vma = mm->mmap; vma; vma = vma->vm_next) {
-               pgd_t * pgd = pgd_offset(mm, vma->vm_start);
-               unuse_vma(vma, pgd, entry, page);
-       }
-       XENO_flush_page_update_queue();
-       spin_unlock(&mm->page_table_lock);
-       return;
-}
-
-/*
- * Scan swap_map from current position to next entry still in use.
- * Recycle to start on reaching the end, returning 0 when empty.
- */
-static int find_next_to_unuse(struct swap_info_struct *si, int prev)
-{
-       int max = si->max;
-       int i = prev;
-       int count;
-
-       /*
-        * No need for swap_device_lock(si) here: we're just looking
-        * for whether an entry is in use, not modifying it; false
-        * hits are okay, and sys_swapoff() has already prevented new
-        * allocations from this area (while holding swap_list_lock()).
-        */
-       for (;;) {
-               if (++i >= max) {
-                       if (!prev) {
-                               i = 0;
-                               break;
-                       }
-                       /*
-                        * No entries in use at top of swap_map,
-                        * loop back to start and recheck there.
-                        */
-                       max = prev + 1;
-                       prev = 0;
-                       i = 1;
-               }
-               count = si->swap_map[i];
-               if (count && count != SWAP_MAP_BAD)
-                       break;
-       }
-       return i;
-}
-
-/*
- * We completely avoid races by reading each swap page in advance,
- * and then search for the process using it.  All the necessary
- * page table adjustments can then be made atomically.
- */
-static int try_to_unuse(unsigned int type)
-{
-       struct swap_info_struct * si = &swap_info[type];
-       struct mm_struct *start_mm;
-       unsigned short *swap_map;
-       unsigned short swcount;
-       struct page *page;
-       swp_entry_t entry;
-       int i = 0;
-       int retval = 0;
-       int reset_overflow = 0;
-
-       /*
-        * When searching mms for an entry, a good strategy is to
-        * start at the first mm we freed the previous entry from
-        * (though actually we don't notice whether we or coincidence
-        * freed the entry).  Initialize this start_mm with a hold.
-        *
-        * A simpler strategy would be to start at the last mm we
-        * freed the previous entry from; but that would take less
-        * advantage of mmlist ordering (now preserved by swap_out()),
-        * which clusters forked address spaces together, most recent
-        * child immediately after parent.  If we race with dup_mmap(),
-        * we very much want to resolve parent before child, otherwise
-        * we may miss some entries: using last mm would invert that.
-        */
-       start_mm = &init_mm;
-       atomic_inc(&init_mm.mm_users);
-
-       /*
-        * Keep on scanning until all entries have gone.  Usually,
-        * one pass through swap_map is enough, but not necessarily:
-        * mmput() removes mm from mmlist before exit_mmap() and its
-        * zap_page_range().  That's not too bad, those entries are
-        * on their way out, and handled faster there than here.
-        * do_munmap() behaves similarly, taking the range out of mm's
-        * vma list before zap_page_range().  But unfortunately, when
-        * unmapping a part of a vma, it takes the whole out first,
-        * then reinserts what's left after (might even reschedule if
-        * open() method called) - so swap entries may be invisible
-        * to swapoff for a while, then reappear - but that is rare.
-        */
-       while ((i = find_next_to_unuse(si, i))) {
-               /* 
-                * Get a page for the entry, using the existing swap
-                * cache page if there is one.  Otherwise, get a clean
-                * page and read the swap into it. 
-                */
-               swap_map = &si->swap_map[i];
-               entry = SWP_ENTRY(type, i);
-               page = read_swap_cache_async(entry);
-               if (!page) {
-                       /*
-                        * Either swap_duplicate() failed because entry
-                        * has been freed independently, and will not be
-                        * reused since sys_swapoff() already disabled
-                        * allocation from here, or alloc_page() failed.
-                        */
-                       if (!*swap_map)
-                               continue;
-                       retval = -ENOMEM;
-                       break;
-               }
-
-               /*
-                * Don't hold on to start_mm if it looks like exiting.
-                */
-               if (atomic_read(&start_mm->mm_users) == 1) {
-                       mmput(start_mm);
-                       start_mm = &init_mm;
-                       atomic_inc(&init_mm.mm_users);
-               }
-
-               /*
-                * Wait for and lock page.  When do_swap_page races with
-                * try_to_unuse, do_swap_page can handle the fault much
-                * faster than try_to_unuse can locate the entry.  This
-                * apparently redundant "wait_on_page" lets try_to_unuse
-                * defer to do_swap_page in such a case - in some tests,
-                * do_swap_page and try_to_unuse repeatedly compete.
-                */
-               wait_on_page(page);
-               lock_page(page);
-
-               /*
-                * Remove all references to entry, without blocking.
-                * Whenever we reach init_mm, there's no address space
-                * to search, but use it as a reminder to search shmem.
-                */
-               swcount = *swap_map;
-               if (swcount > 1) {
-                       flush_page_to_ram(page);
-                       if (start_mm == &init_mm)
-                               shmem_unuse(entry, page);
-                       else
-                               unuse_process(start_mm, entry, page);
-               }
-               if (*swap_map > 1) {
-                       int set_start_mm = (*swap_map >= swcount);
-                       struct list_head *p = &start_mm->mmlist;
-                       struct mm_struct *new_start_mm = start_mm;
-                       struct mm_struct *mm;
-
-                       spin_lock(&mmlist_lock);
-                       while (*swap_map > 1 &&
-                                       (p = p->next) != &start_mm->mmlist) {
-                               mm = list_entry(p, struct mm_struct, mmlist);
-                               swcount = *swap_map;
-                               if (mm == &init_mm) {
-                                       set_start_mm = 1;
-                                       shmem_unuse(entry, page);
-                               } else
-                                       unuse_process(mm, entry, page);
-                               if (set_start_mm && *swap_map < swcount) {
-                                       new_start_mm = mm;
-                                       set_start_mm = 0;
-                               }
-                       }
-                       atomic_inc(&new_start_mm->mm_users);
-                       spin_unlock(&mmlist_lock);
-                       mmput(start_mm);
-                       start_mm = new_start_mm;
-               }
-
-               /*
-                * How could swap count reach 0x7fff when the maximum
-                * pid is 0x7fff, and there's no way to repeat a swap
-                * page within an mm (except in shmem, where it's the
-                * shared object which takes the reference count)?
-                * We believe SWAP_MAP_MAX cannot occur in Linux 2.4.
-                *
-                * If that's wrong, then we should worry more about
-                * exit_mmap() and do_munmap() cases described above:
-                * we might be resetting SWAP_MAP_MAX too early here.
-                * We know "Undead"s can happen, they're okay, so don't
-                * report them; but do report if we reset SWAP_MAP_MAX.
-                */
-               if (*swap_map == SWAP_MAP_MAX) {
-                       swap_list_lock();
-                       swap_device_lock(si);
-                       nr_swap_pages++;
-                       *swap_map = 1;
-                       swap_device_unlock(si);
-                       swap_list_unlock();
-                       reset_overflow = 1;
-               }
-
-               /*
-                * If a reference remains (rare), we would like to leave
-                * the page in the swap cache; but try_to_swap_out could
-                * then re-duplicate the entry once we drop page lock,
-                * so we might loop indefinitely; also, that page could
-                * not be swapped out to other storage meanwhile.  So:
-                * delete from cache even if there's another reference,
-                * after ensuring that the data has been saved to disk -
-                * since if the reference remains (rarer), it will be
-                * read from disk into another page.  Splitting into two
-                * pages would be incorrect if swap supported "shared
-                * private" pages, but they are handled by tmpfs files.
-                * Note shmem_unuse already deleted its from swap cache.
-                */
-               if ((*swap_map > 1) && PageDirty(page) && PageSwapCache(page)) {
-                       rw_swap_page(WRITE, page);
-                       lock_page(page);
-               }
-               if (PageSwapCache(page))
-                       delete_from_swap_cache(page);
-
-               /*
-                * So we could skip searching mms once swap count went
-                * to 1, we did not mark any present ptes as dirty: must
-                * mark page dirty so try_to_swap_out will preserve it.
-                */
-               SetPageDirty(page);
-               UnlockPage(page);
-               page_cache_release(page);
-
-               /*
-                * Make sure that we aren't completely killing
-                * interactive performance.  Interruptible check on
-                * signal_pending() would be nice, but changes the spec?
-                */
-               if (current->need_resched)
-                       schedule();
-       }
-
-       mmput(start_mm);
-       if (reset_overflow) {
-               printk(KERN_WARNING "swapoff: cleared swap entry overflow\n");
-               swap_overflow = 0;
-       }
-       return retval;
-}
-
-asmlinkage long sys_swapoff(const char * specialfile)
-{
-       struct swap_info_struct * p = NULL;
-       unsigned short *swap_map;
-       struct nameidata nd;
-       int i, type, prev;
-       int err;
-       
-       if (!capable(CAP_SYS_ADMIN))
-               return -EPERM;
-
-       err = user_path_walk(specialfile, &nd);
-       if (err)
-               goto out;
-
-       lock_kernel();
-       prev = -1;
-       swap_list_lock();
-       for (type = swap_list.head; type >= 0; type = swap_info[type].next) {
-               p = swap_info + type;
-               if ((p->flags & SWP_WRITEOK) == SWP_WRITEOK) {
-                       if (p->swap_file == nd.dentry)
-                         break;
-               }
-               prev = type;
-       }
-       err = -EINVAL;
-       if (type < 0) {
-               swap_list_unlock();
-               goto out_dput;
-       }
-
-       if (prev < 0) {
-               swap_list.head = p->next;
-       } else {
-               swap_info[prev].next = p->next;
-       }
-       if (type == swap_list.next) {
-               /* just pick something that's safe... */
-               swap_list.next = swap_list.head;
-       }
-       nr_swap_pages -= p->pages;
-       total_swap_pages -= p->pages;
-       p->flags = SWP_USED;
-       swap_list_unlock();
-       unlock_kernel();
-       err = try_to_unuse(type);
-       lock_kernel();
-       if (err) {
-               /* re-insert swap space back into swap_list */
-               swap_list_lock();
-               for (prev = -1, i = swap_list.head; i >= 0; prev = i, i = swap_info[i].next)
-                       if (p->prio >= swap_info[i].prio)
-                               break;
-               p->next = i;
-               if (prev < 0)
-                       swap_list.head = swap_list.next = p - swap_info;
-               else
-                       swap_info[prev].next = p - swap_info;
-               nr_swap_pages += p->pages;
-               total_swap_pages += p->pages;
-               p->flags = SWP_WRITEOK;
-               swap_list_unlock();
-               goto out_dput;
-       }
-       if (p->swap_device)
-               blkdev_put(p->swap_file->d_inode->i_bdev, BDEV_SWAP);
-       path_release(&nd);
-
-       swap_list_lock();
-       swap_device_lock(p);
-       nd.mnt = p->swap_vfsmnt;
-       nd.dentry = p->swap_file;
-       p->swap_vfsmnt = NULL;
-       p->swap_file = NULL;
-       p->swap_device = 0;
-       p->max = 0;
-       swap_map = p->swap_map;
-       p->swap_map = NULL;
-       p->flags = 0;
-       swap_device_unlock(p);
-       swap_list_unlock();
-       vfree(swap_map);
-       err = 0;
-
-out_dput:
-       unlock_kernel();
-       path_release(&nd);
-out:
-       return err;
-}
-
-int get_swaparea_info(char *buf)
-{
-       char * page = (char *) __get_free_page(GFP_KERNEL);
-       struct swap_info_struct *ptr = swap_info;
-       int i, j, len = 0, usedswap;
-
-       if (!page)
-               return -ENOMEM;
-
-       len += sprintf(buf, "Filename\t\t\tType\t\tSize\tUsed\tPriority\n");
-       for (i = 0 ; i < nr_swapfiles ; i++, ptr++) {
-               if ((ptr->flags & SWP_USED) && ptr->swap_map) {
-                       char * path = d_path(ptr->swap_file, ptr->swap_vfsmnt,
-                                               page, PAGE_SIZE);
-
-                       len += sprintf(buf + len, "%-31s ", path);
-
-                       if (!ptr->swap_device)
-                               len += sprintf(buf + len, "file\t\t");
-                       else
-                               len += sprintf(buf + len, "partition\t");
-
-                       usedswap = 0;
-                       for (j = 0; j < ptr->max; ++j)
-                               switch (ptr->swap_map[j]) {
-                                       case SWAP_MAP_BAD:
-                                       case 0:
-                                               continue;
-                                       default:
-                                               usedswap++;
-                               }
-                       len += sprintf(buf + len, "%d\t%d\t%d\n", ptr->pages << (PAGE_SHIFT - 10), 
-                               usedswap << (PAGE_SHIFT - 10), ptr->prio);
-               }
-       }
-       free_page((unsigned long) page);
-       return len;
-}
-
-int is_swap_partition(kdev_t dev) {
-       struct swap_info_struct *ptr = swap_info;
-       int i;
-
-       for (i = 0 ; i < nr_swapfiles ; i++, ptr++) {
-               if (ptr->flags & SWP_USED)
-                       if (ptr->swap_device == dev)
-                               return 1;
-       }
-       return 0;
-}
-
-/*
- * Written 01/25/92 by Simmule Turner, heavily changed by Linus.
- *
- * The swapon system call
- */
-asmlinkage long sys_swapon(const char * specialfile, int swap_flags)
-{
-       struct swap_info_struct * p;
-       struct nameidata nd;
-       struct inode * swap_inode;
-       unsigned int type;
-       int i, j, prev;
-       int error;
-       static int least_priority = 0;
-       union swap_header *swap_header = 0;
-       int swap_header_version;
-       int nr_good_pages = 0;
-       unsigned long maxpages = 1;
-       int swapfilesize;
-       struct block_device *bdev = NULL;
-       unsigned short *swap_map;
-       
-       if (!capable(CAP_SYS_ADMIN))
-               return -EPERM;
-       lock_kernel();
-       swap_list_lock();
-       p = swap_info;
-       for (type = 0 ; type < nr_swapfiles ; type++,p++)
-               if (!(p->flags & SWP_USED))
-                       break;
-       error = -EPERM;
-       if (type >= MAX_SWAPFILES) {
-               swap_list_unlock();
-               goto out;
-       }
-       if (type >= nr_swapfiles)
-               nr_swapfiles = type+1;
-       p->flags = SWP_USED;
-       p->swap_file = NULL;
-       p->swap_vfsmnt = NULL;
-       p->swap_device = 0;
-       p->swap_map = NULL;
-       p->lowest_bit = 0;
-       p->highest_bit = 0;
-       p->cluster_nr = 0;
-       p->sdev_lock = SPIN_LOCK_UNLOCKED;
-       p->next = -1;
-       if (swap_flags & SWAP_FLAG_PREFER) {
-               p->prio =
-                 (swap_flags & SWAP_FLAG_PRIO_MASK)>>SWAP_FLAG_PRIO_SHIFT;
-       } else {
-               p->prio = --least_priority;
-       }
-       swap_list_unlock();
-       error = user_path_walk(specialfile, &nd);
-       if (error)
-               goto bad_swap_2;
-
-       p->swap_file = nd.dentry;
-       p->swap_vfsmnt = nd.mnt;
-       swap_inode = nd.dentry->d_inode;
-       error = -EINVAL;
-
-       if (S_ISBLK(swap_inode->i_mode)) {
-               kdev_t dev = swap_inode->i_rdev;
-               struct block_device_operations *bdops;
-               devfs_handle_t de;
-
-               if (is_mounted(dev)) {
-                       error = -EBUSY;
-                       goto bad_swap_2;
-               }
-
-               p->swap_device = dev;
-               set_blocksize(dev, PAGE_SIZE);
-               
-               bd_acquire(swap_inode);
-               bdev = swap_inode->i_bdev;
-               de = devfs_get_handle_from_inode(swap_inode);
-               bdops = devfs_get_ops(de);  /*  Increments module use count  */
-               if (bdops) bdev->bd_op = bdops;
-
-               error = blkdev_get(bdev, FMODE_READ|FMODE_WRITE, 0, BDEV_SWAP);
-               devfs_put_ops(de);/*Decrement module use count now we're safe*/
-               if (error)
-                       goto bad_swap_2;
-               set_blocksize(dev, PAGE_SIZE);
-               error = -ENODEV;
-               if (!dev || (blk_size[MAJOR(dev)] &&
-                    !blk_size[MAJOR(dev)][MINOR(dev)]))
-                       goto bad_swap;
-               swapfilesize = 0;
-               if (blk_size[MAJOR(dev)])
-                       swapfilesize = blk_size[MAJOR(dev)][MINOR(dev)]
-                               >> (PAGE_SHIFT - 10);
-       } else if (S_ISREG(swap_inode->i_mode))
-               swapfilesize = swap_inode->i_size >> PAGE_SHIFT;
-       else
-               goto bad_swap;
-
-       error = -EBUSY;
-       for (i = 0 ; i < nr_swapfiles ; i++) {
-               struct swap_info_struct *q = &swap_info[i];
-               if (i == type || !q->swap_file)
-                       continue;
-               if (swap_inode->i_mapping == q->swap_file->d_inode->i_mapping)
-                       goto bad_swap;
-       }
-
-       swap_header = (void *) __get_free_page(GFP_USER);
-       if (!swap_header) {
-               printk("Unable to start swapping: out of memory :-)\n");
-               error = -ENOMEM;
-               goto bad_swap;
-       }
-
-       lock_page(virt_to_page(swap_header));
-       rw_swap_page_nolock(READ, SWP_ENTRY(type,0), (char *) swap_header);
-
-       if (!memcmp("SWAP-SPACE",swap_header->magic.magic,10))
-               swap_header_version = 1;
-       else if (!memcmp("SWAPSPACE2",swap_header->magic.magic,10))
-               swap_header_version = 2;
-       else {
-               printk("Unable to find swap-space signature\n");
-               error = -EINVAL;
-               goto bad_swap;
-       }
-       
-       switch (swap_header_version) {
-       case 1:
-               memset(((char *) swap_header)+PAGE_SIZE-10,0,10);
-               j = 0;
-               p->lowest_bit = 0;
-               p->highest_bit = 0;
-               for (i = 1 ; i < 8*PAGE_SIZE ; i++) {
-                       if (test_bit(i,(char *) swap_header)) {
-                               if (!p->lowest_bit)
-                                       p->lowest_bit = i;
-                               p->highest_bit = i;
-                               maxpages = i+1;
-                               j++;
-                       }
-               }
-               nr_good_pages = j;
-               p->swap_map = vmalloc(maxpages * sizeof(short));
-               if (!p->swap_map) {
-                       error = -ENOMEM;                
-                       goto bad_swap;
-               }
-               for (i = 1 ; i < maxpages ; i++) {
-                       if (test_bit(i,(char *) swap_header))
-                               p->swap_map[i] = 0;
-                       else
-                               p->swap_map[i] = SWAP_MAP_BAD;
-               }
-               break;
-
-       case 2:
-               /* Check the swap header's sub-version and the size of
-                   the swap file and bad block lists */
-               if (swap_header->info.version != 1) {
-                       printk(KERN_WARNING
-                              "Unable to handle swap header version %d\n",
-                              swap_header->info.version);
-                       error = -EINVAL;
-                       goto bad_swap;
-               }
-
-               p->lowest_bit  = 1;
-               maxpages = SWP_OFFSET(SWP_ENTRY(0,~0UL)) - 1;
-               if (maxpages > swap_header->info.last_page)
-                       maxpages = swap_header->info.last_page;
-               p->highest_bit = maxpages - 1;
-
-               error = -EINVAL;
-               if (swap_header->info.nr_badpages > MAX_SWAP_BADPAGES)
-                       goto bad_swap;
-               
-               /* OK, set up the swap map and apply the bad block list */
-               if (!(p->swap_map = vmalloc(maxpages * sizeof(short)))) {
-                       error = -ENOMEM;
-                       goto bad_swap;
-               }
-
-               error = 0;
-               memset(p->swap_map, 0, maxpages * sizeof(short));
-               for (i=0; i<swap_header->info.nr_badpages; i++) {
-                       int page = swap_header->info.badpages[i];
-                       if (page <= 0 || page >= swap_header->info.last_page)
-                               error = -EINVAL;
-                       else
-                               p->swap_map[page] = SWAP_MAP_BAD;
-               }
-               nr_good_pages = swap_header->info.last_page -
-                               swap_header->info.nr_badpages -
-                               1 /* header page */;
-               if (error) 
-                       goto bad_swap;
-       }
-       
-       if (swapfilesize && maxpages > swapfilesize) {
-               printk(KERN_WARNING
-                      "Swap area shorter than signature indicates\n");
-               error = -EINVAL;
-               goto bad_swap;
-       }
-       if (!nr_good_pages) {
-               printk(KERN_WARNING "Empty swap-file\n");
-               error = -EINVAL;
-               goto bad_swap;
-       }
-       p->swap_map[0] = SWAP_MAP_BAD;
-       swap_list_lock();
-       swap_device_lock(p);
-       p->max = maxpages;
-       p->flags = SWP_WRITEOK;
-       p->pages = nr_good_pages;
-       nr_swap_pages += nr_good_pages;
-       total_swap_pages += nr_good_pages;
-       printk(KERN_INFO "Adding Swap: %dk swap-space (priority %d)\n",
-              nr_good_pages<<(PAGE_SHIFT-10), p->prio);
-
-       /* insert swap space into swap_list: */
-       prev = -1;
-       for (i = swap_list.head; i >= 0; i = swap_info[i].next) {
-               if (p->prio >= swap_info[i].prio) {
-                       break;
-               }
-               prev = i;
-       }
-       p->next = i;
-       if (prev < 0) {
-               swap_list.head = swap_list.next = p - swap_info;
-       } else {
-               swap_info[prev].next = p - swap_info;
-       }
-       swap_device_unlock(p);
-       swap_list_unlock();
-       error = 0;
-       goto out;
-bad_swap:
-       if (bdev)
-               blkdev_put(bdev, BDEV_SWAP);
-bad_swap_2:
-       swap_list_lock();
-       swap_map = p->swap_map;
-       nd.mnt = p->swap_vfsmnt;
-       nd.dentry = p->swap_file;
-       p->swap_device = 0;
-       p->swap_file = NULL;
-       p->swap_vfsmnt = NULL;
-       p->swap_map = NULL;
-       p->flags = 0;
-       if (!(swap_flags & SWAP_FLAG_PREFER))
-               ++least_priority;
-       swap_list_unlock();
-       if (swap_map)
-               vfree(swap_map);
-       path_release(&nd);
-out:
-       if (swap_header)
-               free_page((long) swap_header);
-       unlock_kernel();
-       return error;
-}
-
-void si_swapinfo(struct sysinfo *val)
-{
-       unsigned int i;
-       unsigned long nr_to_be_unused = 0;
-
-       swap_list_lock();
-       for (i = 0; i < nr_swapfiles; i++) {
-               unsigned int j;
-               if (swap_info[i].flags != SWP_USED)
-                       continue;
-               for (j = 0; j < swap_info[i].max; ++j) {
-                       switch (swap_info[i].swap_map[j]) {
-                               case 0:
-                               case SWAP_MAP_BAD:
-                                       continue;
-                               default:
-                                       nr_to_be_unused++;
-                       }
-               }
-       }
-       val->freeswap = nr_swap_pages + nr_to_be_unused;
-       val->totalswap = total_swap_pages + nr_to_be_unused;
-       swap_list_unlock();
-}
-
-/*
- * Verify that a swap entry is valid and increment its swap map count.
- *
- * Note: if swap_map[] reaches SWAP_MAP_MAX the entries are treated as
- * "permanent", but will be reclaimed by the next swapoff.
- */
-int swap_duplicate(swp_entry_t entry)
-{
-       struct swap_info_struct * p;
-       unsigned long offset, type;
-       int result = 0;
-
-       type = SWP_TYPE(entry);
-       if (type >= nr_swapfiles)
-               goto bad_file;
-       p = type + swap_info;
-       offset = SWP_OFFSET(entry);
-
-       swap_device_lock(p);
-       if (offset < p->max && p->swap_map[offset]) {
-               if (p->swap_map[offset] < SWAP_MAP_MAX - 1) {
-                       p->swap_map[offset]++;
-                       result = 1;
-               } else if (p->swap_map[offset] <= SWAP_MAP_MAX) {
-                       if (swap_overflow++ < 5)
-                               printk(KERN_WARNING "swap_dup: swap entry overflow\n");
-                       p->swap_map[offset] = SWAP_MAP_MAX;
-                       result = 1;
-               }
-       }
-       swap_device_unlock(p);
-out:
-       return result;
-
-bad_file:
-       printk(KERN_ERR "swap_dup: %s%08lx\n", Bad_file, entry.val);
-       goto out;
-}
-
-/*
- * Prior swap_duplicate protects against swap device deletion.
- */
-void get_swaphandle_info(swp_entry_t entry, unsigned long *offset, 
-                       kdev_t *dev, struct inode **swapf)
-{
-       unsigned long type;
-       struct swap_info_struct *p;
-
-       type = SWP_TYPE(entry);
-       if (type >= nr_swapfiles) {
-               printk(KERN_ERR "rw_swap_page: %s%08lx\n", Bad_file, entry.val);
-               return;
-       }
-
-       p = &swap_info[type];
-       *offset = SWP_OFFSET(entry);
-       if (*offset >= p->max && *offset != 0) {
-               printk(KERN_ERR "rw_swap_page: %s%08lx\n", Bad_offset, entry.val);
-               return;
-       }
-       if (p->swap_map && !p->swap_map[*offset]) {
-               printk(KERN_ERR "rw_swap_page: %s%08lx\n", Unused_offset, entry.val);
-               return;
-       }
-       if (!(p->flags & SWP_USED)) {
-               printk(KERN_ERR "rw_swap_page: %s%08lx\n", Unused_file, entry.val);
-               return;
-       }
-
-       if (p->swap_device) {
-               *dev = p->swap_device;
-       } else if (p->swap_file) {
-               *swapf = p->swap_file->d_inode;
-       } else {
-               printk(KERN_ERR "rw_swap_page: no swap file or device\n");
-       }
-       return;
-}
-
-/*
- * swap_device_lock prevents swap_map being freed. Don't grab an extra
- * reference on the swaphandle, it doesn't matter if it becomes unused.
- */
-int valid_swaphandles(swp_entry_t entry, unsigned long *offset)
-{
-       int ret = 0, i = 1 << page_cluster;
-       unsigned long toff;
-       struct swap_info_struct *swapdev = SWP_TYPE(entry) + swap_info;
-
-       if (!page_cluster)      /* no readahead */
-               return 0;
-       toff = (SWP_OFFSET(entry) >> page_cluster) << page_cluster;
-       if (!toff)              /* first page is swap header */
-               toff++, i--;
-       *offset = toff;
-
-       swap_device_lock(swapdev);
-       do {
-               /* Don't read-ahead past the end of the swap area */
-               if (toff >= swapdev->max)
-                       break;
-               /* Don't read in free or bad pages */
-               if (!swapdev->swap_map[toff])
-                       break;
-               if (swapdev->swap_map[toff] == SWAP_MAP_BAD)
-                       break;
-               toff++;
-               ret++;
-       } while (--i);
-       swap_device_unlock(swapdev);
-       return ret;
-}
diff --git a/xenolinux-2.4.21-sparse/mm/vmalloc.c b/xenolinux-2.4.21-sparse/mm/vmalloc.c
deleted file mode 100644 (file)
index 015cad0..0000000
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- *  linux/mm/vmalloc.c
- *
- *  Copyright (C) 1993  Linus Torvalds
- *  Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
- *  SMP-safe vmalloc/vfree/ioremap, Tigran Aivazian <tigran@veritas.com>, May 2000
- */
-
-#include <linux/config.h>
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
-#include <linux/spinlock.h>
-#include <linux/highmem.h>
-#include <linux/smp_lock.h>
-
-#include <asm/uaccess.h>
-#include <asm/pgalloc.h>
-
-rwlock_t vmlist_lock = RW_LOCK_UNLOCKED;
-struct vm_struct * vmlist;
-
-static inline void free_area_pte(pmd_t * pmd, unsigned long address, unsigned long size)
-{
-       pte_t * pte;
-       unsigned long end;
-
-       if (pmd_none(*pmd))
-               return;
-       if (pmd_bad(*pmd)) {
-               pmd_ERROR(*pmd);
-               pmd_clear(pmd);
-               return;
-       }
-       pte = pte_offset(pmd, address);
-       address &= ~PMD_MASK;
-       end = address + size;
-       if (end > PMD_SIZE)
-               end = PMD_SIZE;
-       do {
-               pte_t page;
-               page = ptep_get_and_clear(pte);
-               address += PAGE_SIZE;
-               pte++;
-               if (pte_none(page))
-                       continue;
-               if (pte_present(page)) {
-                       struct page *ptpage = pte_page(page);
-                       if (VALID_PAGE(ptpage) && (!PageReserved(ptpage)))
-                               __free_page(ptpage);
-                       continue;
-               }
-               printk(KERN_CRIT "Whee.. Swapped out page in kernel page table\n");
-       } while (address < end);
-}
-
-static inline void free_area_pmd(pgd_t * dir, unsigned long address, unsigned long size)
-{
-       pmd_t * pmd;
-       unsigned long end;
-
-       if (pgd_none(*dir))
-               return;
-       if (pgd_bad(*dir)) {
-               pgd_ERROR(*dir);
-               pgd_clear(dir);
-               return;
-       }
-       pmd = pmd_offset(dir, address);
-       address &= ~PGDIR_MASK;
-       end = address + size;
-       if (end > PGDIR_SIZE)
-               end = PGDIR_SIZE;
-       do {
-               free_area_pte(pmd, address, end - address);
-               address = (address + PMD_SIZE) & PMD_MASK;
-               pmd++;
-       } while (address < end);
-}
-
-void vmfree_area_pages(unsigned long address, unsigned long size)
-{
-       pgd_t * dir;
-       unsigned long end = address + size;
-
-       dir = pgd_offset_k(address);
-       flush_cache_all();
-       do {
-               free_area_pmd(dir, address, end - address);
-               address = (address + PGDIR_SIZE) & PGDIR_MASK;
-               dir++;
-       } while (address && (address < end));
-       flush_tlb_all();
-}
-
-static inline int alloc_area_pte (pte_t * pte, unsigned long address,
-                       unsigned long size, int gfp_mask, pgprot_t prot)
-{
-       unsigned long end;
-
-       address &= ~PMD_MASK;
-       end = address + size;
-       if (end > PMD_SIZE)
-               end = PMD_SIZE;
-       do {
-               struct page * page;
-               spin_unlock(&init_mm.page_table_lock);
-               page = alloc_page(gfp_mask);
-               spin_lock(&init_mm.page_table_lock);
-               if (!pte_none(*pte))
-                       printk(KERN_ERR "alloc_area_pte: page already exists\n");
-               if (!page)
-                       return -ENOMEM;
-               set_pte(pte, mk_pte(page, prot));
-               address += PAGE_SIZE;
-               pte++;
-       } while (address < end);
-       return 0;
-}
-
-static inline int alloc_area_pmd(pmd_t * pmd, unsigned long address, unsigned long size, int gfp_mask, pgprot_t prot)
-{
-       unsigned long end;
-
-       address &= ~PGDIR_MASK;
-       end = address + size;
-       if (end > PGDIR_SIZE)
-               end = PGDIR_SIZE;
-       do {
-               pte_t * pte = pte_alloc(&init_mm, pmd, address);
-               if (!pte)
-                       return -ENOMEM;
-               if (alloc_area_pte(pte, address, end - address, gfp_mask, prot))
-                       return -ENOMEM;
-               address = (address + PMD_SIZE) & PMD_MASK;
-               pmd++;
-       } while (address < end);
-       return 0;
-}
-
-inline int vmalloc_area_pages (unsigned long address, unsigned long size,
-                               int gfp_mask, pgprot_t prot)
-{
-       pgd_t * dir;
-       unsigned long end = address + size;
-       int ret;
-
-       dir = pgd_offset_k(address);
-       spin_lock(&init_mm.page_table_lock);
-       do {
-               pmd_t *pmd;
-               
-               pmd = pmd_alloc(&init_mm, dir, address);
-               ret = -ENOMEM;
-               if (!pmd)
-                       break;
-
-               ret = -ENOMEM;
-               if (alloc_area_pmd(pmd, address, end - address, gfp_mask, prot))
-                       break;
-
-               address = (address + PGDIR_SIZE) & PGDIR_MASK;
-               dir++;
-
-               ret = 0;
-       } while (address && (address < end));
-       spin_unlock(&init_mm.page_table_lock);
-       flush_cache_all();
-       return ret;
-}
-
-struct vm_struct * get_vm_area(unsigned long size, unsigned long flags)
-{
-       unsigned long addr, next;
-       struct vm_struct **p, *tmp, *area;
-
-       area = (struct vm_struct *) kmalloc(sizeof(*area), GFP_KERNEL);
-       if (!area)
-               return NULL;
-
-       size += PAGE_SIZE;
-       if (!size) {
-               kfree (area);
-               return NULL;
-       }
-
-       addr = VMALLOC_START;
-       write_lock(&vmlist_lock);
-       for (p = &vmlist; (tmp = *p) ; p = &tmp->next) {
-               if ((size + addr) < addr)
-                       goto out;
-               if (size + addr <= (unsigned long) tmp->addr)
-                       break;
-               next = tmp->size + (unsigned long) tmp->addr;
-               if (next > addr) 
-                       addr = next;
-               if (addr > VMALLOC_END-size)
-                       goto out;
-       }
-       area->flags = flags;
-       area->addr = (void *)addr;
-       area->size = size;
-       area->next = *p;
-       *p = area;
-       write_unlock(&vmlist_lock);
-       return area;
-
-out:
-       write_unlock(&vmlist_lock);
-       kfree(area);
-       return NULL;
-}
-
-void vfree(void * addr)
-{
-       struct vm_struct **p, *tmp;
-
-       if (!addr)
-               return;
-       if ((PAGE_SIZE-1) & (unsigned long) addr) {
-               printk(KERN_ERR "Trying to vfree() bad address (%p)\n", addr);
-               return;
-       }
-       write_lock(&vmlist_lock);
-       for (p = &vmlist ; (tmp = *p) ; p = &tmp->next) {
-               if (tmp->addr == addr) {
-                       *p = tmp->next;
-#ifdef CONFIG_XENO_PRIV
-                       if (tmp->flags & VM_IOREMAP)
-                               zap_page_range(&init_mm, VMALLOC_VMADDR(tmp->addr), tmp->size);
-                       else
-#endif
-                       vmfree_area_pages(VMALLOC_VMADDR(tmp->addr), tmp->size);
-                       write_unlock(&vmlist_lock);
-                       kfree(tmp);
-                       return;
-               }
-       }
-       write_unlock(&vmlist_lock);
-       printk(KERN_ERR "Trying to vfree() nonexistent vm area (%p)\n", addr);
-}
-
-void * __vmalloc (unsigned long size, int gfp_mask, pgprot_t prot)
-{
-       void * addr;
-       struct vm_struct *area;
-
-       size = PAGE_ALIGN(size);
-       if (!size || (size >> PAGE_SHIFT) > num_physpages)
-               return NULL;
-       area = get_vm_area(size, VM_ALLOC);
-       if (!area)
-               return NULL;
-       addr = area->addr;
-       if (vmalloc_area_pages(VMALLOC_VMADDR(addr), size, gfp_mask, prot)) {
-               vfree(addr);
-               return NULL;
-       }
-       return addr;
-}
-
-long vread(char *buf, char *addr, unsigned long count)
-{
-       struct vm_struct *tmp;
-       char *vaddr, *buf_start = buf;
-       unsigned long n;
-
-       /* Don't allow overflow */
-       if ((unsigned long) addr + count < count)
-               count = -(unsigned long) addr;
-
-       read_lock(&vmlist_lock);
-       for (tmp = vmlist; tmp; tmp = tmp->next) {
-               vaddr = (char *) tmp->addr;
-               if (addr >= vaddr + tmp->size - PAGE_SIZE)
-                       continue;
-               while (addr < vaddr) {
-                       if (count == 0)
-                               goto finished;
-                       *buf = '\0';
-                       buf++;
-                       addr++;
-                       count--;
-               }
-               n = vaddr + tmp->size - PAGE_SIZE - addr;
-               do {
-                       if (count == 0)
-                               goto finished;
-                       *buf = *addr;
-                       buf++;
-                       addr++;
-                       count--;
-               } while (--n > 0);
-       }
-finished:
-       read_unlock(&vmlist_lock);
-       return buf - buf_start;
-}
-
-long vwrite(char *buf, char *addr, unsigned long count)
-{
-       struct vm_struct *tmp;
-       char *vaddr, *buf_start = buf;
-       unsigned long n;
-
-       /* Don't allow overflow */
-       if ((unsigned long) addr + count < count)
-               count = -(unsigned long) addr;
-
-       read_lock(&vmlist_lock);
-       for (tmp = vmlist; tmp; tmp = tmp->next) {
-               vaddr = (char *) tmp->addr;
-               if (addr >= vaddr + tmp->size - PAGE_SIZE)
-                       continue;
-               while (addr < vaddr) {
-                       if (count == 0)
-                               goto finished;
-                       buf++;
-                       addr++;
-                       count--;
-               }
-               n = vaddr + tmp->size - PAGE_SIZE - addr;
-               do {
-                       if (count == 0)
-                               goto finished;
-                       *addr = *buf;
-                       buf++;
-                       addr++;
-                       count--;
-               } while (--n > 0);
-       }
-finished:
-       read_unlock(&vmlist_lock);
-       return buf - buf_start;
-}
diff --git a/xenolinux-2.4.22-sparse/Documentation/Configure.help b/xenolinux-2.4.22-sparse/Documentation/Configure.help
new file mode 100644 (file)
index 0000000..d8f5a5f
--- /dev/null
@@ -0,0 +1,27832 @@
+# Maintained by:
+#      Eric S. Raymond <mailto:esr@thyrsus.com>
+#      Steven Cole <mailto:elenstev@mesatop.com>
+#
+# Version 3.01: current with 2.4.19+
+#
+# Translations of this file available on the WWW:
+#
+#   - Japanese, maintained by the JF Project <mailto:JF@linux.or.jp>, at
+#     <http://www.linux.or.jp/JF/JFdocs/Configure.help/>
+#   - Russian, by <mailto:kaf@linux.nevod.perm.su>, at
+#     <http://nevod.perm.su/service/linux/doc/kernel/Configure.help>
+#   - French, by Pierre Tane <mailto:tanep@bigfoot.com>, at
+#     <http://www.traduc.org/kernelfr/>
+#   - Polish, by Dominik Mierzejewski <mailto:dominik@piorunek.pl>, at
+#     <http://www.piorunek.pl/~dominik/linux/kernel/>
+#   - German, by SuSE, at <http://www.suse.de/~ke/kernel/>. This patch
+#     also includes infrastructure to support different languages.
+#   - Catalan, by Antoni Bella <mailto:bella5@teleline.es>, at
+#     <http://www.terra.es/personal7/bella5/traduccions.htm>
+#
+# To access a document on the WWW, you need to have a direct Internet
+# connection and a browser program such as netscape or lynx. If you
+# only have email access, you can still use FTP and WWW servers: send
+# an email to <mailto:mail-server@rtfm.mit.edu> with the text
+#   send usenet/news.answers/internet-services/access-via-email
+# in the body of the message.
+#
+# Information about what a kernel is, what it does, how to patch and
+# compile it and much more is contained in the Kernel-HOWTO, available
+# at <http://www.tldp.org/docs.html#howto>. Before you start
+# compiling, make sure that you have the necessary versions of all
+# programs and libraries required to compile and run this kernel; they
+# are listed in the <file:Documentation/Changes>. Make sure to read the
+# toplevel kernel README file as well.
+#
+# Format of this file: description<nl>variable<nl>help text<nl><nl>.
+# The help texts may contain empty lines, but every non-empty line must
+# be indented two positions.  Order of the help texts does not matter,
+# however, no variable should be documented twice: if it is, only the
+# first occurrence will be used. We try to keep the help texts of related
+# variables close together. Lines starting with `#' are ignored. To be
+# nice to menuconfig, limit your line length to 70 characters. Use emacs'
+# kfill.el to edit and ispell.el to spell check this file or you lose.
+#
+# Comments of the form "# Choice:" followed by a menu name are used
+# internally by the maintainers' consistency-checking tools.
+#
+# If you add a help text to this file, please try to be as gentle as
+# possible. Don't use unexplained acronyms and generally write for the
+# hypothetical ignorant but intelligent user who has just bought a PC,
+# removed Windows, installed Linux and is now recompiling the kernel
+# for the first time. Tell them what to do if they're unsure. Technical
+# information should go in a README in the Documentation directory.
+#
+# Mention all the relevant READMEs and HOWTOs in the help text.
+# Make them file URLs relative to the top level of the source tree so
+# that help browsers can turn them into hotlinks.  All URLs should be
+# surrounded by <>.
+#
+# Repetitions are fine since the help texts are not meant to be read
+# in sequence.  It is good style to include URLs pointing to more
+# detailed technical information, pictures of the hardware, etc.
+#
+# The most important thing to include in a help entry is *motivation*.
+# Explain why someone configuring a kernel might want to select your
+# option.
+#
+# All this was shamelessly stolen from numerous different sources. Many
+# thanks to all the contributors. Feel free to use these help texts in
+# your own kernel configuration tools. The texts are copyrighted (c)
+# 1995-2000 by Axel Boldt and many others and are governed by the GNU
+# General Public License.
+
+Prompt for development and/or incomplete code/drivers
+CONFIG_EXPERIMENTAL
+  Some of the various things that Linux supports (such as network
+  drivers, file systems, network protocols, etc.) can be in a state
+  of development where the functionality, stability, or the level of
+  testing is not yet high enough for general use. This is usually
+  known as the "alpha-test" phase among developers. If a feature is
+  currently in alpha-test, then the developers usually discourage
+  uninformed widespread use of this feature by the general public to
+  avoid "Why doesn't this work?" type mail messages. However, active
+  testing and use of these systems is welcomed. Just be aware that it
+  may not meet the normal level of reliability or it may fail to work
+  in some special cases. Detailed bug reports from people familiar
+  with the kernel internals are usually welcomed by the developers
+  (before submitting bug reports, please read the documents
+  <file:README>, <file:MAINTAINERS>, <file:REPORTING-BUGS>,
+  <file:Documentation/BUG-HUNTING>, and
+  <file:Documentation/oops-tracing.txt> in the kernel source).
+
+  This option will also make obsoleted drivers available. These are
+  drivers that have been replaced by something else, and/or are
+  scheduled to be removed in a future kernel release.
+
+  Unless you intend to help test and develop a feature or driver that
+  falls into this category, or you have a situation that requires
+  using these features, you should probably say N here, which will
+  cause the configurator to present you with fewer choices. If
+  you say Y here, you will be offered the choice of using features or
+  drivers that are currently considered to be in the alpha-test phase.
+
+Prompt for drivers for obsolete features and hardware
+CONFIG_OBSOLETE
+  Obsolete drivers have usually been replaced by more recent software
+  that can talk to the same hardware.  Obsolete hardware is things
+  like MGA monitors that you are very unlikely to see on today's
+  systems.
+
+Symmetric Multi-Processing support
+CONFIG_SMP
+  This enables support for systems with more than one CPU. If you have
+  a system with only one CPU, like most personal computers, say N. If
+  you have a system with more than one CPU, say Y.
+
+  If you say N here, the kernel will run on single and multiprocessor
+  machines, but will use only one CPU of a multiprocessor machine. If
+  you say Y here, the kernel will run on many, but not all,
+  single machines. On a singleprocessor machine, the kernel
+  will run faster if you say N here.
+
+  Note that if you say Y here and choose architecture "586" or
+  "Pentium" under "Processor family", the kernel will not work on 486
+  architectures. Similarly, multiprocessor kernels for the "PPro"
+  architecture may not work on all Pentium based boards.
+
+  People using multiprocessor machines who say Y here should also say
+  Y to "Enhanced Real Time Clock Support", below. The "Advanced Power
+  Management" code will be disabled if you say Y here.
+
+  See also the <file:Documentation/smp.tex>,
+  <file:Documentation/smp.txt>, <file:Documentation/i386/IO-APIC.txt>,
+  <file:Documentation/nmi_watchdog.txt> and the SMP-HOWTO available at
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you don't know what to do here, say N.
+
+Intel or compatible 80x86 processor
+CONFIG_X86
+  This is Linux's home port.  Linux was originally native to the Intel
+  386, and runs on all the later x86 processors including the Intel
+  486, 586, Pentiums, and various instruction-set-compatible chips by
+  AMD, Cyrix, and others.
+
+Alpha processor
+CONFIG_ALPHA
+  The Alpha is a 64-bit general-purpose processor designed and
+  marketed by the Digital Equipment Corporation of blessed memory, now
+  Compaq.  Alpha Linux dates from 1995-1996 and was the first non-x86
+  port. The Alpha Linux project has a home page at
+  <http://www.alphalinux.org/>.
+
+32-bit Sun Sparc
+CONFIG_SPARC32
+  SPARC is a family of RISC microprocessors designed and marketed by
+  Sun Microsystems, incorporated.  They are very widely found in Sun
+  workstations and clones. This port covers the original 32-bit SPARC;
+  it is old and stable and usually considered one of the "big three"
+  along with the Intel and Alpha ports.  The UltraLinux project
+  maintains both the SPARC32 and SPARC64 ports; its web page is
+  available at <http://www.ultralinux.org/>.
+
+64-bit Sun Sparc
+CONFIG_SPARC64
+  SPARC is a family of RISC microprocessors designed and marketed by
+  Sun Microsystems, incorporated.  This port covers the newer 64-bit
+  UltraSPARC.  The UltraLinux project maintains both the SPARC32 and
+  SPARC64 ports; its web page is available at
+  <http://www.ultralinux.org/>.
+
+Power PC processor
+CONFIG_PPC
+  The PowerPC is a very capable 32-bit RISC processor from Motorola,
+  the successor to their 68000 and 88000 series.  It powers recent
+  Macintoshes and also a widely-used series of single-board computers
+  from Motorola.  The Linux PowerPC port has a home page at
+  <http://penguinppc.org/>.
+
+Motorola 68K processors
+CONFIG_M68K
+  The Motorola 68K microprocessors are now obsolete, having been
+  superseded by the PowerPC line also from Motorola.  But they powered
+  the first wave of workstation hardware in the 1980s, including Sun
+  workstations; they were also the basis of the original Amiga and
+  later Atari personal computers.  A lot of this hardware is still
+  around.  The m68k project has a home page at
+  <http://www.linux-m68k.org/>.
+
+ARM processors
+CONFIG_ARM
+  The ARM series is a line of low-power-consumption RISC chip designs
+  licensed by ARM ltd and targeted at embedded applications and
+  handhelds such as the Compaq IPAQ.  ARM-based PCs are no longer
+  manufactured, but  legacy ARM-based PC hardware remains popular in
+  Europe.  There is an ARM Linux project with a web page at
+  <http://www.arm.linux.org.uk/>.
+
+SuperH processors
+CONFIG_SUPERH
+  The SuperH is a RISC processor targeted for use in embedded systems
+  and consumer electronics; it was also used in the Sega Dreamcast
+  gaming console.  The SuperH port has a home page at
+  <http://www.sh-linux.org/>.
+
+IA64 processors, including Intel Itanium
+CONFIG_IA64
+  The Itanium is Intel's 64-bit successor to the 32-bit X86 line.  As
+  of early 2001 it is not yet in widespread production use.  The Linux
+  IA-64 project has a home page at <http://www.linuxia64.org/>.
+
+HP PA-RISC processor
+CONFIG_PARISC
+  The PA-RISC microprocessor is a RISC chip designed by
+  Hewlett-Packard and used in their line of workstations.  The PA-RISC
+  Linux project has a home page at <www.parisc-linux.org>.
+
+IBM System/390
+CONFIG_S390
+  Linux now runs on the venerable System/390 mainframe from IBM, in a
+  guest partition under VM.  In fact, over 40,000 simultaneous Linux
+  images have been run on a single mainframe!  The S390 Linux project
+  has a home page at <http://linux.s390.org/>.
+
+Axis Communications ETRAX 100LX embedded network CPU
+CONFIG_CRIS
+  Linux has been ported to run on the Axis Communications ETRAX 100LX
+  CPU and the single-board computers built around it, targeted for
+  network and embedded applications.  For more information see the
+  Axis Communication site, <http://developer.axis.com/>.
+
+Unsynced TSC support
+CONFIG_X86_TSC_DISABLE
+  This option is used for getting Linux to run on a NUMA multi-node 
+  boxes, laptops and other systems suffering from unsynced TSCs or 
+  TSC drift, which can cause gettimeofday to return non-monotonic values. 
+  Choosing this option will disable the CONFIG_X86_TSC optimization,
+  and allows you to then specify "notsc" as a boot option regardless of 
+  which processor you have compiled for. 
+  
+  NOTE: If your system hangs when init should run, you are probably
+  using a i686 compiled glibc which reads the TSC without checking for 
+  availability. Boot without "notsc" and install a i386 compiled glibc 
+  to solve the problem.
+
+  If unsure, say N.
+
+Multiquad support for NUMAQ systems
+CONFIG_X86_NUMAQ
+  This option is used for getting Linux to run on a (IBM/Sequent) NUMA 
+  multiquad box. This changes the way that processors are bootstrapped,
+  and uses Clustered Logical APIC addressing mode instead of Flat Logical.
+  You will need a new lynxer.elf file to flash your firmware with - send
+  email to Martin.Bligh@us.ibm.com
+
+Support for IBM Summit (EXA) systems
+CONFIG_X86_SUMMIT
+  This option is needed for IBM systems that use the Summit/EXA chipset.
+  (EXA: Extendable Xseries Architecture)In particular, it is needed for 
+  the x440 (even for the 4-CPU model).
+
+  If you don't have this computer, you may safely say N.
+
+IO-APIC support on uniprocessors
+CONFIG_X86_UP_IOAPIC
+  An IO-APIC (I/O Advanced Programmable Interrupt Controller) is an
+  SMP-capable replacement for PC-style interrupt controllers. Most
+  SMP systems and a small number of uniprocessor systems have one.
+  If you have a single-CPU system with an IO-APIC, you can say Y here
+  to use it. If you say Y here even though your machine doesn't have
+  an IO-APIC, then the kernel will still run with no slowdown at all.
+
+  If you have a system with several CPUs, you do not need to say Y
+  here: the IO-APIC will be used automatically.
+
+Local APIC Support on Uniprocessors
+CONFIG_X86_UP_APIC
+  A local APIC (Advanced Programmable Interrupt Controller) is an
+  integrated interrupt controller in the CPU. If you have a single-CPU
+  system which has a processor with a local APIC, you can say Y here to
+  enable and use it. If you say Y here even though your machine doesn't
+  have a local APIC, then the kernel will still run with no slowdown at
+  all. The local APIC supports CPU-generated self-interrupts (timer,
+  performance counters), and the NMI watchdog which detects hard lockups.
+
+  If you have a system with several CPUs, you do not need to say Y
+  here: the local APIC will be used automatically.
+
+Kernel math emulation
+CONFIG_MATH_EMULATION
+  Linux can emulate a math coprocessor (used for floating point
+  operations) if you don't have one. 486DX and Pentium processors have
+  a math coprocessor built in, 486SX and 386 do not, unless you added
+  a 487DX or 387, respectively. (The messages during boot time can
+  give you some hints here ["man dmesg"].) Everyone needs either a
+  coprocessor or this emulation.
+
+  If you don't have a math coprocessor, you need to say Y here; if you
+  say Y here even though you have a coprocessor, the coprocessor will
+  be used nevertheless. (This behaviour can be changed with the kernel
+  command line option "no387", which comes handy if your coprocessor
+  is broken. Try "man bootparam" or see the documentation of your boot
+  loader (lilo or loadlin) about how to pass options to the kernel at
+  boot time.) This means that it is a good idea to say Y here if you
+  intend to use this kernel on different machines.
+
+  More information about the internals of the Linux math coprocessor
+  emulation can be found in <file:arch/i386/math-emu/README>.
+
+  If you are not sure, say Y; apart from resulting in a 66 KB bigger
+  kernel, it won't hurt.
+
+Timer and CPU usage LEDs
+CONFIG_LEDS
+  If you say Y here, the LEDs on your machine will be used
+  to provide useful information about your current system status.
+
+  If you are compiling a kernel for a NetWinder or EBSA-285, you will
+  be able to select which LEDs are active using the options below. If
+  you are compiling a kernel for the EBSA-110 or the LART however, the
+  red LED will simply flash regularly to indicate that the system is
+  still functional. It is safe to say Y here if you have a CATS
+  system, but the driver will do nothing.
+
+Timer LED
+CONFIG_LEDS_TIMER
+  If you say Y here, one of the system LEDs (the green one on the
+  NetWinder, the amber one on the EBSA285, or the red one on the LART)
+  will flash regularly to indicate that the system is still
+  operational. This is mainly useful to kernel hackers who are
+  debugging unstable kernels.
+
+  The LART uses the same LED for both Timer LED and CPU usage LED
+  functions. You may choose to use both, but the Timer LED function
+  will overrule the CPU usage LED.
+
+CPU usage LED
+CONFIG_LEDS_CPU
+  If you say Y here, the red LED will be used to give a good real
+  time indication of CPU usage, by lighting whenever the idle task
+  is not currently executing.
+
+  The LART uses the same LED for both Timer LED and CPU usage LED
+  functions. You may choose to use both, but the Timer LED function
+  will overrule the CPU usage LED.
+
+Kernel FP software completion
+CONFIG_MATHEMU
+  This option is required for IEEE compliant floating point arithmetic
+  on the Alpha. The only time you would ever not say Y is to say M in
+  order to debug the code. Say Y unless you know what you are doing.
+
+# Choice: himem
+High Memory support
+CONFIG_NOHIGHMEM
+  Linux can use up to 64 Gigabytes of physical memory on x86 systems.
+  However, the address space of 32-bit x86 processors is only 4
+  Gigabytes large. That means that, if you have a large amount of
+  physical memory, not all of it can be "permanently mapped" by the
+  kernel. The physical memory that's not permanently mapped is called
+  "high memory".
+
+  If you are compiling a kernel which will never run on a machine with
+  more than 960 megabytes of total physical RAM, answer "off" here (default
+  choice and suitable for most users). This will result in a "3GB/1GB"
+  split: 3GB are mapped so that each process sees a 3GB virtual memory
+  space and the remaining part of the 4GB virtual memory space is used
+  by the kernel to permanently map as much physical memory as
+  possible.
+
+  If the machine has between 1 and 4 Gigabytes physical RAM, then
+  answer "4GB" here.
+
+  If more than 4 Gigabytes is used then answer "64GB" here. This
+  selection turns Intel PAE (Physical Address Extension) mode on.
+  PAE implements 3-level paging on IA32 processors. PAE is fully
+  supported by Linux, PAE mode is implemented on all recent Intel
+  processors (Pentium Pro and better). NOTE: If you say "64GB" here,
+  then the kernel will not boot on CPUs that don't support PAE!
+
+  The actual amount of total physical memory will either be auto
+  detected or can be forced by using a kernel command line option such
+  as "mem=256M". (Try "man bootparam" or see the documentation of your
+  boot loader (grub, lilo or loadlin) about how to pass options to the
+  kernel at boot time.)
+
+  If unsure, say "off".
+
+4GB
+CONFIG_HIGHMEM4G
+  Select this if you have a 32-bit processor and between 1 and 4
+  gigabytes of physical RAM.
+
+64GB
+CONFIG_HIGHMEM64G
+  Select this if you have a 32-bit processor and more than 4
+  gigabytes of physical RAM.
+
+HIGHMEM I/O support
+CONFIG_HIGHIO
+  If you want to be able to do I/O to high memory pages, say Y.
+  Otherwise low memory pages are used as bounce buffers causing a
+  degrade in performance.
+
+Normal floppy disk support
+CONFIG_BLK_DEV_FD
+  If you want to use the floppy disk drive(s) of your PC under Linux,
+  say Y. Information about this driver, especially important for IBM
+  Thinkpad users, is contained in <file:Documentation/floppy.txt>.
+  That file also contains the location of the Floppy driver FAQ as
+  well as location of the fdutils package used to configure additional
+  parameters of the driver at run time.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called floppy.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+iSeries Virtual I/O Disk Support
+CONFIG_VIODASD
+  If you are running on an iSeries system and you want to use
+  virtual disks created and managed by OS/400, say Y.
+
+iSeries Virtual I/O Disk IDE Emulation
+CONFIG_VIODASD_IDE
+  This causes the iSeries virtual disks to look like IDE disks.
+  If you have programs or utilities that only support certain
+  kinds of disks, this option will cause iSeries virtual disks
+  to pretend to be IDE disks, which may satisfy the program.
+
+Support for PowerMac floppy
+CONFIG_MAC_FLOPPY
+  If you have a SWIM-3 (Super Woz Integrated Machine 3; from Apple)
+  floppy controller, say Y here. Most commonly found in PowerMacs.
+
+RAM disk support
+CONFIG_BLK_DEV_RAM
+  Saying Y here will allow you to use a portion of your RAM memory as
+  a block device, so that you can make file systems on it, read and
+  write to it and do all the other things that you can do with normal
+  block devices (such as hard drives). It is usually used to load and
+  store a copy of a minimal root file system off of a floppy into RAM
+  during the initial install of Linux.
+
+  Note that the kernel command line option "ramdisk=XX" is now
+  obsolete. For details, read <file:Documentation/ramdisk.txt>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M and read <file:Documentation/modules.txt>. The module will be
+  called rd.o.
+
+  Most normal users won't need the RAM disk functionality, and can
+  thus say N here.
+
+Default RAM disk size
+CONFIG_BLK_DEV_RAM_SIZE
+  The default value is 4096. Only change this if you know what are
+  you doing. If you are using IBM S/390, then set this to 8192.
+
+Initial RAM disk (initrd) support
+CONFIG_BLK_DEV_INITRD
+  The initial RAM disk is a RAM disk that is loaded by the boot loader
+  (loadlin or lilo) and that is mounted as root before the normal boot
+  procedure. It is typically used to load modules needed to mount the
+  "real" root file system, etc. See <file:Documentation/initrd.txt>
+  for details.
+
+Embed root filesystem ramdisk into the kernel
+CONFIG_EMBEDDED_RAMDISK
+  Select this option if you want to build the ramdisk image into the
+  the final kernel binary.
+
+Filename of gziped ramdisk image
+CONFIG_EMBEDDED_RAMDISK_IMAGE
+  This is the filename of the ramdisk image to be built into the
+  kernel.  Relative pathnames are relative to arch/mips/ramdisk/.
+  The ramdisk image is not part of the kernel distribution; you must
+  provide one yourself.
+
+Loopback device support
+CONFIG_BLK_DEV_LOOP
+  Saying Y here will allow you to use a regular file as a block
+  device; you can then create a file system on that block device and
+  mount it just as you would mount other block devices such as hard
+  drive partitions, CD-ROM drives or floppy drives. The loop devices
+  are block special device files with major number 7 and typically
+  called /dev/loop0, /dev/loop1 etc.
+
+  This is useful if you want to check an ISO 9660 file system before
+  burning the CD, or if you want to use floppy images without first
+  writing them to floppy. Furthermore, some Linux distributions avoid
+  the need for a dedicated Linux partition by keeping their complete
+  root file system inside a DOS FAT file using this loop device
+  driver.
+
+  The loop device driver can also be used to "hide" a file system in a
+  disk partition, floppy, or regular file, either using encryption
+  (scrambling the data) or steganography (hiding the data in the low
+  bits of, say, a sound file). This is also safe if the file resides
+  on a remote file server. If you want to do this, you will first have
+  to acquire and install a kernel patch from
+  <ftp://ftp.kerneli.org/pub/kerneli/>, and then you need to
+  say Y to this option.
+
+  Note that alternative ways to use encrypted file systems are
+  provided by the cfs package, which can be gotten from
+  <ftp://ftp.kerneli.org/pub/kerneli/net-source/>, and the newer tcfs
+  package, available at <http://tcfs.dia.unisa.it/>. You do not need
+  to say Y here if you want to use one of these. However, using cfs
+  requires saying Y to "NFS file system support" below while using
+  tcfs requires applying a kernel patch. An alternative steganography
+  solution is provided by StegFS, also available from
+  <ftp://ftp.kerneli.org/pub/kerneli/net-source/>.
+
+  To use the loop device, you need the losetup utility and a recent
+  version of the mount program, both contained in the util-linux
+  package. The location and current version number of util-linux is
+  contained in the file <file:Documentation/Changes>.
+
+  Note that this loop device has nothing to do with the loopback
+  device used for network connections from the machine to itself.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>. The module
+  will be called loop.o.
+
+  Most users will answer N here.
+
+Micro Memory MM5415 Battery Backed RAM support (EXPERIMENTAL)
+CONFIG_BLK_DEV_UMEM
+  Saying Y here will include support for the MM5415 family of
+  battery backed (Non-volatile) RAM cards.
+  <http://www.umem.com/>
+
+  The cards appear as block devices that can be partitioned into
+  as many as 15 partitions.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read Documentation/modules.txt. The module will be
+  called umem.o.
+
+  The umem driver has been allocated block major number 116.
+  See Documentation/devices.txt for recommended device naming.
+
+Network block device support
+CONFIG_BLK_DEV_NBD
+  Saying Y here will allow your computer to be a client for network
+  block devices, i.e. it will be able to use block devices exported by
+  servers (mount file systems on them etc.). Communication between
+  client and server works over TCP/IP networking, but to the client
+  program this is hidden: it looks like a regular local file access to
+  a block device special file such as /dev/nd0.
+
+  Network block devices also allows you to run a block-device in
+  userland (making server and client physically the same computer,
+  communicating using the loopback network device).
+
+  Read <file:Documentation/nbd.txt> for more information, especially
+  about where to find the server code, which runs in user space and
+  does not need special kernel support.
+
+  Note that this has nothing to do with the network file systems NFS
+  or Coda; you can say N here even if you intend to use NFS or Coda.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>. The module
+  will be called nbd.o.
+
+  If unsure, say N.
+
+XenoLinux virtual block device support
+CONFIG_XENOLINUX_BLOCK
+  Xen can export virtual block devices which map back to extents of
+  blocks on the physical partitions.  This option is needed for
+  xenolinux to make use of such devices when running as a Xen guest.
+
+  If unsure, say Y.
+
+Per partition statistics in /proc/partitions
+CONFIG_BLK_STATS
+  If you say yes here, your kernel will keep statistical information
+  for every partition. The information includes things as numbers of
+  read and write accesses, the number of merged requests etc.
+
+  This is required for the full functionality of sar(8) and interesting
+  if you want to do performance tuning, by tweaking the elevator, e.g.
+
+  If unsure, say N.
+
+ATA/IDE/MFM/RLL support
+CONFIG_IDE
+  If you say Y here, your kernel will be able to manage low cost mass
+  storage units such as ATA/(E)IDE and ATAPI units. The most common
+  cases are IDE hard drives and ATAPI CD-ROM drives.
+
+  If your system is pure SCSI and doesn't use these interfaces, you
+  can say N here.
+
+  Integrated Disk Electronics (IDE aka ATA-1) is a connecting standard
+  for mass storage units such as hard disks. It was designed by
+  Western Digital and Compaq Computer in 1984. It was then named
+  ST506. Quite a number of disks use the IDE interface.
+
+  AT Attachment (ATA) is the superset of the IDE specifications.
+  ST506 was also called ATA-1.
+
+  Fast-IDE is ATA-2 (also named Fast ATA), Enhanced IDE (EIDE) is
+  ATA-3. It provides support for larger disks (up to 8.4GB by means of
+  the LBA standard), more disks (4 instead of 2) and for other mass
+  storage units such as tapes and cdrom. UDMA/33 (aka UltraDMA/33) is
+  ATA-4 and provides faster (and more CPU friendly) transfer modes
+  than previous PIO (Programmed processor Input/Output) from previous
+  ATA/IDE standards by means of fast DMA controllers.
+
+  ATA Packet Interface (ATAPI) is a protocol used by EIDE tape and
+  CD-ROM drives, similar in many respects to the SCSI protocol.
+
+  SMART IDE (Self Monitoring, Analysis and Reporting Technology) was
+  designed in order to prevent data corruption and disk crash by
+  detecting pre hardware failure conditions (heat, access time, and
+  the like...). Disks built since June 1995 may follow this standard.
+  The kernel itself don't manage this; however there are quite a
+  number of user programs such as smart that can query the status of
+  SMART parameters disk.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>. The module
+  will be called ide.o.
+
+  For further information, please read <file:Documentation/ide.txt>.
+
+  If unsure, say Y.
+
+Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
+CONFIG_BLK_DEV_IDE
+  If you say Y here, you will use the full-featured IDE driver to
+  control up to ten ATA/IDE interfaces, each being able to serve a
+  "master" and a "slave" device, for a total of up to twenty ATA/IDE
+  disk/cdrom/tape/floppy drives.
+
+  Useful information about large (>540 MB) IDE disks, multiple
+  interfaces, what to do if ATA/IDE devices are not automatically
+  detected, sound card ATA/IDE ports, module support, and other
+  topics, is contained in <file:Documentation/ide.txt>. For detailed
+  information about hard drives, consult the Disk-HOWTO and the
+  Multi-Disk-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  To fine-tune ATA/IDE drive/interface parameters for improved
+  performance, look for the hdparm package at
+  <ftp://ibiblio.org/pub/Linux/system/hardware/>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt> and
+  <file:Documentation/ide.txt>. The module will be called ide-mod.o.
+  Do not compile this driver as a module if your root file system (the
+  one containing the directory /) is located on an IDE device.
+
+  If you have one or more IDE drives, say Y or M here. If your system
+  has no IDE drives, or if memory requirements are really tight, you
+  could say N here, and select the "Old hard disk driver" below
+  instead to save about 13 KB of memory in the kernel.
+
+Old hard disk (MFM/RLL/IDE) driver
+CONFIG_BLK_DEV_HD_ONLY
+  There are two drivers for MFM/RLL/IDE hard disks. Most people use
+  the newer enhanced driver, but this old one is still around for two
+  reasons. Some older systems have strange timing problems and seem to
+  work only with the old driver (which itself does not work with some
+  newer systems). The other reason is that the old driver is smaller,
+  since it lacks the enhanced functionality of the new one. This makes
+  it a good choice for systems with very tight memory restrictions, or
+  for systems with only older MFM/RLL/ESDI drives. Choosing the old
+  driver can save 13 KB or so of kernel memory.
+
+  If you are unsure, then just choose the Enhanced IDE/MFM/RLL driver
+  instead of this one. For more detailed information, read the
+  Disk-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+Use old disk-only driver on primary interface
+CONFIG_BLK_DEV_HD_IDE
+  There are two drivers for MFM/RLL/IDE disks.  Most people use just
+  the new enhanced driver by itself.  This option however installs the
+  old hard disk driver to control the primary IDE/disk interface in
+  the system, leaving the new enhanced IDE driver to take care of only
+  the 2nd/3rd/4th IDE interfaces.  Doing this will prevent you from
+  having an IDE/ATAPI CD-ROM or tape drive connected to the primary
+  IDE interface.  Choosing this option may be useful for older systems
+  which have MFM/RLL/ESDI controller+drives at the primary port
+  address (0x1f0), along with IDE drives at the secondary/3rd/4th port
+  addresses.
+
+  Normally, just say N here; you will then use the new driver for all
+  4 interfaces.
+
+Include IDE/ATA-2 DISK support
+CONFIG_BLK_DEV_IDEDISK
+  This will include enhanced support for MFM/RLL/IDE hard disks.  If
+  you have a MFM/RLL/IDE disk, and there is no special reason to use
+  the old hard disk driver instead, say Y.  If you have an SCSI-only
+  system, you can say N here.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ide-disk.o.  Do not compile this driver as a module
+  if your root file system (the one containing the directory /) is
+  located on the IDE disk. If unsure, say Y.
+
+Use multi-mode by default
+CONFIG_IDEDISK_MULTI_MODE
+  If you get this error, try to say Y here:
+
+  hda: set_multmode: status=0x51 { DriveReady SeekComplete Error }
+  hda: set_multmode: error=0x04 { DriveStatusError }
+
+  If in doubt, say N.
+
+PCMCIA IDE support
+CONFIG_BLK_DEV_IDECS
+  Support for outboard IDE disks, tape drives, and CD-ROM drives
+  connected through a  PCMCIA card.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  ide-cs.o
+
+Include IDE/ATAPI CD-ROM support
+CONFIG_BLK_DEV_IDECD
+  If you have a CD-ROM drive using the ATAPI protocol, say Y. ATAPI is
+  a newer protocol used by IDE CD-ROM and TAPE drives, similar to the
+  SCSI protocol. Most new CD-ROM drives use ATAPI, including the
+  NEC-260, Mitsumi FX400, Sony 55E, and just about all non-SCSI
+  double(2X) or better speed drives.
+
+  If you say Y here, the CD-ROM drive will be identified at boot time
+  along with other IDE devices, as "hdb" or "hdc", or something
+  similar (check the boot messages with dmesg). If this is your only
+  CD-ROM drive, you can say N to all other CD-ROM options, but be sure
+  to say Y or M to "ISO 9660 CD-ROM file system support".
+
+  Note that older versions of LILO (LInux LOader) cannot properly deal
+  with IDE/ATAPI CD-ROMs, so install LILO 16 or higher, available from
+  <ftp://brun.dyndns.org/pub/linux/lilo/>.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ide-cd.o.
+
+Include IDE/ATAPI TAPE support
+CONFIG_BLK_DEV_IDETAPE
+  If you have an IDE tape drive using the ATAPI protocol, say Y.
+  ATAPI is a newer protocol used by IDE tape and CD-ROM drives,
+  similar to the SCSI protocol.  If you have an SCSI tape drive
+  however, you can say N here.
+
+  You should also say Y if you have an OnStream DI-30 tape drive; this
+  will not work with the SCSI protocol, until there is support for the
+  SC-30 and SC-50 versions.
+
+  If you say Y here, the tape drive will be identified at boot time
+  along with other IDE devices, as "hdb" or "hdc", or something
+  similar, and will be mapped to a character device such as "ht0"
+  (check the boot messages with dmesg).  Be sure to consult the
+  <file:drivers/ide/ide-tape.c> and <file:Documentation/ide.txt> files
+  for usage information.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ide-tape.o.
+
+Include IDE/ATAPI FLOPPY support
+CONFIG_BLK_DEV_IDEFLOPPY
+  If you have an IDE floppy drive which uses the ATAPI protocol,
+  answer Y.  ATAPI is a newer protocol used by IDE CD-ROM/tape/floppy
+  drives, similar to the SCSI protocol.
+
+  The LS-120 and the IDE/ATAPI Iomega ZIP drive are also supported by
+  this driver. For information about jumper settings and the question
+  of when a ZIP drive uses a partition table, see
+  <http://www.win.tue.nl/~aeb/linux/zip/zip-1.html>.
+  (ATAPI PD-CD/CDR drives are not supported by this driver; support
+  for PD-CD/CDR drives is available if you answer Y to
+  "SCSI emulation support", below).
+
+  If you say Y here, the FLOPPY drive will be identified along with
+  other IDE devices, as "hdb" or "hdc", or something similar (check
+  the boot messages with dmesg).
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ide-floppy.o.
+
+AWARD Bios Work-Around
+CONFIG_IDEDISK_STROKE
+  Should you have a system w/ an AWARD Bios and your drives are larger
+  than 32GB and it will not boot, one is required to perform a few OEM
+  operations first.  The option is called "STROKE" because it allows
+  one to "soft clip" the drive to work around a barrier limit.  For
+  Maxtor drives it is called "jumpon.exe".  Please search Maxtor's
+  web-site for "JUMPON.EXE".  IBM has a similar tool at:
+  <http://www.storage.ibm.com/hdd/support/download.htm>.
+
+  If you are unsure, say N here.
+
+Raw Access to Media
+CONFIG_IDE_TASK_IOCTL
+  This is a direct raw access to the media.  It is a complex but
+  elegant solution to test and validate the domain of the hardware and
+  perform below the driver data recover if needed.  This is the most
+  basic form of media-forensics.
+
+  If you are unsure, say N here.
+
+Use Taskfile I/O
+CONFIG_IDE_TASKFILE_IO
+  This is the "Jewel" of the patch.  It will go away and become the new
+  driver core.  Since all the chipsets/host side hardware deal w/ their
+  exceptions in "their local code" currently, adoption of a
+  standardized data-transport is the only logical solution.
+  Additionally we packetize the requests and gain rapid performance and
+  a reduction in system latency.  Additionally by using a memory struct
+  for the commands we can redirect to a MMIO host hardware in the next
+  generation of controllers, specifically second generation Ultra133
+  and Serial ATA.
+
+  Since this is a major transition, it was deemed necessary to make the
+  driver paths buildable in separate models.  Therefore if using this
+  option fails for your arch then we need to address the needs for that
+  arch.
+
+  If you want to test this functionality, say Y here.
+
+Force DMA
+CONFIG_BLK_DEV_IDEDMA_FORCED
+  This is an old piece of lost code from Linux 2.0 Kernels.
+
+  Generally say N here.
+
+DMA Only on Disks
+CONFIG_IDEDMA_ONLYDISK
+  This is used if you know your ATAPI Devices are going to fail DMA
+  Transfers.
+
+  Generally say N here.
+
+SCSI emulation support
+CONFIG_BLK_DEV_IDESCSI
+  This will provide SCSI host adapter emulation for IDE ATAPI devices,
+  and will allow you to use a SCSI device driver instead of a native
+  ATAPI driver.
+
+  This is useful if you have an ATAPI device for which no native
+  driver has been written (for example, an ATAPI PD-CD or CDR drive);
+  you can then use this emulation together with an appropriate SCSI
+  device driver. In order to do this, say Y here and to "SCSI support"
+  and "SCSI generic support", below. You must then provide the kernel
+  command line "hdx=scsi" (try "man bootparam" or see the
+  documentation of your boot loader (lilo or loadlin) about how to
+  pass options to the kernel at boot time) for devices if you want the
+  native EIDE sub-drivers to skip over the native support, so that
+  this SCSI emulation can be used instead. This is required for use of
+  CD-RW's.
+
+  Note that this option does NOT allow you to attach SCSI devices to a
+  box that doesn't have a SCSI host adapter installed.
+
+  If both this SCSI emulation and native ATAPI support are compiled
+  into the kernel, the native support will be used.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  ide-scsi.o
+
+Use the NOOP Elevator (WARNING)
+CONFIG_BLK_DEV_ELEVATOR_NOOP
+  If you are using a raid class top-level driver above the ATA/IDE core,
+  one may find a performance boost by preventing a merging and re-sorting
+  of the new requests.
+
+  If unsure, say N.
+
+ISA-PNP EIDE support
+CONFIG_BLK_DEV_ISAPNP
+  If you have an ISA EIDE card that is PnP (Plug and Play) and
+  requires setup first before scanning for devices, say Y here.
+
+  If unsure, say N.
+
+CMD640 chipset bugfix/support
+CONFIG_BLK_DEV_CMD640
+  The CMD-Technologies CMD640 IDE chip is used on many common 486 and
+  Pentium motherboards, usually in combination with a "Neptune" or
+  "SiS" chipset. Unfortunately, it has a number of rather nasty
+  design flaws that can cause severe data corruption under many common
+  conditions. Say Y here to include code which tries to automatically
+  detect and correct the problems under Linux. This option also
+  enables access to the secondary IDE ports in some CMD640 based
+  systems.
+
+  This driver will work automatically in PCI based systems (most new
+  systems have PCI slots). But if your system uses VESA local bus
+  (VLB) instead of PCI, you must also supply a kernel boot parameter
+  to enable the CMD640 bugfix/support: "ide0=cmd640_vlb". (Try "man
+  bootparam" or see the documentation of your boot loader about how to
+  pass options to the kernel.)
+
+  The CMD640 chip is also used on add-in cards by Acculogic, and on
+  the "CSA-6400E PCI to IDE controller" that some people have. For
+  details, read <file:Documentation/ide.txt>.
+
+CMD640 enhanced support
+CONFIG_BLK_DEV_CMD640_ENHANCED
+  This option includes support for setting/autotuning PIO modes and
+  prefetch on CMD640 IDE interfaces.  For details, read
+  <file:Documentation/ide.txt>. If you have a CMD640 IDE interface
+  and your BIOS does not already do this for you, then say Y here.
+  Otherwise say N.
+
+RZ1000 chipset bugfix/support
+CONFIG_BLK_DEV_RZ1000
+  The PC-Technologies RZ1000 IDE chip is used on many common 486 and
+  Pentium motherboards, usually along with the "Neptune" chipset.
+  Unfortunately, it has a rather nasty design flaw that can cause
+  severe data corruption under many conditions. Say Y here to include
+  code which automatically detects and corrects the problem under
+  Linux. This may slow disk throughput by a few percent, but at least
+  things will operate 100% reliably.
+
+Generic PCI IDE chipset support
+CONFIG_BLK_DEV_IDEPCI
+  Say Y here for PCI systems which use IDE drive(s).
+  This option helps the IDE driver to automatically detect and
+  configure all PCI-based IDE interfaces in your system.
+
+Support for sharing PCI IDE interrupts
+CONFIG_IDEPCI_SHARE_IRQ
+  Some ATA/IDE chipsets have hardware support which allows for
+  sharing a single IRQ with other cards. To enable support for
+  this in the ATA/IDE driver, say Y here.
+
+  It is safe to say Y to this question, in most cases.
+  If unsure, say N.
+
+Generic PCI bus-master DMA support
+CONFIG_BLK_DEV_IDEDMA_PCI
+  If your PCI system uses IDE drive(s) (as opposed to SCSI, say) and
+  is capable of bus-master DMA operation (most Pentium PCI systems),
+  you will want to say Y here to reduce CPU overhead. You can then use
+  the "hdparm" utility to enable DMA for drives for which it was not
+  enabled automatically. By default, DMA is not enabled automatically
+  for these drives, but you can change that by saying Y to the
+  following question "Use DMA by default when available". You can get
+  the latest version of the hdparm utility from
+  <ftp://ibiblio.org/pub/Linux/system/hardware/>.
+
+  Read the comments at the beginning of <file:drivers/ide/ide-dma.c>
+  and the file <file:Documentation/ide.txt> for more information.
+
+  It is safe to say Y to this question.
+
+Good-Bad DMA Model-Firmware (WIP)
+CONFIG_IDEDMA_NEW_DRIVE_LISTINGS
+  If you say Y here, the model and firmware revision of your drive
+  will be compared against a blacklist of buggy drives that claim to
+  be (U)DMA capable but aren't. This is a blanket on/off test with no
+  speed limit options.
+
+  Straight GNU GCC 2.7.3/2.8.X compilers are known to be safe;
+  whereas, many versions of EGCS have a problem and miscompile if you
+  say Y here.
+
+  If in doubt, say N.
+
+Attempt to HACK around Chipsets that TIMEOUT (WIP)
+CONFIG_BLK_DEV_IDEDMA_TIMEOUT
+  If you say Y here, this is a NASTY UGLY HACK!
+
+  We have to issue an abort and requeue the request DMA engine got
+  turned off by a goofy ASIC, and we have to clean up the mess, and
+  here is as good as any.  Do it globally for all chipsets.
+
+  If in doubt, say N.
+
+Boot off-board chipsets first support
+CONFIG_BLK_DEV_OFFBOARD
+  Normally, IDE controllers built into the motherboard (on-board
+  controllers) are assigned to ide0 and ide1 while those on add-in PCI
+  cards (off-board controllers) are relegated to ide2 and ide3.
+  Answering Y here will allow you to reverse the situation, with
+  off-board controllers on ide0/1 and on-board controllers on ide2/3.
+  This can improve the usability of some boot managers such as lilo
+  when booting from a drive on an off-board controller.
+
+  If you say Y here, and you actually want to reverse the device scan
+  order as explained above, you also need to issue the kernel command
+  line option "ide=reverse". (Try "man bootparam" or see the
+  documentation of your boot loader (lilo or loadlin) about how to
+  pass options to the kernel at boot time.)
+
+  Note that, if you do this, the order of the hd* devices will be
+  rearranged which may require modification of fstab and other files.
+
+  If in doubt, say N.
+
+Use PCI DMA by default when available
+CONFIG_IDEDMA_PCI_AUTO
+  Prior to kernel version 2.1.112, Linux used to automatically use
+  DMA for IDE drives and chipsets which support it. Due to concerns
+  about a couple of cases where buggy hardware may have caused damage,
+  the default is now to NOT use DMA automatically. To revert to the
+  previous behaviour, say Y to this question.
+
+  If you suspect your hardware is at all flakey, say N here.
+  Do NOT email the IDE kernel people regarding this issue!
+
+  It is normally safe to answer Y to this question unless your
+  motherboard uses a VIA VP2 chipset, in which case you should say N.
+
+IGNORE word93 Validation BITS
+CONFIG_IDEDMA_IVB
+  There are unclear terms in ATA-4 and ATA-5 standards how certain
+  hardware (an 80c ribbon) should be detected. Different interpretations
+  of the standards have been released in hardware. This causes problems:
+  for example, a host with Ultra Mode 4 (or higher) will not run
+  in that mode with an 80c ribbon.
+
+  If you are experiencing compatibility or performance problems, you
+  MAY try to answering Y here. However, it does not necessarily solve
+  any of your problems, it could even cause more of them.
+
+  It is normally safe to answer Y; however, the default is N.
+
+ATA Work(s) In Progress (EXPERIMENTAL)
+CONFIG_IDEDMA_PCI_WIP
+  If you enable this you will be able to use and test highly
+  developmental projects. If you say N, the configurator will
+  simply skip those options.
+
+  It is SAFEST to say N to this question.
+
+Asynchronous DMA support (EXPERIMENTAL)
+CONFIG_BLK_DEV_ADMA
+  Please read the comments at the top of
+  <file:drivers/ide/ide-adma.c>.
+
+Pacific Digital A-DMA support (EXPERIMENTAL)
+CONFIG_BLK_DEV_PDC_ADMA
+  Please read the comments at the top of <file:drivers/ide/setup-pci.c>.
+
+3ware Hardware ATA-RAID support
+CONFIG_BLK_DEV_3W_XXXX_RAID
+  3ware is the only hardware ATA-Raid product in Linux to date.
+  This card is 2,4, or 8 channel master mode support only.
+  SCSI support required!!!
+
+  <http://www.3ware.com/>
+
+  Please read the comments at the top of
+  <file:drivers/scsi/3w-xxxx.c>.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called 3w-xxxx.o.
+
+AEC62XX chipset support
+CONFIG_BLK_DEV_AEC62XX
+  This driver adds up to 4 more EIDE devices sharing a single
+  interrupt. This add-on card is a bootable PCI UDMA controller. In
+  order to get this card to initialize correctly in some cases, you
+  should say Y here, and preferably also to "Use DMA by default when
+  available".
+
+  The ATP850U/UF is an UltraDMA 33 chipset base.
+  The ATP860 is an UltraDMA 66 chipset base.
+  The ATP860M(acintosh) version is an UltraDMA 66 chipset base.
+
+  Please read the comments at the top of <file:drivers/ide/pci/aec62xx.c>.
+  If you say Y here, then say Y to "Use DMA by default when available"
+  as well.
+
+AEC62XX Tuning support
+CONFIG_AEC62XX_TUNING
+  Please read the comments at the top of <file:drivers/ide/pci/aec62xx.c>.
+  If unsure, say N.
+
+ALI M15x3 chipset support
+CONFIG_BLK_DEV_ALI15X3
+  This driver ensures (U)DMA support for ALI 1533, 1543 and 1543C
+  onboard chipsets.  It also tests for Simplex mode and enables
+  normal dual channel support.
+
+  If you say Y here, you also need to say Y to "Use DMA by default
+  when available", above.  Please read the comments at the top of
+  <file:drivers/ide/pci/alim15x3.c>.
+
+  If unsure, say N.
+
+ALI M15x3 WDC support (DANGEROUS)
+CONFIG_WDC_ALI15X3
+  This allows for UltraDMA support for WDC drives that ignore CRC
+  checking. You are a fool for enabling this option, but there have
+  been requests. DO NOT COMPLAIN IF YOUR DRIVE HAS FS CORRUPTION, IF
+  YOU ENABLE THIS! No one will listen, just laugh for ignoring this
+  SERIOUS WARNING.
+
+  Using this option can allow WDC drives to run at ATA-4/5 transfer
+  rates with only an ATA-2 support structure.
+
+  SAY N!
+
+AMD and nVidia IDE support
+CONFIG_BLK_DEV_AMD74XX
+  This driver adds explicit support for AMD-7xx and AMD-8111 chips
+  and also for the nVidia nForce chip.  This allows the kernel to
+  change PIO, DMA and UDMA speeds and to configure the chip to
+  optimum performance.
+
+  If you say Y here, you also need to say Y to "Use DMA by default
+  when available", above.
+  Please read the comments at the top of <file:drivers/ide/pci/amd74xx.c>.
+
+  If unsure, say N.
+
+AMD Viper ATA-66 Override support (WIP)
+CONFIG_AMD74XX_OVERRIDE
+  This option auto-forces the ata66 flag.
+  This effect can be also invoked by calling "idex=ata66"
+  If unsure, say N.
+
+CMD64X/CMD680 chipset support
+CONFIG_BLK_DEV_CMD64X
+  Say Y here if you have an IDE controller which uses any of these
+  chipsets: CMD643, CMD646 and CMD648.
+
+CY82C693 chipset support
+CONFIG_BLK_DEV_CY82C693
+  This driver adds detection and support for the CY82C693 chipset
+  used on Digital's PC-Alpha 164SX boards.
+
+  If you say Y here, you need to say Y to "Use DMA by default
+  when available" as well.
+
+Cyrix CS5530 MediaGX chipset support
+CONFIG_BLK_DEV_CS5530
+  Include support for UDMA on the Cyrix MediaGX 5530 chipset. This
+  will automatically be detected and configured if found.
+
+  It is safe to say Y to this question.
+
+  People with SCSI-only systems should say N here. If unsure, say Y.
+
+HPT34X chipset support
+CONFIG_BLK_DEV_HPT34X
+  This driver adds up to 4 more EIDE devices sharing a single
+  interrupt. The HPT343 chipset in its current form is a non-bootable
+  controller; the HPT345/HPT363 chipset is a bootable (needs BIOS FIX)
+  PCI UDMA controllers. This driver requires dynamic tuning of the
+  chipset during the ide-probe at boot time. It is reported to support
+  DVD II drives, by the manufacturer.
+
+HPT34X AUTODMA support (WIP)
+CONFIG_HPT34X_AUTODMA
+  This is a dangerous thing to attempt currently! Please read the
+  comments at the top of <file:drivers/ide/pci/hpt34x.c>.  If you say Y
+  here, then say Y to "Use DMA by default when available" as well.
+
+  If unsure, say N.
+
+HPT36X/37X chipset support
+CONFIG_BLK_DEV_HPT366
+  HPT366 is an Ultra DMA chipset for ATA-66.
+  HPT368 is an Ultra DMA chipset for ATA-66 RAID Based.
+  HPT370 is an Ultra DMA chipset for ATA-100.
+  HPT372 is an Ultra DMA chipset for ATA-133.
+  HPT374 is an Ultra DMA chipset for ATA-133.
+
+  This driver adds up to 4 more EIDE devices sharing a single
+  interrupt.
+
+  The HPT366 chipset in its current form is bootable. One solution
+  for this problem are special LILO commands for redirecting the
+  reference to device 0x80. The other solution is to say Y to "Boot
+  off-board chipsets first support" (CONFIG_BLK_DEV_OFFBOARD) unless
+  your mother board has the chipset natively mounted. Regardless one
+  should use the fore mentioned option and call at LILO or include
+  "ide=reverse" in LILO's append-line.
+
+  This driver requires dynamic tuning of the chipset during the
+  ide-probe at boot. It is reported to support DVD II drives, by the
+  manufacturer.
+
+NS87415 chipset support (EXPERIMENTAL)
+CONFIG_BLK_DEV_NS87415
+  This driver adds detection and support for the NS87415 chip
+  (used in SPARC64, among others).
+
+  Please read the comments at the top of <file:drivers/ide/pci/ns87415.c>.
+
+OPTi 82C621 chipset enhanced support (EXPERIMENTAL)
+CONFIG_BLK_DEV_OPTI621
+  This is a driver for the OPTi 82C621 EIDE controller.
+  Please read the comments at the top of <file:drivers/ide/pci/opti621.c>.
+
+ServerWorks OSB4/CSB5 chipset support
+CONFIG_BLK_DEV_SVWKS
+  This driver adds PIO/(U)DMA support for the ServerWorks OSB4/CSB5
+  chipsets.
+
+Intel PIIXn chipsets support
+CONFIG_BLK_DEV_PIIX
+  This driver adds PIO mode setting and tuning for all PIIX IDE
+  controllers by Intel.  Since the BIOS can sometimes improperly tune
+  PIO 0-4 mode settings, this allows dynamic tuning of the chipset
+  via the standard end-user tool 'hdparm'.
+
+  Please read the comments at the top of <file:drivers/ide/pci/piix.c>.
+
+  If you say Y here, you should also say Y to "PIIXn Tuning support",
+  below.
+
+  If unsure, say N.
+
+PIIXn Tuning support
+CONFIG_PIIX_TUNING
+  This driver extension adds DMA mode setting and tuning for all PIIX
+  IDE controllers by Intel. Since the BIOS can sometimes improperly
+  set up the device/adapter combination and speed limits, it has
+  become a necessity to back/forward speed devices as needed.
+
+  Case 430HX/440FX PIIX3 need speed limits to reduce UDMA to DMA mode
+  2 if the BIOS can not perform this task at initialization.
+
+  If unsure, say N.
+
+PROMISE PDC20246/PDC20262/PDC20265/PDC20267/PDC20268 support
+CONFIG_BLK_DEV_PDC202XX_OLD
+  Promise Ultra33 or PDC20246
+  Promise Ultra66 or PDC20262
+  Promise Ultra100 or PDC20265/PDC20267/PDC20268
+
+  This driver adds up to 4 more EIDE devices sharing a single
+  interrupt. This add-on card is a bootable PCI UDMA controller. Since
+  multiple cards can be installed and there are BIOS ROM problems that
+  happen if the BIOS revisions of all installed cards (three-max) do
+  not match, the driver attempts to do dynamic tuning of the chipset
+  at boot-time for max-speed.  Ultra33 BIOS 1.25 or newer is required
+  for more than one card. This card may require that you say Y to
+  "Special UDMA Feature".
+
+  If you say Y here, you need to say Y to "Use DMA by default when
+  available" as well.
+
+  Please read the comments at the top of
+  <file:drivers/ide/pci/pdc202xx_old.c>.
+
+  If unsure, say N.
+
+Special UDMA Feature
+CONFIG_PDC202XX_BURST
+  This option causes the pdc202xx driver to enable UDMA modes on the
+  PDC202xx even when the PDC202xx BIOS has not done so.
+
+  It was originally designed for the PDC20246/Ultra33, whose BIOS will
+  only setup UDMA on the first two PDC20246 cards.  It has also been
+  used successfully on a PDC20265/Ultra100, allowing use of UDMA modes
+  when the PDC20265 BIOS has been disabled (for faster boot up).
+
+  Please read the comments at the top of
+  <file:drivers/ide/pci/pdc202xx_old.c>.
+
+  If unsure, say N.
+
+Special FastTrak Feature
+CONFIG_PDC202XX_FORCE
+  For FastTrak enable overriding BIOS.
+
+SiS5513 chipset support
+CONFIG_BLK_DEV_SIS5513
+  This driver ensures (U)DMA support for SIS5513 chipset family based
+  mainboards.
+
+  The following chipsets are supported:
+  ATA16:  SiS5511, SiS5513
+  ATA33:  SiS5591, SiS5597, SiS5598, SiS5600
+  ATA66:  SiS530, SiS540, SiS620, SiS630, SiS640
+  ATA100: SiS635, SiS645, SiS650, SiS730, SiS735, SiS740,
+          SiS745, SiS750
+
+  If you say Y here, you need to say Y to "Use DMA by default when
+  available" as well.
+
+  Please read the comments at the top of <file:drivers/ide/pci/sis5513.c>.
+
+Silicon Image chipset support
+CONFIG_BLK_DEV_SIIMAGE
+  This driver provides (U)DMA support for the SII3112 SATA controllers and
+  for the CMD/SI680 UDMA/DMA ATA controller.
+
+SLC90E66 chipset support
+CONFIG_BLK_DEV_SLC90E66
+  This driver ensures (U)DMA support for Victroy66 SouthBridges for
+  SMsC with Intel NorthBridges.  This is an Ultra66 based chipset.
+  The nice thing about it is that you can mix Ultra/DMA/PIO devices
+  and it will handle timing cycles.  Since this is an improved
+  look-a-like to the PIIX4 it should be a nice addition.
+
+  If you say Y here, you need to say Y to "Use DMA by default when
+  available" as well.
+
+  Please read the comments at the top of
+  <file:drivers/ide/pci/slc90e66.c>.
+
+Winbond SL82c105 support
+CONFIG_BLK_DEV_SL82C105
+  If you have a Winbond SL82c105 IDE controller, say Y here to enable
+  special configuration for this chip. This is common on various CHRP
+  motherboards, but could be used elsewhere. If in doubt, say Y.
+
+Tekram TRM290 chipset support
+CONFIG_BLK_DEV_TRM290
+  This driver adds support for bus master DMA transfers
+  using the Tekram TRM290 PCI IDE chip. Volunteers are
+  needed for further tweaking and development.
+  Please read the comments at the top of <file:drivers/ide/pci/trm290.c>.
+
+VIA82CXXX chipset support
+CONFIG_BLK_DEV_VIA82CXXX
+  This allows you to configure your chipset for a better use while
+  running PIO/(U)DMA, it will allow you to enable efficiently the
+  second channel dma usage, as it may not be set by BIOS.  It will try
+  to set fifo configuration at its best.  It will allow you to get
+  information from /proc/ide/via provided you enabled "/proc file
+  system" support.
+
+  Please read the comments at the top of
+  <file:drivers/ide/pci/via82cxxx.c>.
+
+  If you say Y here, then say Y to "Use DMA by default when available"
+  as well.
+
+  If unsure, say N.
+
+RapIDE interface support
+CONFIG_BLK_DEV_IDE_RAPIDE
+  Say Y here if you want to support the Yellowstone RapIDE controller
+  manufactured for use with Acorn computers.
+
+Other IDE chipset support
+CONFIG_IDE_CHIPSETS
+  Say Y here if you want to include enhanced support for various IDE
+  interface chipsets used on motherboards and add-on cards. You can
+  then pick your particular IDE chip from among the following options.
+  This enhanced support may be necessary for Linux to be able to
+  access the 3rd/4th drives in some systems. It may also enable
+  setting of higher speed I/O rates to improve system performance with
+  these chipsets. Most of these also require special kernel boot
+  parameters to actually turn on the support at runtime; you can find
+  a list of these in the file <file:Documentation/ide.txt>.
+
+  People with SCSI-only systems can say N here.
+
+Generic 4 drives/port support
+CONFIG_BLK_DEV_4DRIVES
+  Certain older chipsets, including the Tekram 690CD, use a single set
+  of I/O ports at 0x1f0 to control up to four drives, instead of the
+  customary two drives per port. Support for this can be enabled at
+  runtime using the "ide0=four" kernel boot parameter if you say Y
+  here.
+
+ALI M14xx support
+CONFIG_BLK_DEV_ALI14XX
+  This driver is enabled at runtime using the "ide0=ali14xx" kernel
+  boot parameter.  It enables support for the secondary IDE interface
+  of the ALI M1439/1443/1445/1487/1489 chipsets, and permits faster
+  I/O speeds to be set as well.  See the files
+  <file:Documentation/ide.txt> and <file:drivers/ide/legacy/ali14xx.c> for
+  more info.
+
+DTC-2278 support
+CONFIG_BLK_DEV_DTC2278
+  This driver is enabled at runtime using the "ide0=dtc2278" kernel
+  boot parameter. It enables support for the secondary IDE interface
+  of the DTC-2278 card, and permits faster I/O speeds to be set as
+  well. See the <file:Documentation/ide.txt> and
+  <file:drivers/ide/legacy/dtc2278.c> files for more info.
+
+Holtek HT6560B support
+CONFIG_BLK_DEV_HT6560B
+  This driver is enabled at runtime using the "ide0=ht6560b" kernel
+  boot parameter. It enables support for the secondary IDE interface
+  of the Holtek card, and permits faster I/O speeds to be set as well.
+  See the <file:Documentation/ide.txt> and
+  <file:drivers/ide/legacy/ht6560b.c> files for more info.
+
+PROMISE DC4030 support (EXPERIMENTAL)
+CONFIG_BLK_DEV_PDC4030
+  This driver provides support for the secondary IDE interface and
+  cache of Promise IDE chipsets, e.g. DC4030 and DC5030.  This driver
+  is known to incur timeouts/retries during heavy I/O to drives
+  attached to the secondary interface.  CD-ROM and TAPE devices are
+  not supported yet.  This driver is enabled at runtime using the
+  "ide0=dc4030" kernel boot parameter.  See the
+  <file:Documentation/ide.txt> and <file:drivers/ide/legacy/pdc4030.c> files
+  for more info.
+
+QDI QD65XX support
+CONFIG_BLK_DEV_QD65XX
+  This driver is enabled at runtime using the "ide0=qd65xx" kernel
+  boot parameter.  It permits faster I/O speeds to be set.  See the
+  <file:Documentation/ide.txt> and <file:drivers/ide/legacy/qd65xx.c> for
+  more info.
+
+UMC 8672 support
+CONFIG_BLK_DEV_UMC8672
+  This driver is enabled at runtime using the "ide0=umc8672" kernel
+  boot parameter. It enables support for the secondary IDE interface
+  of the UMC-8672, and permits faster I/O speeds to be set as well.
+  See the files <file:Documentation/ide.txt> and
+  <file:drivers/ide/legacy/umc8672.c> for more info.
+
+Amiga Gayle IDE interface support
+CONFIG_BLK_DEV_GAYLE
+  This is the IDE driver for the builtin IDE interface on some Amiga
+  models. It supports both the `A1200 style' (used in A600 and A1200)
+  and `A4000 style' (used in A4000 and A4000T) of the Gayle IDE
+  interface. Say Y if you have such an Amiga model and want to use IDE
+  devices (hard disks, CD-ROM drives, etc.) that are connected to the
+  builtin IDE interface.
+
+Falcon IDE interface support
+CONFIG_BLK_DEV_FALCON_IDE
+  This is the IDE driver for the builtin IDE interface on the Atari
+  Falcon. Say Y if you have a Falcon and want to use IDE devices (hard
+  disks, CD-ROM drives, etc.) that are connected to the builtin IDE
+  interface.
+
+Amiga Buddha/Catweasel/X-Surf IDE interface support (EXPERIMENTAL)
+CONFIG_BLK_DEV_BUDDHA
+  This is the IDE driver for the IDE interfaces on the Buddha, 
+  Catweasel and X-Surf expansion boards.  It supports up to two interfaces 
+  on the Buddha, three on the Catweasel and two on the X-Surf.
+
+  Say Y if you have a Buddha or Catweasel expansion board and want to
+  use IDE devices (hard disks, CD-ROM drives, etc.) that are connected
+  to one of its IDE interfaces.
+
+Amiga IDE Doubler support (EXPERIMENTAL)
+CONFIG_BLK_DEV_IDEDOUBLER
+  This driver provides support for the so-called `IDE doublers' (made
+  by various manufacturers, e.g. Eyetech) that can be connected to the
+  builtin IDE interface of some Amiga models. Using such an IDE
+  doubler, you can connect up to four instead of two IDE devices on
+  the Amiga's builtin IDE interface.
+
+  Note that the normal Amiga Gayle IDE driver may not work correctly
+  if you have an IDE doubler and don't enable this driver!
+
+  Say Y if you have an IDE doubler.  The driver is enabled at kernel
+  runtime using the "ide=doubler" kernel boot parameter.
+
+WarpEngine SCSI support
+CONFIG_WARPENGINE_SCSI
+  Support for MacroSystem Development's WarpEngine Amiga SCSI-2
+  controller. Info at
+  <http://www.lysator.liu.se/amiga/ar/guide/ar310.guide?FEATURE5>.
+
+Builtin PowerMac IDE support
+CONFIG_BLK_DEV_IDE_PMAC
+  This driver provides support for the built-in IDE controller on
+  most of the recent Apple Power Macintoshes and PowerBooks.
+  If unsure, say Y.
+
+PowerMac IDE DMA support
+CONFIG_BLK_DEV_IDEDMA_PMAC
+  This option allows the driver for the built-in IDE controller on
+  Power Macintoshes and PowerBooks to use DMA (direct memory access)
+  to transfer data to and from memory.  Saying Y is safe and improves
+  performance.
+
+Broadcom SiByte onboard IDE support
+CONFIG_BLK_DEV_IDE_SIBYTE
+  Include the driver for on-board IDE on the SiByte Generic Bus.  Note
+  that this limits the number of IDE devices to 4 (ide0...ide3).
+
+Use DMA by default
+CONFIG_BLK_DEV_IDEDMA_PMAC_AUTO
+  This option allows the driver for the built-in IDE controller on
+  Power Macintoshes and PowerBooks to use DMA automatically, without
+  it having to be explicitly enabled.  This option is provided because
+  of concerns about a couple of cases where using DMA on buggy PC
+  hardware may have caused damage.  Saying Y should be safe on all
+  Apple machines.
+
+Macintosh Quadra/Powerbook IDE interface support
+CONFIG_BLK_DEV_MAC_IDE
+  This is the IDE driver for the builtin IDE interface on some m68k
+  Macintosh models. It supports both the `Quadra style' (used in
+  Quadra/ Centris 630 and Performa 588 models) and `Powerbook style'
+  (used in the Powerbook 150 and 190 models) IDE interface.
+
+  Say Y if you have such an Macintosh model and want to use IDE
+  devices (hard disks, CD-ROM drives, etc.) that are connected to the
+  builtin IDE interface.
+
+ICS IDE interface support
+CONFIG_BLK_DEV_IDE_ICSIDE
+  On Acorn systems, say Y here if you wish to use the ICS IDE
+  interface card.  This is not required for ICS partition support.
+  If you are unsure, say N to this.
+
+ICS DMA support
+CONFIG_BLK_DEV_IDEDMA_ICS
+  Say Y here if you want to add DMA (Direct Memory Access) support to
+  the ICS IDE driver.
+
+Use ICS DMA by default
+CONFIG_IDEDMA_ICS_AUTO
+  Prior to kernel version 2.1.112, Linux used to automatically use
+  DMA for IDE drives and chipsets which support it. Due to concerns
+  about a couple of cases where buggy hardware may have caused damage,
+  the default is now to NOT use DMA automatically. To revert to the
+  previous behaviour, say Y to this question.
+
+  If you suspect your hardware is at all flakey, say N here.
+  Do NOT email the IDE kernel people regarding this issue!
+
+XT hard disk support
+CONFIG_BLK_DEV_XD
+  Very old 8 bit hard disk controllers used in the IBM XT computer
+  will be supported if you say Y here.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>. The module
+  will be called xd.o.
+
+  It's pretty unlikely that you have one of these: say N.
+
+PS/2 ESDI hard disk support
+CONFIG_BLK_DEV_PS2
+  Say Y here if you have a PS/2 machine with a MCA bus and an ESDI
+  hard disk.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ps2esdi.o.
+
+Mylex DAC960/DAC1100 PCI RAID Controller support
+CONFIG_BLK_DEV_DAC960
+  This driver adds support for the Mylex DAC960, AcceleRAID, and
+  eXtremeRAID PCI RAID controllers.  See the file
+  <file:Documentation/README.DAC960> for further information about
+  this driver.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called DAC960.o.
+
+Parallel port IDE device support
+CONFIG_PARIDE
+  There are many external CD-ROM and disk devices that connect through
+  your computer's parallel port. Most of them are actually IDE devices
+  using a parallel port IDE adapter. This option enables the PARIDE
+  subsystem which contains drivers for many of these external drives.
+  Read <file:Documentation/paride.txt> for more information.
+
+  If you have said Y to the "Parallel-port support" configuration
+  option, you may share a single port between your printer and other
+  parallel port devices. Answer Y to build PARIDE support into your
+  kernel, or M if you would like to build it as a loadable module. If
+  your parallel port support is in a loadable module, you must build
+  PARIDE as a module. If you built PARIDE support into your kernel,
+  you may still build the individual protocol modules and high-level
+  drivers as loadable modules. If you build this support as a module,
+  it will be called paride.o.
+
+  To use the PARIDE support, you must say Y or M here and also to at
+  least one high-level driver (e.g. "Parallel port IDE disks",
+  "Parallel port ATAPI CD-ROMs", "Parallel port ATAPI disks" etc.) and
+  to at least one protocol driver (e.g. "ATEN EH-100 protocol",
+  "MicroSolutions backpack protocol", "DataStor Commuter protocol"
+  etc.).
+
+Parallel port IDE disks
+CONFIG_PARIDE_PD
+  This option enables the high-level driver for IDE-type disk devices
+  connected through a parallel port. If you chose to build PARIDE
+  support into your kernel, you may answer Y here to build in the
+  parallel port IDE driver, otherwise you should answer M to build
+  it as a loadable module. The module will be called pd.o. You
+  must also have at least one parallel port protocol driver in your
+  system. Among the devices supported by this driver are the SyQuest
+  EZ-135, EZ-230 and SparQ drives, the Avatar Shark and the backpack
+  hard drives from MicroSolutions.
+
+Parallel port ATAPI CD-ROMs
+CONFIG_PARIDE_PCD
+  This option enables the high-level driver for ATAPI CD-ROM devices
+  connected through a parallel port. If you chose to build PARIDE
+  support into your kernel, you may answer Y here to build in the
+  parallel port ATAPI CD-ROM driver, otherwise you should answer M to
+  build it as a loadable module. The module will be called pcd.o. You
+  must also have at least one parallel port protocol driver in your
+  system. Among the devices supported by this driver are the
+  MicroSolutions backpack CD-ROM drives and the Freecom Power CD. If
+  you have such a CD-ROM drive, you should also say Y or M to "ISO
+  9660 CD-ROM file system support" below, because that's the file
+  system used on CD-ROMs.
+
+Parallel port ATAPI disks
+CONFIG_PARIDE_PF
+  This option enables the high-level driver for ATAPI disk devices
+  connected through a parallel port. If you chose to build PARIDE
+  support into your kernel, you may answer Y here to build in the
+  parallel port ATAPI disk driver, otherwise you should answer M
+  to build it as a loadable module. The module will be called pf.o.
+  You must also have at least one parallel port protocol driver in
+  your system. Among the devices supported by this driver are the
+  MicroSolutions backpack PD/CD drive and the Imation Superdisk
+  LS-120 drive.
+
+Parallel port ATAPI tapes
+CONFIG_PARIDE_PT
+  This option enables the high-level driver for ATAPI tape devices
+  connected through a parallel port. If you chose to build PARIDE
+  support into your kernel, you may answer Y here to build in the
+  parallel port ATAPI disk driver, otherwise you should answer M
+  to build it as a loadable module. The module will be called pt.o.
+  You must also have at least one parallel port protocol driver in
+  your system. Among the devices supported by this driver is the
+  parallel port version of the HP 5GB drive.
+
+Parallel port generic ATAPI devices
+CONFIG_PARIDE_PG
+  This option enables a special high-level driver for generic ATAPI
+  devices connected through a parallel port. The driver allows user
+  programs, such as cdrtools, to send ATAPI commands directly to a
+  device.
+
+  If you chose to build PARIDE support into your kernel, you may
+  answer Y here to build in the parallel port generic ATAPI driver,
+  otherwise you should answer M to build it as a loadable module. The
+  module will be called pg.o.
+
+  You must also have at least one parallel port protocol driver in
+  your system.
+
+  This driver implements an API loosely related to the generic SCSI
+  driver. See <file:include/linux/pg.h>. for details.
+
+  You can obtain the most recent version of cdrtools from
+  <ftp://ftp.fokus.gmd.de/pub/unix/cdrecord/>. Versions 1.6.1a3 and
+  later fully support this driver.
+
+ATEN EH-100 protocol
+CONFIG_PARIDE_ATEN
+  This option enables support for the ATEN EH-100 parallel port IDE
+  protocol. This protocol is used in some inexpensive low performance
+  parallel port kits made in Hong Kong. If you chose to build PARIDE
+  support into your kernel, you may answer Y here to build in the
+  protocol driver, otherwise you should answer M to build it as a
+  loadable module. The module will be called aten.o. You must also
+  have a high-level driver for the type of device that you want to
+  support.
+
+Micro Solutions BACKPACK Series 5 protocol
+CONFIG_PARIDE_BPCK
+  This option enables support for the Micro Solutions BACKPACK
+  parallel port Series 5 IDE protocol.  (Most BACKPACK drives made
+  before 1999 were Series 5) Series 5 drives will NOT always have the
+  Series noted on the bottom of the drive. Series 6 drivers will.
+
+  In other words, if your BACKPACK drive dosen't say "Series 6" on the
+  bottom, enable this option.
+
+  If you chose to build PARIDE support into your kernel, you may
+  answer Y here to build in the protocol driver, otherwise you should
+  answer M to build it as a loadable module.  The module will be
+  called bpck.o.  You must also have a high-level driver for the type
+  of device that you want to support.
+
+Micro Solutions BACKPACK Series 6 protocol
+CONFIG_PARIDE_BPCK6
+  This option enables support for the Micro Solutions BACKPACK
+  parallel port Series 6 IDE protocol.  (Most BACKPACK drives made
+  after 1999 were Series 6) Series 6 drives will have the Series noted
+  on the bottom of the drive.  Series 5 drivers don't always have it
+  noted.
+
+  In other words, if your BACKPACK drive says "Series 6" on the
+  bottom, enable this option.
+
+  If you chose to build PARIDE support into your kernel, you may
+  answer Y here to build in the protocol driver, otherwise you should
+  answer M to build it as a loadable module.  The module will be
+  called bpck6.o.  You must also have a high-level driver for the type
+  of device that you want to support.
+
+DataStor Commuter protocol
+CONFIG_PARIDE_COMM
+  This option enables support for the Commuter parallel port IDE
+  protocol from DataStor. If you chose to build PARIDE support
+  into your kernel, you may answer Y here to build in the protocol
+  driver, otherwise you should answer M to build it as a loadable
+  module. The module will be called comm.o. You must also have
+  a high-level driver for the type of device that you want to support.
+
+DataStor EP-2000 protocol
+CONFIG_PARIDE_DSTR
+  This option enables support for the EP-2000 parallel port IDE
+  protocol from DataStor. If you chose to build PARIDE support
+  into your kernel, you may answer Y here to build in the protocol
+  driver, otherwise you should answer M to build it as a loadable
+  module. The module will be called dstr.o. You must also have
+  a high-level driver for the type of device that you want to support.
+
+Shuttle EPAT/EPEZ protocol
+CONFIG_PARIDE_EPAT
+  This option enables support for the EPAT parallel port IDE protocol.
+  EPAT is a parallel port IDE adapter manufactured by Shuttle
+  Technology and widely used in devices from major vendors such as
+  Hewlett-Packard, SyQuest, Imation and Avatar. If you chose to build
+  PARIDE support into your kernel, you may answer Y here to build in
+  the protocol driver, otherwise you should answer M to build it as a
+  loadable module. The module will be called epat.o. You must also
+  have a high-level driver for the type of device that you want to
+  support.
+
+Shuttle EPAT c7/c8 extension
+CONFIG_PARIDE_EPATC8
+  This option enables support for the newer Shuttle EP1284 (aka c7 and
+  c8) chip. You need this if you are using any recent Imation SuperDisk
+  (LS-120) drive.
+
+Shuttle EPIA protocol
+CONFIG_PARIDE_EPIA
+  This option enables support for the (obsolete) EPIA parallel port
+  IDE protocol from Shuttle Technology. This adapter can still be
+  found in some no-name kits. If you chose to build PARIDE support
+  into your kernel, you may answer Y here to build in the protocol
+  driver, otherwise you should answer M to build it as a loadable
+  module. The module will be called epia.o. You must also have a
+  high-level driver for the type of device that you want to support.
+
+FIT TD-2000 protocol
+CONFIG_PARIDE_FIT2
+  This option enables support for the TD-2000 parallel port IDE
+  protocol from Fidelity International Technology. This is a simple
+  (low speed) adapter that is used in some portable hard drives. If
+  you chose to build PARIDE support into your kernel, you may answer Y
+  here to build in the protocol driver, otherwise you should answer M
+  to build it as a loadable module. The module will be called fit2.o.
+  You must also have a high-level driver for the type of device that
+  you want to support.
+
+FIT TD-3000 protocol
+CONFIG_PARIDE_FIT3
+  This option enables support for the TD-3000 parallel port IDE
+  protocol from Fidelity International Technology. This protocol is
+  used in newer models of their portable disk, CD-ROM and PD/CD
+  devices. If you chose to build PARIDE support into your kernel, you
+  may answer Y here to build in the protocol driver, otherwise you
+  should answer M to build it as a loadable module. The module will be
+  called fit3.o. You must also have a high-level driver for the type
+  of device that you want to support.
+
+Freecom IQ ASIC-2 protocol
+CONFIG_PARIDE_FRIQ
+  This option enables support for version 2 of the Freecom IQ parallel
+  port IDE adapter.  This adapter is used by the Maxell Superdisk
+  drive.  If you chose to build PARIDE support into your kernel, you
+  may answer Y here to build in the protocol driver, otherwise you
+  should answer M to build it as a loadable module. The module will be
+  called friq.o. You must also have a high-level driver for the type
+  of device that you want to support.
+
+FreeCom power protocol
+CONFIG_PARIDE_FRPW
+  This option enables support for the Freecom power parallel port IDE
+  protocol. If you chose to build PARIDE support into your kernel, you
+  may answer Y here to build in the protocol driver, otherwise you
+  should answer M to build it as a loadable module. The module will be
+  called frpw.o. You must also have a high-level driver for the type
+  of device that you want to support.
+
+KingByte KBIC-951A/971A protocols
+CONFIG_PARIDE_KBIC
+  This option enables support for the KBIC-951A and KBIC-971A parallel
+  port IDE protocols from KingByte Information Corp. KingByte's
+  adapters appear in many no-name portable disk and CD-ROM products,
+  especially in Europe. If you chose to build PARIDE support into your
+  kernel, you may answer Y here to build in the protocol driver,
+  otherwise you should answer M to build it as a loadable module. The
+  module will be called kbic.o. You must also have a high-level driver
+  for the type of device that you want to support.
+
+KT PHd protocol
+CONFIG_PARIDE_KTTI
+  This option enables support for the "PHd" parallel port IDE protocol
+  from KT Technology. This is a simple (low speed) adapter that is
+  used in some 2.5" portable hard drives. If you chose to build PARIDE
+  support into your kernel, you may answer Y here to build in the
+  protocol driver, otherwise you should answer M to build it as a
+  loadable module. The module will be called ktti.o. You must also
+  have a high-level driver for the type of device that you want to
+  support.
+
+OnSpec 90c20 protocol
+CONFIG_PARIDE_ON20
+  This option enables support for the (obsolete) 90c20 parallel port
+  IDE protocol from OnSpec (often marketed under the ValuStore brand
+  name). If you chose to build PARIDE support into your kernel, you
+  may answer Y here to build in the protocol driver, otherwise you
+  should answer M to build it as a loadable module. The module will
+  be called on20.o. You must also have a high-level driver for the
+  type of device that you want to support.
+
+OnSpec 90c26 protocol
+CONFIG_PARIDE_ON26
+  This option enables support for the 90c26 parallel port IDE protocol
+  from OnSpec Electronics (often marketed under the ValuStore brand
+  name). If you chose to build PARIDE support into your kernel, you
+  may answer Y here to build in the protocol driver, otherwise you
+  should answer M to build it as a loadable module. The module will be
+  called on26.o. You must also have a high-level driver for the type
+  of device that you want to support.
+
+Logical Volume Manager (LVM) support
+CONFIG_BLK_DEV_LVM
+  This driver lets you combine several hard disks, hard disk
+  partitions, multiple devices or even loop devices (for evaluation
+  purposes) into a volume group.  Imagine a volume group as a kind of
+  virtual disk. Logical volumes, which can be thought of as virtual
+  partitions, can be created in the volume group.  You can resize
+  volume groups and logical volumes after creation time, corresponding
+  to new capacity needs.  Logical volumes are accessed as block
+  devices named /dev/VolumeGroupName/LogicalVolumeName.
+
+  For details see <file:Documentation/LVM-HOWTO>.  You will need
+  supporting user space software; location is in
+  <file:Documentation/Changes>.
+
+  If you want to compile this support as a module ( = code which can
+  be inserted in and removed from the running kernel whenever you
+  want), say M here and read <file:Documentation/modules.txt>.  The
+  module will be called lvm-mod.o.
+
+Multiple devices driver support (RAID and LVM)
+CONFIG_MD
+  Support multiple physical spindles through a single logical device.
+  Required for RAID and logical volume management (LVM).
+
+Multiple devices driver support
+CONFIG_BLK_DEV_MD
+  This driver lets you combine several hard disk partitions into one
+  logical block device. This can be used to simply append one
+  partition to another one or to combine several redundant hard disks
+  into a RAID1/4/5 device so as to provide protection against hard
+  disk failures. This is called "Software RAID" since the combining of
+  the partitions is done by the kernel. "Hardware RAID" means that the
+  combining is done by a dedicated controller; if you have such a
+  controller, you do not need to say Y here.
+
+  More information about Software RAID on Linux is contained in the
+  Software RAID mini-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>. There you will also learn
+  where to get the supporting user space utilities raidtools.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  md.o
+
+  If unsure, say N.
+
+Linear (append) mode
+CONFIG_MD_LINEAR
+  If you say Y here, then your multiple devices driver will be able to
+  use the so-called linear mode, i.e. it will combine the hard disk
+  partitions by simply appending one to the other.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called linear.o.
+
+  If unsure, say Y.
+
+RAID-0 (striping) mode
+CONFIG_MD_RAID0
+  If you say Y here, then your multiple devices driver will be able to
+  use the so-called raid0 mode, i.e. it will combine the hard disk
+  partitions into one logical device in such a fashion as to fill them
+  up evenly, one chunk here and one chunk there. This will increase
+  the throughput rate if the partitions reside on distinct disks.
+
+  Information about Software RAID on Linux is contained in the
+  Software-RAID mini-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>. There you will also
+  learn where to get the supporting user space utilities raidtools.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called raid0.o.
+
+  If unsure, say Y.
+
+RAID-1 (mirroring) mode
+CONFIG_MD_RAID1
+  A RAID-1 set consists of several disk drives which are exact copies
+  of each other.  In the event of a mirror failure, the RAID driver
+  will continue to use the operational mirrors in the set, providing
+  an error free MD (multiple device) to the higher levels of the
+  kernel.  In a set with N drives, the available space is the capacity
+  of a single drive, and the set protects against a failure of (N - 1)
+  drives.
+
+  Information about Software RAID on Linux is contained in the
+  Software-RAID mini-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.  There you will also
+  learn where to get the supporting user space utilities raidtools.
+
+  If you want to use such a RAID-1 set, say Y. This code is also
+  available as a module called raid1.o ( = code which can be inserted
+  in and removed from the running kernel whenever you want).  If you
+  want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+  If unsure, say Y.
+
+RAID-4/RAID-5 mode
+CONFIG_MD_RAID5
+  A RAID-5 set of N drives with a capacity of C MB per drive provides
+  the capacity of C * (N - 1) MB, and protects against a failure
+  of a single drive. For a given sector (row) number, (N - 1) drives
+  contain data sectors, and one drive contains the parity protection.
+  For a RAID-4 set, the parity blocks are present on a single drive,
+  while a RAID-5 set distributes the parity across the drives in one
+  of the available parity distribution methods.
+
+  Information about Software RAID on Linux is contained in the
+  Software-RAID mini-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>. There you will also
+  learn where to get the supporting user space utilities raidtools.
+
+  If you want to use such a RAID-4/RAID-5 set, say Y. This code is
+  also available as a module called raid5.o ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+  If unsure, say Y.
+
+Multipath I/O support
+CONFIG_MD_MULTIPATH
+  Multipath-IO is the ability of certain devices to address the same
+  physical disk over multiple 'IO paths'. The code ensures that such
+  paths can be defined and handled at runtime, and ensures that a
+  transparent failover to the backup path(s) happens if a IO errors
+  arrives on the primary path.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  multipath.o
+
+  If unsure, say N.
+
+Support for IDE Raid controllers
+CONFIG_BLK_DEV_ATARAID
+  Say Y or M if you have an IDE Raid controller and want linux
+  to use its softwareraid feature.  You must also select an
+  appropriate for your board low-level driver below.
+
+  Note, that Linux does not use the Raid implementation in BIOS, and
+  the main purpose for this feature is to retain compatibility and
+  data integrity with other OS-es, using the same disk array. Linux
+  has its own Raid drivers, which you should use if you need better
+  performance.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  ataraid.o
+
+Support Promise software RAID (Fasttrak(tm))
+CONFIG_BLK_DEV_ATARAID_PDC
+  Say Y or M if you have a Promise Fasttrak (tm) Raid controller
+  and want linux to use the softwareraid feature of this card.
+  This driver uses /dev/ataraid/dXpY (X and Y numbers) as device
+  names.
+
+  If you choose to compile this as a module, the module will be called
+  pdcraid.o.
+
+Highpoint 370 software RAID
+CONFIG_BLK_DEV_ATARAID_HPT
+  Say Y or M if you have a Highpoint HPT 370 Raid controller
+  and want linux to use the softwareraid feature of this card.
+  This driver uses /dev/ataraid/dXpY (X and Y numbers) as device
+  names.
+
+  If you choose to compile this as a module, the module will be called
+  hptraid.o.
+
+Support for Acer PICA 1 chipset
+CONFIG_ACER_PICA_61
+  This is a machine with a R4400 133/150 MHz CPU. To compile a Linux
+  kernel that runs on these, say Y here. For details about Linux on
+  the MIPS architecture, check out the Linux/MIPS FAQ on the WWW at
+  <http://oss.sgi.com/mips/>.
+
+Support for Algorithmics P4032 (EXPERIMENTAL)
+CONFIG_ALGOR_P4032
+  This is an evaluation board of the British company Algorithmics.
+  The board uses the R4300 and a R5230 CPUs.  For more information
+  about this board see <http://www.algor.co.uk/>.
+
+Support for BAGET MIPS series
+CONFIG_BAGET_MIPS
+  This enables support for the Baget, a Russian embedded system.  For
+  more details about the Baget see the Linux/MIPS FAQ on
+  <http://oss.sgi.com/mips/>.
+
+Baget AMD LANCE support
+CONFIG_BAGETLANCE
+  Say Y to enable kernel support for AMD Lance Ethernet cards on the
+  MIPS-32-based Baget embedded system.  This chipset is better known
+  via the NE2100 cards.
+
+Support for DECstations
+CONFIG_DECSTATION
+  This enables support for DEC's MIPS based workstations.  For details
+  see the Linux/MIPS FAQ on <http://oss.sgi.com/mips/> and the
+  DECstation porting pages on <http://decstation.unix-ag.org/>.
+
+  If you have one of the following DECstation Models you definitely
+  want to choose R4xx0 for the CPU Type:
+
+       DECstation 5000/50
+       DECstation 5000/150
+       DECstation 5000/260
+       DECsystem 5900/260
+
+  otherwise choose R3000.
+
+Support for Cobalt Micro Server
+CONFIG_COBALT_MICRO_SERVER
+  Support for MIPS-based Cobalt boxes (they have been bought by Sun
+  and are now the "Server Appliance Business Unit") including the 2700
+  series -- versions 1 of the Qube and Raq.  To compile a Linux kernel
+  for this hardware, say Y here.
+
+Support for Cobalt 2800
+CONFIG_COBALT_28
+  Support for the second generation of MIPS-based Cobalt boxes (they
+  have been bought by Sun and are now the "Server Appliance Business
+  Unit") including the 2800 series -- versions 2 of the Qube and Raq.
+  To compile a Linux kernel for this hardware, say Y here.
+
+Support for the Momentum Computer Ocelot SBC
+CONFIG_MOMENCO_OCELOT
+  The Ocelot is a MIPS-based Single Board Computer (SBC) made by
+  Momentum Computer <http://www.momenco.com/>.
+
+Support for NEC DDB Vrc-5074
+CONFIG_DDB5074
+  This enables support for the VR5000-based NEC DDB Vrc-5074
+  evaluation board.
+
+Support for NEC DDB Vrc-5476
+CONFIG_DDB5476
+  This enables support for the R5432-based NEC DDB Vrc-5476
+  evaluation board.
+
+  Features : kernel debugging, serial terminal, NFS root fs, on-board
+  ether port (Need an additional patch at <http://linux.junsun.net/>),
+  USB, AC97, PCI, PCI VGA card & framebuffer console, IDE controller,
+  PS2 keyboard, PS2 mouse, etc.
+
+Support for NEC DDB Vrc-5477
+CONFIG_DDB5477
+  This enables support for the R5432-based NEC DDB Vrc-5477
+  evaluation board.
+
+  Features : kernel debugging, serial terminal, NFS root fs, on-board
+  ether port (Need an additional patch at <http://linux.junsun.net/>),
+  USB, AC97, PCI, etc.
+
+Support for MIPS Atlas board
+CONFIG_MIPS_ATLAS
+  This enables support for the QED R5231-based MIPS Atlas evaluation
+  board.
+
+Support for MIPS Malta board
+CONFIG_MIPS_MALTA
+  This enables support for the VR5000-based MIPS Malta evaluation
+  board.
+
+# Choice: bcmboard
+Support for Broadcom SiByte boards
+CONFIG_SIBYTE_SWARM
+  Enable support for boards based on the Broadcom SiByte family:
+
+  BCM91250A-SWARM    BCM1250 ATX size Eval Board (BCM91250A-SWARM)
+
+  BCM91250E-Sentosa  BCM1250 PCI card Eval Board (BCM91250E-Sentosa)
+
+  BCM91125E-Rhone    BCM1125 PCI card Eval Board (BCM91125E-Rhone)
+
+  Other              Non-Broadcom SiByte-based platform
+
+# Choice: bcmsoc
+Support for Broadcom BCM1xxx SOCs
+CONFIG_SIBYTE_SB1250
+
+  BCM1250     Dual-CPU SB1 with PCI and HyperTransport.
+
+  BCM1120     Uniprocessor SB1.
+
+  BCM1125     Uniprocessor SB1 with PCI (and HyperTransport for 1125H).
+
+BCM1250 Stepping
+CONFIG_CPU_SB1_PASS_1
+  Which pass of the SOC is supported (see the "system_revision"
+  register in the User Manual for more discussion of revisions):
+
+  Pass1    1250 "Pass 1"
+
+  An       1250 "Pass 2"
+
+  Bn       1250 "Pass 2.2"
+
+  Cn       1250 "Pass 3"
+
+BCM112x Stepping
+CONFIG_CPU_SB1_PASS_2
+  Which pass of the SOC is supported (see the "system_revision"
+  register in the User Manual for more discussion of revisions):
+
+  Hybrid   1250 "Pass 2"
+
+  An       112x "Pass 1"
+
+Booting from CFE
+CONFIG_SIBYTE_CFE
+  Make use of the CFE API for enumerating available memory,
+  controlling secondary CPUs, and possibly console output.
+
+Use firmware console
+CONFIG_SIBYTE_CFE_CONSOLE
+  Use the CFE API's console write routines during boot.  Other console
+  options (VT console, sb1250 duart console, etc.) should not be
+  configured.
+
+Support for Bus Watcher statistics
+CONFIG_SIBYTE_BUS_WATCHER
+  Handle and keep statistics on the bus error interrupts (COR_ECC,
+  BAD_ECC, IO_BUS).
+
+Corelis Debugger
+CONFIG_SB1XXX_CORELIS
+  Select compile flags that produce code that can be processed by the
+  Corelis mksym utility and UDB Emulator.
+
+DMA for page clear and copy
+CONFIG_SIBYTE_DMA_PAGEOPS
+  Instead of using the CPU to zero and copy pages, use a Data Mover
+  channel.  These DMA channels are otherwise unused by the standard
+  SiByte Linux port.  Seems to give a small performance benefit.
+
+Support for Galileo Evaluation board or CoSine Orion
+CONFIG_ORION
+  Say Y if configuring for the Galileo evaluation board
+  or CoSine Orion.  More information is available at
+  <http://tochna.technion.ac.il/project/linux/html/linux.html>.
+
+  Otherwise, say N.
+
+Support for Mips Magnum 4000
+CONFIG_MIPS_MAGNUM_4000
+  This is a machine with a R4000 100 MHz CPU. To compile a Linux
+  kernel that runs on these, say Y here. For details about Linux on
+  the MIPS architecture, check out the Linux/MIPS FAQ on the WWW at
+  <http://oss.sgi.com/mips/>.
+
+Enable Qtronix 990P Keyboard Support
+CONFIG_QTRONIX_KEYBOARD
+  Images of Qtronix keyboards are at
+  <http://www.qtronix.com/keyboard.html>.
+
+Support for Olivetti M700
+CONFIG_OLIVETTI_M700
+  This is a machine with a R4000 100 MHz CPU. To compile a Linux
+  kernel that runs on these, say Y here. For details about Linux on
+  the MIPS architecture, check out the Linux/MIPS FAQ on the WWW at
+  <http://oss.sgi.com/mips/>.
+
+Support for SNI RM200 PCI
+CONFIG_SNI_RM200_PCI
+  The SNI RM200 PCI was a MIPS-based platform manufactured by Siemens
+  Nixdorf Informationssysteme (SNI), parent company of Pyramid
+  Technology and now in turn merged with Fujitsu.  Say Y here to
+  support this machine type.
+
+Support for SGI-IP22 (Indy/Indigo2)
+CONFIG_SGI_IP22
+  This are the SGI Indy, Challenge S and Indigo2, as well as certain
+  OEM variants like the Tandem CMN B006S. To compile a Linux kernel
+  that runs on these, say Y here.
+
+Support for SGI IP27 (Origin200/2000)
+CONFIG_SGI_IP27
+  This are the SGI Origin 200, Origin 2000 and Onyx 2 Graphics
+  workstations.  To compile a Linux kernel that runs on these, say Y
+  here.
+
+IP27 N-Mode
+CONFIG_SGI_SN0_N_MODE
+  The nodes of Origin 200, Origin 2000 and Onyx 2 systems can be
+  configured in either N-Modes which allows for more nodes or M-Mode
+  which allows for more memory.  Your system is most probably
+  running in M-Mode, so you should say N here.
+
+Lasi Ethernet
+CONFIG_LASI_82596
+  Say Y here to support the on-board Intel 82596 ethernet controller
+  built into Hewlett-Packard PA-RISC machines.
+
+MIPS JAZZ onboard SONIC Ethernet support
+CONFIG_MIPS_JAZZ_SONIC
+  This is the driver for the onboard card of MIPS Magnum 4000,
+  Acer PICA, Olivetti M700-10 and a few other identical OEM systems.
+
+MIPS JAZZ FAS216 SCSI support
+CONFIG_JAZZ_ESP
+  This is the driver for the onboard SCSI host adapter of MIPS Magnum
+  4000, Acer PICA, Olivetti M700-10 and a few other identical OEM
+  systems.
+
+MIPS GT96100 Ethernet support
+CONFIG_MIPS_GT96100ETH
+  Say Y here to support the Ethernet subsystem on your GT96100 card.
+
+Zalon SCSI support
+CONFIG_SCSI_ZALON
+  The Zalon is an interface chip that sits between the PA-RISC
+  processor and the NCR 53c720 SCSI controller on K-series PA-RISC
+  boards (these are used, among other places, on some HP 780
+  workstations).  Say Y here to make sure it gets initialized
+  correctly before the Linux kernel tries to talk to the controller.
+
+SGI PROM Console Support
+CONFIG_SGI_PROM_CONSOLE
+  Say Y here to set up the boot console on serial port 0.
+
+DECstation serial support
+CONFIG_SERIAL_DEC
+  This selects whether you want to be asked about drivers for
+  DECstation serial ports.
+
+  Note that the answer to this question won't directly affect the
+  kernel: saying N will just cause the configurator to skip all
+  the questions about DECstation serial ports.
+
+  If unsure, say Y.
+
+Support for console on a DECstation serial port
+CONFIG_SERIAL_DEC_CONSOLE
+  If you say Y here, it will be possible to use a serial port as the
+  system console (the system console is the device which receives all
+  kernel messages and warnings and which allows logins in single user
+  mode).  Note that the firmware uses ttyS0 as the serial console on
+  the Maxine and ttyS2 on the others.
+
+  If unsure, say Y.
+
+DZ11 Serial Support
+CONFIG_DZ
+  DZ11-family serial controllers for VAXstations, including the
+  DC7085, M7814, and M7819.
+
+TURBOchannel support
+CONFIG_TC
+  TurboChannel is a DEC (now Compaq) bus for Alpha and MIPS processors.
+  Documentation on writing device drivers for TurboChannel is available at:
+  <http://www.cs.arizona.edu/computer.help/policy/DIGITAL_unix/AA-PS3HD-TET1_html/TITLE.html>.
+
+# Choice: galileo_clock
+75
+CONFIG_SYSCLK_75
+  Configure the kernel for clock speed of your Galileo board.  
+  The choices are 75MHz, 83.3MHz, and 100MHz.
+
+83.3
+CONFIG_SYSCLK_83
+  Configure the Galileo kernel for a clock speed of 83.3 MHz.
+
+100
+CONFIG_SYSCLK_100
+  Configure the Galileo kernel for a clock speed of 100 MHz.
+
+Z85C30 Serial Support
+CONFIG_ZS
+  Documentation on the Zilog 85C350 serial communications controller
+  is downloadable at <http://www.zilog.com/pdfs/serial/z85c30.pdf>.
+
+PCMCIA SCSI adapter support
+CONFIG_SCSI_PCMCIA
+  Say Y here if you intend to attach a PCMCIA or CardBus card to your
+  computer which acts as a SCSI host adapter. These are credit card
+  size devices often used with laptops.
+
+  Note that the answer to this question won't directly affect the
+  kernel: saying N will just cause the configurator to skip all
+  the questions PCMCIA SCSI host adapters.
+
+Adaptec APA1480 CardBus support
+CONFIG_PCMCIA_APA1480
+  Say Y here if you intend to attach this type of CardBus SCSI host
+  adapter to your computer.
+
+  This driver is also available as a module called apa1480_cb.o ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+NinjaSCSI-3 / NinjaSCSI-32Bi (16bit) PCMCIA support
+CONFIG_PCMCIA_NINJA_SCSI
+  If you intend to attach this type of PCMCIA SCSI host adapter to
+  your computer, say Y here and read
+  <file:Documentation/README.nsp_cs.eng>.
+
+  This driver is also available as a module called nsp_cs.o ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Adaptec AHA152X PCMCIA support
+CONFIG_PCMCIA_AHA152X
+  Say Y here if you intend to attach this type of PCMCIA SCSI host
+  adapter to your computer.
+
+  This driver is also available as a module called aha152x_cs.o ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Qlogic PCMCIA support
+CONFIG_PCMCIA_QLOGIC
+  Say Y here if you intend to attach this type of PCMCIA SCSI host
+  adapter to your computer.
+
+  This driver is also available as a module called qlogic_cs.o ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Future Domain PCMCIA support
+CONFIG_PCMCIA_FDOMAIN
+  Say Y here if you intend to attach this type of PCMCIA SCSI host
+  adapter to your computer.
+
+  This driver is also available as a module called fdomain_cs.o ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+# Choice: mipstype
+CPU type
+CONFIG_CPU_R3000
+  Please make sure to pick the right CPU type. Linux/MIPS is not
+  designed to be generic, i.e. Kernels compiled for R3000 CPUs will
+  *not* work on R4000 machines and vice versa.  However, since most
+  of the supported machines have an R4000 (or similar) CPU, R4x00
+  might be a safe bet.  If the resulting kernel does not work,
+  try to recompile with R3000.
+
+  R3000    MIPS Technologies R3000-series processors,
+           including the 3041, 3051, and 3081.
+
+  R6000    MIPS Technologies R6000-series processors,
+           including the 64474, 64475, 64574 and 64575.
+
+  R4300    MIPS Technologies R4300-series processors.
+
+  R4x00    MIPS Technologies R4000-series processors other than 4300,
+           including the 4640, 4650, and 4700.
+
+  R5000    MIPS Technologies R5000-series processors other than the
+           Nevada.
+
+  R52xx    MIPS Technologies R52xx-series ("Nevada") processors.
+
+  R10000   MIPS Technologies R10000-series processors.
+
+  SB1      Broadcom SiByte SB1 processor.
+
+R6000
+CONFIG_CPU_R6000
+  MIPS Technologies R6000-series processors, including the 64474,
+  64475, 64574 and 64575.
+
+R4300
+CONFIG_CPU_R4300
+  MIPS Technologies R4300-series processors.
+
+R4x00
+CONFIG_CPU_R4X00
+  MIPS Technologies R4000-series processors other than 4300, including
+  the 4640, 4650, and 4700.
+
+R5000
+CONFIG_CPU_R5000
+  MIPS Technologies R5000-series processors other than the Nevada.
+
+R52x0
+CONFIG_CPU_NEVADA
+  MIPS Technologies R52x0-series ("Nevada") processors.
+
+R8000
+CONFIG_CPU_R8000
+  MIPS Technologies R8000-series processors.
+
+R10000
+CONFIG_CPU_R10000
+  MIPS Technologies R10000-series processors.
+
+SB1
+CONFIG_CPU_SB1
+  Broadcom SiByte SB1 processor.
+
+Discontiguous Memory Support
+CONFIG_DISCONTIGMEM
+  Say Y to support efficient handling of discontiguous physical memory,
+  for architectures which are either NUMA (Non-Uniform Memory Access)
+  or have huge holes in the physical address space for other reasons.
+  See <file:Documentation/vm/numa> for more.
+
+Mapped kernel support
+CONFIG_MAPPED_KERNEL
+  Change the way a Linux kernel is loaded unto memory on a MIPS64
+  machine.  This is required in order to support text replication and
+  NUMA.  If you need to understand it, read the source code.
+
+Kernel text replication support
+CONFIG_REPLICATE_KTEXT
+  Say Y here to enable replicating the kernel text across multiple
+  nodes in a NUMA cluster.  This trades memory for speed.
+
+Exception handler replication support
+CONFIG_REPLICATE_EXHANDLERS
+  Say Y here to enable replicating the kernel exception handlers
+  across multiple nodes in a NUMA cluster. This trades memory for
+  speed.
+
+NUMA support?
+CONFIG_NUMA
+  Say Y to compile the kernel to support NUMA (Non-Uniform Memory
+  Access).  This option is for configuring high-end multiprocessor
+  server machines.  If in doubt, say N.
+
+R41xx
+CONFIG_CPU_VR41XX
+  The options selects support for the NEC VR41xx series of processors.
+  Only choose this option if you have one of these processors as a
+  kernel built with this option will not run on any other type of
+  processor or vice versa.
+
+CPU feature configuration
+CONFIG_CPU_ADVANCED
+  Saying yes here allows you to select support for various features
+  your CPU may or may not have.  Most people should say N here.
+
+ll and sc instructions available
+CONFIG_CPU_HAS_LLSC
+  MIPS R4000 series and later provide the Load Linked (ll)
+  and Store Conditional (sc) instructions. More information is
+  available at <http://www.go-ecs.com/mips/miptek1.htm>.
+
+  Say Y here if your CPU has the ll and sc instructions.  Say Y here
+  for better performance, N if you don't know.  You must say Y here
+  for multiprocessor machines.
+
+lld and scd instructions available
+CONFIG_CPU_HAS_LLDSCD
+  Say Y here if your CPU has the lld and scd instructions, the 64-bit
+  equivalents of ll and sc.  Say Y here for better performance, N if
+  you don't know.  You must say Y here for multiprocessor machines.
+
+Writeback Buffer available
+CONFIG_CPU_HAS_WB
+  Say N here for slightly better performance.  You must say Y here for
+  machines which require flushing of write buffers in software.  Saying
+  Y is the safe option; N may result in kernel malfunction and crashes.
+
+Support for large 64-bit configurations
+CONFIG_MIPS_INSANE_LARGE
+  MIPS R10000 does support a 44 bit / 16TB address space as opposed to
+  previous 64-bit processors which only supported 40 bit / 1TB. If you
+  need processes of more than 1TB virtual address space, say Y here.
+  This will result in additional memory usage, so it is not
+  recommended for normal users.
+
+Generate little endian code
+CONFIG_CPU_LITTLE_ENDIAN
+  Some MIPS machines can be configured for either little or big endian
+  byte order. These modes require different kernels. Say Y if your
+  machine is little endian, N if it's a big endian machine.
+
+Use power LED as a heartbeat
+CONFIG_HEARTBEAT
+  Use the power-on LED on your machine as a load meter.  The exact
+  behaviour is platform-dependent, but normally the flash frequency is
+  a hyperbolic function of the 5-minute load average.
+
+Networking support
+CONFIG_NET
+  Unless you really know what you are doing, you should say Y here.
+  The reason is that some programs need kernel networking support even
+  when running on a stand-alone machine that isn't connected to any
+  other computer. If you are upgrading from an older kernel, you
+  should consider updating your networking tools too because changes
+  in the kernel and the tools often go hand in hand. The tools are
+  contained in the package net-tools, the location and version number
+  of which are given in <file:Documentation/Changes>.
+
+  For a general introduction to Linux networking, it is highly
+  recommended to read the NET-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+Socket filtering
+CONFIG_FILTER
+  The Linux Socket Filter is derived from the Berkeley Packet Filter.
+  If you say Y here, user-space programs can attach a filter to any
+  socket and thereby tell the kernel that it should allow or disallow
+  certain types of data to get through the socket.  Linux Socket
+  Filtering works on all socket types except TCP for now.  See the
+  text file <file:Documentation/networking/filter.txt> for more
+  information.
+
+  You need to say Y here if you want to use PPP packet filtering
+  (see the CONFIG_PPP_FILTER option below).
+
+  If unsure, say N.
+
+Network packet filtering (replaces ipchains)
+CONFIG_NETFILTER
+  Netfilter is a framework for filtering and mangling network packets
+  that pass through your Linux box.
+
+  The most common use of packet filtering is to run your Linux box as
+  a firewall protecting a local network from the Internet. The type of
+  firewall provided by this kernel support is called a "packet
+  filter", which means that it can reject individual network packets
+  based on type, source, destination etc. The other kind of firewall,
+  a "proxy-based" one, is more secure but more intrusive and more
+  bothersome to set up; it inspects the network traffic much more
+  closely, modifies it and has knowledge about the higher level
+  protocols, which a packet filter lacks. Moreover, proxy-based
+  firewalls often require changes to the programs running on the local
+  clients. Proxy-based firewalls don't need support by the kernel, but
+  they are often combined with a packet filter, which only works if
+  you say Y here.
+
+  You should also say Y here if you intend to use your Linux box as
+  the gateway to the Internet for a local network of machines without
+  globally valid IP addresses. This is called "masquerading": if one
+  of the computers on your local network wants to send something to
+  the outside, your box can "masquerade" as that computer, i.e. it
+  forwards the traffic to the intended outside destination, but
+  modifies the packets to make it look like they came from the
+  firewall box itself. It works both ways: if the outside host
+  replies, the Linux box will silently forward the traffic to the
+  correct local computer. This way, the computers on your local net
+  are completely invisible to the outside world, even though they can
+  reach the outside and can receive replies. It is even possible to
+  run globally visible servers from within a masqueraded local network
+  using a mechanism called portforwarding. Masquerading is also often
+  called NAT (Network Address Translation).
+
+  Another use of Netfilter is in transparent proxying: if a machine on
+  the local network tries to connect to an outside host, your Linux
+  box can transparently forward the traffic to a local server,
+  typically a caching proxy server.
+
+  Various modules exist for netfilter which replace the previous
+  masquerading (ipmasqadm), packet filtering (ipchains), transparent
+  proxying, and portforwarding mechanisms. Please see
+  <file:Documentation/Changes> under "iptables" for the location of
+  these packages.
+
+  Make sure to say N to "Fast switching" below if you intend to say Y
+  here, as Fast switching currently bypasses netfilter.
+
+  Chances are that you should say Y here if you compile a kernel which
+  will run as a router and N for regular hosts. If unsure, say N.
+
+Network packet filtering debugging
+CONFIG_NETFILTER_DEBUG
+  You can say Y here if you want to get additional messages useful in
+  debugging the netfilter code.
+
+Connection tracking (required for masq/NAT)
+CONFIG_IP_NF_CONNTRACK
+  Connection tracking keeps a record of what packets have passed
+  through your machine, in order to figure out how they are related
+  into connections.
+
+  This is required to do Masquerading or other kinds of Network
+  Address Translation (except for Fast NAT).  It can also be used to
+  enhance packet filtering (see `Connection state match support'
+  below).
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+Amanda protocol support
+CONFIG_IP_NF_AMANDA
+  If you are running the Amanda backup package (http://www.amanda.org/)
+  on this machine or machines that will be MASQUERADED through this
+  machine, then you may want to enable this feature.  This allows the
+  connection tracking and natting code to allow the sub-channels that
+  Amanda requires for communication of the backup data, messages and
+  index.
+
+  If you want to compile it as a module, say M here and read
+  Documentation/modules.txt.  If unsure, say `N'.
+
+
+IRC Send/Chat protocol support
+CONFIG_IP_NF_IRC
+  There is a commonly-used extension to IRC called
+  Direct Client-to-Client Protocol (DCC).  This enables users to send
+  files to each other, and also chat to each other without the need
+  of a server.  DCC Sending is used anywhere you send files over IRC,
+  and DCC Chat is most commonly used by Eggdrop bots.  If you are
+  using NAT, this extension will enable you to send files and initiate
+  chats.  Note that you do NOT need this extension to get files or
+  have others initiate chats, or everything else in IRC.
+
+  If you want to compile it as a module, say 'M' here and read
+  Documentation/modules.txt.  If unsure, say 'N'.
+
+TFTP protocol support
+CONFIG_IP_NF_TFTP
+  TFTP connection tracking helper, this is required depending
+  on how restrictive your ruleset is.
+  If you are using a tftp client behind -j SNAT or -j MASQUERADING
+  you will need this.
+
+  If you want to compile it as a module, say M here and read
+  Documentation/modules.txt.  If unsure, say `Y'.
+
+FTP protocol support
+CONFIG_IP_NF_FTP
+  Tracking FTP connections is problematic: special helpers are
+  required for tracking them, and doing masquerading and other forms
+  of Network Address Translation on them.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `Y'.
+
+User space queueing via NETLINK
+CONFIG_IP_NF_QUEUE
+  Netfilter has the ability to queue packets to user space: the
+  netlink device can be used to access them using this driver.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+IP tables support (required for filtering/masq/NAT)
+CONFIG_IP_NF_IPTABLES
+  iptables is a general, extensible packet identification framework.
+  The packet filtering and full NAT (masquerading, port forwarding,
+  etc) subsystems now use this: say `Y' or `M' here if you want to use
+  either of those.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+recent match support
+CONFIG_IP_NF_MATCH_RECENT
+  This match is used for creating one or many lists of recently
+  used addresses and then matching against that/those list(s).
+
+  Short options are available by using 'iptables -m recent -h'
+  Official Website: <http://snowman.net/projects/ipt_recent/>
+
+  If you want to compile it as a module, say M here and read
+  Documentation/modules.txt.  If unsure, say `N'.
+
+limit match support
+CONFIG_IP_NF_MATCH_LIMIT
+  limit matching allows you to control the rate at which a rule can be
+  matched: mainly useful in combination with the LOG target ("LOG
+  target support", below) and to avoid some Denial of Service attacks.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+skb->pkt_type packet match support
+CONFIG_IP_NF_MATCH_PKTTYPE
+  This patch allows you to match packet in accrodance
+  to its "class", eg. BROADCAST, MULTICAST, ...
+  
+  Typical usage:
+  iptables -A INPUT -m pkttype --pkt-type broadcast -j LOG
+  
+  If you want to compile it as a module, say M here and read
+  Documentation/modules.txt.  If unsure, say `N'.
+
+MAC address match support
+CONFIG_IP_NF_MATCH_MAC
+  MAC matching allows you to match packets based on the source
+  Ethernet address of the packet.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+Netfilter MARK match support
+CONFIG_IP_NF_MATCH_MARK
+  Netfilter mark matching allows you to match packets based on the
+  `nfmark' value in the packet.  This can be set by the MARK target
+  (see below).
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+Multiple port match support
+CONFIG_IP_NF_MATCH_MULTIPORT
+  Multiport matching allows you to match TCP or UDP packets based on
+  a series of source or destination ports: normally a rule can only
+  match a single range of ports.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+TTL match support
+CONFIG_IP_NF_MATCH_TTL
+  This adds CONFIG_IP_NF_MATCH_TTL option, which enabled the user
+  to match packets by their TTL value.
+
+  If you want to compile it as a module, say M here and read
+  Documentation/modules.txt.  If unsure, say `N'.
+
+LENGTH match support
+CONFIG_IP_NF_MATCH_LENGTH
+  This option allows you to match the length of a packet against a
+  specific value or range of values.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+AH/ESP match support
+CONFIG_IP_NF_MATCH_AH_ESP
+  These two match extensions (`ah' and `esp') allow you to match a
+  range of SPIs inside AH or ESP headers of IPSec packets.
+
+  If you want to compile it as a module, say M here and read
+  Documentation/modules.txt.  If unsure, say `N'.
+
+DSCP match support
+CONFIG_IP_NF_MATCH_DSCP
+  This option adds a `DSCP' match, which allows you to match against
+  the IPv4 header DSCP field (DSCP codepoint).
+
+  The DSCP codepoint can have any value between 0x0 and 0x4f.
+
+  If you want to compile it as a module, say M here and read
+  Documentation/modules.txt.  If unsure, say `N'.
+
+
+ECN match support
+CONFIG_IP_NF_MATCH_ECN
+  This option adds a `ECN' match, which allows you to match against
+  the IPv4 and TCP header ECN fields.
+
+  If you want to compile it as a module, say M here and read
+  Documentation/modules.txt.  If unsure, say `N'.
+
+
+TOS match support
+CONFIG_IP_NF_MATCH_TOS
+  TOS matching allows you to match packets based on the Type Of
+  Service fields of the IP packet.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+conntrack match support
+CONFIG_IP_NF_MATCH_CONNTRACK
+  This is a general conntrack match module, a superset of the state match.
+
+  It allows matching on additional conntrack information, which is
+  useful in complex configurations, such as NAT gateways with multiple
+  internet links or tunnels.
+
+  If you want to compile it as a module, say M here and read
+  Documentation/modules.txt.  If unsure, say `N'.
+
+
+Connection state match support
+CONFIG_IP_NF_MATCH_STATE
+  Connection state matching allows you to match packets based on their
+  relationship to a tracked connection (ie. previous packets).  This
+  is a powerful tool for packet classification.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+Unclean match support
+CONFIG_IP_NF_MATCH_UNCLEAN
+  Unclean packet matching matches any strange or invalid packets, by
+  looking at a series of fields in the IP, TCP, UDP and ICMP headers.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+Owner match support
+CONFIG_IP_NF_MATCH_OWNER
+  Packet owner matching allows you to match locally-generated packets
+  based on who created them: the user, group, process or session.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+Packet filtering
+CONFIG_IP_NF_FILTER
+  Packet filtering defines a table `filter', which has a series of
+  rules for simple packet filtering at local input, forwarding and
+  local output.  See the man page for iptables(8).
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+REJECT target support
+CONFIG_IP_NF_TARGET_REJECT
+  The REJECT target allows a filtering rule to specify that an ICMP
+  error should be issued in response to an incoming packet, rather
+  than silently being dropped.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+MIRROR target support
+CONFIG_IP_NF_TARGET_MIRROR
+  The MIRROR target allows a filtering rule to specify that an
+  incoming packet should be bounced back to the sender.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+Local NAT support
+CONFIG_IP_NF_NAT_LOCAL
+  This option enables support for NAT of locally originated connections. 
+  Enable this if you need to use destination NAT on connections
+  originating from local processes on the nat box itself.
+
+  Please note that you will need a recent version (>= 1.2.6a)
+  of the iptables userspace program in order to use this feature.
+  See <http://www.iptables.org/> for download instructions.
+
+  If unsure, say 'N'.
+
+
+Full NAT (Network Address Translation)
+CONFIG_IP_NF_NAT
+  The Full NAT option allows masquerading, port forwarding and other
+  forms of full Network Address Port Translation.  It is controlled by
+  the `nat' table in iptables: see the man page for iptables(8).
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+MASQUERADE target support
+CONFIG_IP_NF_TARGET_MASQUERADE
+  Masquerading is a special case of NAT: all outgoing connections are
+  changed to seem to come from a particular interface's address, and
+  if the interface goes down, those connections are lost.  This is
+  only useful for dialup accounts with dynamic IP address (ie. your IP
+  address will be different on next dialup).
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+Basic SNMP-ALG support
+CONFIG_IP_NF_NAT_SNMP_BASIC
+
+  This module implements an Application Layer Gateway (ALG) for
+  SNMP payloads.  In conjunction with NAT, it allows a network
+  management system to access multiple private networks with
+  conflicting addresses.  It works by modifying IP addresses
+  inside SNMP payloads to match IP-layer NAT mapping.
+
+  This is the "basic" form of SNMP-ALG, as described in RFC 2962
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+REDIRECT target support
+CONFIG_IP_NF_TARGET_REDIRECT
+  REDIRECT is a special case of NAT: all incoming connections are
+  mapped onto the incoming interface's address, causing the packets to
+  come to the local machine instead of passing through.  This is
+  useful for transparent proxies.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+Packet mangling
+CONFIG_IP_NF_MANGLE
+  This option adds a `mangle' table to iptables: see the man page for
+  iptables(8).  This table is used for various packet alterations
+  which can effect how the packet is routed.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+DSCP target support
+CONFIG_IP_NF_TARGET_DSCP
+  This option adds a `DSCP' target, which allows you to create rules in
+  the iptables mangle table. The selected packet has the DSCP field set
+  to the hex value provided on the command line; unlike the TOS target
+  which will only set the legal values within ip.h.
+
+  The DSCP field can be set to any value between 0x0 and 0x4f. It does
+  take into account that bits 6 and 7 are used by ECN.
+
+  If you want to compile it as a module, say M here and read
+  Documentation/modules.txt.  If unsure, say `N'.
+
+
+ECN target support
+CONFIG_IP_NF_TARGET_ECN
+  This option adds a `ECN' target, which can be used in the iptables mangle
+  table.  
+
+  You can use this target to remove the ECN bits from the IPv4 header of
+  an IP packet.  This is particularly useful, if you need to work around
+  existing ECN blackholes on the internet, but don't want to disable
+  ECN support in general.
+
+  If you want to compile it as a module, say M here and read
+  Documentation/modules.txt.  If unsure, say `N'.
+
+
+TOS target support
+CONFIG_IP_NF_TARGET_TOS
+  This option adds a `TOS' target, which allows you to create rules in
+  the `mangle' table which alter the Type Of Service field of an IP
+  packet prior to routing.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+MARK target support
+CONFIG_IP_NF_TARGET_MARK
+  This option adds a `MARK' target, which allows you to create rules
+  in the `mangle' table which alter the netfilter mark (nfmark) field
+  associated with the packet prior to routing. This can change
+  the routing method (see `Use netfilter MARK value as routing
+  key') and can also be used by other subsystems to change their
+  behaviour.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+TCPMSS target support
+CONFIG_IP_NF_TARGET_TCPMSS
+  This option adds a `TCPMSS' target, which allows you to alter the
+  MSS value of TCP SYN packets, to control the maximum size for that
+  connection (usually limiting it to your outgoing interface's MTU
+  minus 40).
+
+  This is used to overcome criminally braindead ISPs or servers which
+  block ICMP Fragmentation Needed packets.  The symptoms of this
+  problem are that everything works fine from your Linux
+  firewall/router, but machines behind it can never exchange large
+  packets:
+       1) Web browsers connect, then hang with no data received.
+       2) Small mail works fine, but large emails hang.
+       3) ssh works fine, but scp hangs after initial handshaking.
+
+  Workaround: activate this option and add a rule to your firewall
+  configuration like:
+
+        iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
+                -j TCPMSS --clamp-mss-to-pmtu
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+Helper match support
+CONFIG_IP_NF_MATCH_HELPER
+  Helper matching allows you to match packets in dynamic connections
+  tracked by a conntrack-helper, ie. ip_conntrack_ftp
+
+  If you want to compile it as a module, say M here and read
+  Documentation/modules.txt.  If unsure, say `Y'.
+
+TCPMSS match support
+CONFIG_IP_NF_MATCH_TCPMSS
+  This option adds a `tcpmss' match, which allows you to examine the
+  MSS value of TCP SYN packets, which control the maximum packet size
+  for that connection.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+ULOG target support
+CONFIG_IP_NF_TARGET_ULOG
+  This option adds a `ULOG' target, which allows you to create rules in
+  any iptables table. The packet is passed to a userspace logging
+  daemon using netlink multicast sockets; unlike the LOG target
+  which can only be viewed through syslog.
+
+  The appropriate userspace logging daemon (ulogd) may be obtained from
+  <http://www.gnumonks.org/projects/ulogd>
+
+  If you want to compile it as a module, say M here and read
+  Documentation/modules.txt.  If unsure, say `N'.
+
+LOG target support
+CONFIG_IP_NF_TARGET_LOG
+  This option adds a `LOG' target, which allows you to create rules in
+  any iptables table which records the packet header to the syslog.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+ipchains (2.2-style) support
+CONFIG_IP_NF_COMPAT_IPCHAINS
+  This option places ipchains (with masquerading and redirection
+  support) back into the kernel, using the new netfilter
+  infrastructure.  It is not recommended for new installations (see
+  `Packet filtering').  With this enabled, you should be able to use
+  the ipchains tool exactly as in 2.2 kernels.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+ipfwadm (2.0-style) support
+CONFIG_IP_NF_COMPAT_IPFWADM
+  This option places ipfwadm (with masquerading and redirection
+  support) back into the kernel, using the new netfilter
+  infrastructure.  It is not recommended for new installations (see
+  `Packet filtering').  With this enabled, you should be able to use
+  the ipfwadm tool exactly as in 2.0 kernels.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+EUI64 address check (EXPERIMENTAL)
+CONFIG_IP6_NF_MATCH_EUI64
+  This module performs checking on the IPv6 source address
+  Compares the last 64 bits with the EUI64 (delivered
+  from the MAC address) address
+
+  If you want to compile it as a module, say M here and read
+  Documentation/modules.txt.  If unsure, say `N'.
+
+MAC address match support
+CONFIG_IP6_NF_MATCH_MAC
+  mac matching allows you to match packets based on the source
+  Ethernet address of the packet.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+length match support
+CONFIG_IP6_NF_MATCH_LENGTH
+  This option allows you to match the length of a packet against a
+  specific value or range of values.
+
+  If you want to compile it as a module, say M here and read
+  Documentation/modules.txt.  If unsure, say `N'.
+
+Netfilter MARK match support
+CONFIG_IP6_NF_MATCH_MARK
+  Netfilter mark matching allows you to match packets based on the
+  `nfmark' value in the packet.  This can be set by the MARK target
+  (see below).
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+Multiple port match support
+CONFIG_IP6_NF_MATCH_MULTIPORT
+  Multiport matching allows you to match TCP or UDP packets based on
+  a series of source or destination ports: normally a rule can only
+  match a single range of ports.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+IPV6 queue handler (EXPERIMENTAL)
+CONFIG_IP6_NF_QUEUE
+
+  This option adds a queue handler to the kernel for IPv6
+  packets which lets us to receive the filtered packets
+  with QUEUE target using libiptc as we can do with
+  the IPv4 now.
+
+  (C) Fernando Anton 2001
+  IPv64 Project - Work based in IPv64 draft by Arturo Azcorra.
+  Universidad Carlos III de Madrid
+  Universidad Politecnica de Alcala de Henares
+  email: fanton@it.uc3m.es
+
+  If you want to compile it as a module, say M here and read
+  Documentation/modules.txt. If unsure, say `N'.
+
+Owner match support
+CONFIG_IP6_NF_MATCH_OWNER
+  Packet owner matching allows you to match locally-generated packets
+  based on who created them: the user, group, process or session.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+Packet filtering
+CONFIG_IP6_NF_FILTER
+  Packet filtering defines a table `filter', which has a series of
+  rules for simple packet filtering at local input, forwarding and
+  local output.  See the man page for iptables(8).
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+Packet mangling
+CONFIG_IP6_NF_MANGLE
+  This option adds a `mangle' table to iptables: see the man page for
+  iptables(8).  This table is used for various packet alterations
+  which can effect how the packet is routed.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+MARK target support
+CONFIG_IP6_NF_TARGET_MARK
+  This option adds a `MARK' target, which allows you to create rules
+  in the `mangle' table which alter the netfilter mark (nfmark) field
+  associated with the packet packet prior to routing. This can change
+  the routing method (see `Use netfilter MARK value as routing
+  key') and can also be used by other subsystems to change their
+  behaviour.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+ARP payload mangling
+CONFIG_IP_NF_ARP_MANGLE
+  Allows altering the ARP packet payload: source and destination
+  hardware and network addresses.
+
+TCP Explicit Congestion Notification support
+CONFIG_INET_ECN
+  Explicit Congestion Notification (ECN) allows routers to notify
+  clients about network congestion, resulting in fewer dropped packets
+  and increased network performance.  This option adds ECN support to
+  the Linux kernel, as well as a sysctl (/proc/sys/net/ipv4/tcp_ecn)
+  which allows ECN support to be disabled at runtime.
+
+  Note that, on the Internet, there are many broken firewalls which
+  refuse connections from ECN-enabled machines, and it may be a while
+  before these firewalls are fixed.  Until then, to access a site
+  behind such a firewall (some of which are major sites, at the time
+  of this writing) you will have to disable this option, either by
+  saying N now or by using the sysctl.
+
+  If in doubt, say N.
+
+IPv6 tables support (required for filtering/masq/NAT)
+CONFIG_IP6_NF_IPTABLES
+  ip6tables is a general, extensible packet identification framework.
+  Currently only the packet filtering and packet mangling subsystem
+  for IPv6 use this, but connection tracking is going to follow.
+  Say 'Y' or 'M' here if you want to use either of those.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+IPv6 limit match support
+CONFIG_IP6_NF_MATCH_LIMIT
+  limit matching allows you to control the rate at which a rule can be
+  matched: mainly useful in combination with the LOG target ("LOG
+  target support", below) and to avoid some Denial of Service attacks.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+LOG target support
+CONFIG_IP6_NF_TARGET_LOG
+  This option adds a `LOG' target, which allows you to create rules in
+  any iptables table which records the packet header to the syslog.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  If unsure, say `N'.
+
+SYN flood protection
+CONFIG_SYN_COOKIES
+  Normal TCP/IP networking is open to an attack known as "SYN
+  flooding". This denial-of-service attack prevents legitimate remote
+  users from being able to connect to your computer during an ongoing
+  attack and requires very little work from the attacker, who can
+  operate from anywhere on the Internet.
+
+  SYN cookies provide protection against this type of attack. If you
+  say Y here, the TCP/IP stack will use a cryptographic challenge
+  protocol known as "SYN cookies" to enable legitimate users to
+  continue to connect, even when your machine is under attack. There
+  is no need for the legitimate users to change their TCP/IP software;
+  SYN cookies work transparently to them. For technical information
+  about SYN cookies, check out <http://cr.yp.to/syncookies.html>.
+
+  If you are SYN flooded, the source address reported by the kernel is
+  likely to have been forged by the attacker; it is only reported as
+  an aid in tracing the packets to their actual source and should not
+  be taken as absolute truth.
+
+  SYN cookies may prevent correct error reporting on clients when the
+  server is really overloaded. If this happens frequently better turn
+  them off.
+
+  If you say Y here, note that SYN cookies aren't enabled by default;
+  you can enable them by saying Y to "/proc file system support" and
+  "Sysctl support" below and executing the command
+
+    echo 1 >/proc/sys/net/ipv4/tcp_syncookies
+
+  at boot time after the /proc file system has been mounted.
+
+  If unsure, say N.
+
+# Choice: alphatype
+Alpha system type
+CONFIG_ALPHA_GENERIC
+  This is the system type of your hardware.  A "generic" kernel will
+  run on any supported Alpha system. However, if you configure a
+  kernel for your specific system, it will be faster and smaller.
+
+  To find out what type of Alpha system you have, you may want to
+  check out the Linux/Alpha FAQ, accessible on the WWW from
+  <http://www.alphalinux.org/>. In summary:
+
+  Alcor/Alpha-XLT     AS 600
+  Alpha-XL            XL-233, XL-266
+  AlphaBook1          Alpha laptop
+  Avanti              AS 200, AS 205, AS 250, AS 255, AS 300, AS 400
+  Cabriolet           AlphaPC64, AlphaPCI64
+  DP264               DP264
+  EB164               EB164 21164 evaluation board
+  EB64+               EB64+ 21064 evaluation board
+  EB66                EB66 21066 evaluation board
+  EB66+               EB66+ 21066 evaluation board
+  Jensen              DECpc 150, DEC 2000 model 300,
+                      DEC 2000 model 500
+  LX164               AlphaPC164-LX
+  Miata               Personal Workstation 433a, 433au, 500a,
+                      500au, 600a, or 600au
+  Mikasa              AS 1000
+  Noname              AXPpci33, UDB (Multia)
+  Noritake            AS 1000A, AS 600A, AS 800
+  PC164               AlphaPC164
+  Rawhide             AS 1200, AS 4000, AS 4100
+  Ruffian             RPX164-2, AlphaPC164-UX, AlphaPC164-BX
+  SX164               AlphaPC164-SX
+  Sable               AS 2000, AS 2100
+  Shark                      DS 20L
+  Takara              Takara
+  Titan               Privateer
+  Wildfire            AlphaServer GS 40/80/160/320
+
+  If you don't know what to do, choose "generic".
+
+# Most of the information on these variants is from
+# <http://www.alphalinux.org/docs/alpha-howto.html>
+Alcor/Alpha-XLT
+CONFIG_ALPHA_ALCOR
+  For systems using the Digital ALCOR chipset: 5 chips (4, 64-bit data
+  slices (Data Switch, DSW) - 208-pin PQFP and 1 control (Control, I/O
+  Address, CIA) - a 383 pin plastic PGA).  It provides a DRAM
+  controller (256-bit memory bus) and a PCI interface.  It also does
+  all the work required to support an external Bcache and to maintain
+  memory coherence when a PCI device DMAs into (or out of) memory.
+
+Alpha-XL
+CONFIG_ALPHA_XL
+  XL-233 and XL-266-based Alpha systems.
+
+AlphaBook1
+CONFIG_ALPHA_BOOK1
+  Dec AlphaBook1/Burns Alpha-based laptops.
+
+Avanti
+CONFIG_ALPHA_AVANTI
+  Avanti AS 200, AS 205, AS 250, AS 255, AS 300, and AS 400-based
+  Alphas. Info at
+  <http://www.unix-ag.org/Linux-Alpha/Architectures/Avanti.html>.
+
+Cabriolet
+CONFIG_ALPHA_CABRIOLET
+  Cabriolet AlphaPC64, AlphaPCI64 systems.  Derived from EB64+ but now
+  baby-AT with Flash boot ROM, no on-board SCSI or Ethernet. 3 ISA
+  slots, 4 PCI slots (one pair are on a shared slot), uses plug-in
+  Bcache SIMMs.  Requires power supply with 3.3V output.
+
+DP264
+CONFIG_ALPHA_DP264
+  Various 21264 systems with the tsunami core logic chipset.
+  API Networks: 264DP, UP2000(+), CS20;
+  Compaq: DS10(E,L), XP900, XP1000, DS20(E), ES40.
+
+EB164
+CONFIG_ALPHA_EB164
+  EB164 21164 evaluation board from DEC.  Uses 21164 and ALCOR.  Has
+  ISA and PCI expansion (3 ISA slots, 2 64-bit PCI slots (one is
+  shared with an ISA slot) and 2 32-bit PCI slots.  Uses plus-in
+  Bcache SIMMs. I/O sub-system provides SuperI/O (2S, 1P, FD), KBD,
+  MOUSE (PS2 style), RTC/NVRAM.  Boot ROM is Flash.  PC-AT-sized
+  motherboard.  Requires power supply with 3.3V output.
+
+EB64+
+CONFIG_ALPHA_EB64P
+  Uses 21064 or 21064A and APECs.  Has ISA and PCI expansion (3 ISA,
+  2 PCI, one pair are on a shared slot). Supports 36-bit DRAM SIMs.
+  ISA bus generated by Intel SaturnI/O PCI-ISA bridge. On-board SCSI
+  (NCR 810 on PCI) Ethernet (Digital 21040), KBD, MOUSE (PS2 style),
+  SuperI/O (2S, 1P, FD), RTC/NVRAM. Boot ROM is EPROM.  PC-AT size.
+  Runs from standard PC power supply.
+
+EB66
+CONFIG_ALPHA_EB66
+  A Digital DS group board.  Uses 21066 or 21066A.  I/O sub-system is
+  identical to EB64+.  Baby PC-AT size.  Runs from standard PC power
+  supply.  The EB66 schematic was published as a marketing poster
+  advertising the 21066 as "the first microprocessor in the world with
+  embedded PCI".
+
+EB66+
+CONFIG_ALPHA_EB66P
+  Later variant of the EB66 board.
+
+Eiger
+CONFIG_ALPHA_EIGER
+  Apparently an obscure OEM single-board computer based on the
+  Typhoon/Tsunami chipset family. Information on it is scanty.
+
+Jensen
+CONFIG_ALPHA_JENSEN
+  DEC PC 150 AXP (aka Jensen): This is a very old Digital system - one
+  of the first-generation Alpha systems. A number of these systems
+  seem to be available on the second- hand market. The Jensen is a
+  floor-standing tower system which originally used a 150MHz 21064 It
+  used programmable logic to interface a 486 EISA I/O bridge to the
+  CPU.
+
+LX164
+CONFIG_ALPHA_LX164
+  A technical overview of this board is available at
+  <http://www.unix-ag.org/Linux-Alpha/Architectures/LX164.html>.
+
+Miata
+CONFIG_ALPHA_MIATA
+  The Digital PersonalWorkStation (PWS 433a, 433au, 500a, 500au, 600a,
+  or 600au).  There is an Installation HOWTO for this hardware at
+  <http://members.brabant.chello.nl/~s.vandereijk/miata.html>.
+
+Mikasa
+CONFIG_ALPHA_MIKASA
+  AlphaServer 1000-based Alpha systems.
+
+Nautilus
+CONFIG_ALPHA_NAUTILUS
+  Alpha systems based on the AMD 751 & ALI 1543C chipsets.
+
+Noname
+CONFIG_ALPHA_NONAME
+  The AXPpci33 (aka NoName), is based on the EB66 (includes the Multia
+  UDB).  This design was produced by Digital's Technical OEM (TOEM)
+  group. It uses the 21066 processor running at 166MHz or 233MHz. It
+  is a baby-AT size, and runs from a standard PC power supply. It has
+  5 ISA slots and 3 PCI slots (one pair are a shared slot). There are
+  2 versions, with either PS/2 or large DIN connectors for the
+  keyboard.
+
+Noritake
+CONFIG_ALPHA_NORITAKE
+  AlphaServer 1000A, AlphaServer 600A, and AlphaServer 800-based
+  systems.
+
+Rawhide
+CONFIG_ALPHA_RAWHIDE
+  AlphaServer 1200, AlphaServer 4000 and AlphaServer 4100 machines.
+  See HOWTO at
+  <http://www.alphalinux.org/docs/rawhide/4100_install.shtml>.
+
+Ruffian
+CONFIG_ALPHA_RUFFIAN
+  Samsung APC164UX.  There is a page on known problems and workarounds
+  at <http://www.alphalinux.org/faq/FAQ-11.html>.
+
+Sable
+CONFIG_ALPHA_SABLE
+  Digital AlphaServer 2000 and 2100-based systems.
+
+Takara
+CONFIG_ALPHA_TAKARA
+  Alpha 11164-based OEM single-board computer.
+
+Wildfire
+CONFIG_ALPHA_WILDFIRE
+  AlphaServer GS 40/80/160/320 SMP based on the EV67 core.
+
+EV5 CPU daughtercard (model 5/xxx)
+CONFIG_ALPHA_PRIMO
+  Say Y if you have an AS 1000 5/xxx or an AS 1000A 5/xxx.
+
+EV5 CPU(s) (model 5/xxx)
+CONFIG_ALPHA_GAMMA
+  Say Y if you have an AS 2000 5/xxx or an AS 2100 5/xxx.
+
+EV67 (or later) CPU (speed > 600MHz)?
+CONFIG_ALPHA_EV67
+  Is this a machine based on the EV67 core?  If in doubt, select N here
+  and the machine will be treated as an EV6.
+
+Use SRM as bootloader
+CONFIG_ALPHA_SRM
+  There are two different types of booting firmware on Alphas: SRM,
+  which is command line driven, and ARC, which uses menus and arrow
+  keys. Details about the Linux/Alpha booting process are contained in
+  the Linux/Alpha FAQ, accessible on the WWW from
+  <http://www.alphalinux.org/>.
+
+  The usual way to load Linux on an Alpha machine is to use MILO
+  (a bootloader that lets you pass command line parameters to the
+  kernel just like lilo does for the x86 architecture) which can be
+  loaded either from ARC or can be installed directly as a permanent
+  firmware replacement from floppy (which requires changing a certain
+  jumper on the motherboard). If you want to do either of these, say N
+  here. If MILO doesn't work on your system (true for Jensen
+  motherboards), you can bypass it altogether and boot Linux directly
+  from an SRM console; say Y here in order to do that. Note that you
+  won't be able to boot from an IDE disk using old versions of SRM.
+
+  If unsure, say N.
+
+Legacy kernel start address
+CONFIG_ALPHA_LEGACY_START_ADDRESS
+  The 2.4 kernel changed the kernel start address from 0x310000
+  to 0x810000 to make room for the Wildfire's larger SRM console.
+
+  If you're using aboot 0.7 or later, the bootloader will examine the
+  ELF headers to determine where to transfer control. Unfortunately,
+  most older bootloaders -- APB or MILO -- hardcoded the kernel start
+  address rather than examining the ELF headers, and the result is a
+  hard lockup.
+
+  Say Y if you have a broken bootloader.  Say N if you do not, or if
+  you wish to run on Wildfire.
+
+Large VMALLOC support
+CONFIG_ALPHA_LARGE_VMALLOC
+  Process creation and other aspects of virtual memory management can
+  be streamlined if we restrict the kernel to one PGD for all vmalloc
+  allocations.  This equates to about 8GB.
+
+  Under normal circumstances, this is so far and above what is needed
+  as to be laughable.  However, there are certain applications (such
+  as benchmark-grade in-kernel web serving) that can make use of as
+  much vmalloc space as is available.
+
+  Say N unless you know you need gobs and gobs of vmalloc space.
+
+Non-standard serial port support
+CONFIG_SERIAL_NONSTANDARD
+  Say Y here if you have any non-standard serial boards -- boards
+  which aren't supported using the standard "dumb" serial driver.
+  This includes intelligent serial boards such as Cyclades,
+  Digiboards, etc. These are usually used for systems that need many
+  serial ports because they serve many terminals or dial-in
+  connections.
+
+  Note that the answer to this question won't directly affect the
+  kernel: saying N will just cause the configurator to skip all
+  the questions about non-standard serial boards.
+
+  Most people can say N here.
+
+Extended dumb serial driver options
+CONFIG_SERIAL_EXTENDED
+  If you wish to use any non-standard features of the standard "dumb"
+  driver, say Y here. This includes HUB6 support, shared serial
+  interrupts, special multiport support, support for more than the
+  four COM 1/2/3/4 boards, etc.
+
+  Note that the answer to this question won't directly affect the
+  kernel: saying N will just cause the configurator to skip all
+  the questions about serial driver options. If unsure, say N.
+
+Support more than 4 serial ports
+CONFIG_SERIAL_MANY_PORTS
+  Say Y here if you have dumb serial boards other than the four
+  standard COM 1/2/3/4 ports. This may happen if you have an AST
+  FourPort, Accent Async, Boca (read the Boca mini-HOWTO, available
+  from <http://www.tldp.org/docs.html#howto>), or other custom
+  serial port hardware which acts similar to standard serial port
+  hardware. If you only use the standard COM 1/2/3/4 ports, you can
+  say N here to save some memory. You can also say Y if you have an
+  "intelligent" multiport card such as Cyclades, Digiboards, etc.
+
+Support for sharing serial interrupts
+CONFIG_SERIAL_SHARE_IRQ
+  Some serial boards have hardware support which allows multiple dumb
+  serial ports on the same board to share a single IRQ. To enable
+  support for this in the serial driver, say Y here.
+
+Auto-detect IRQ on standard ports (unsafe)
+CONFIG_SERIAL_DETECT_IRQ
+  Say Y here if you want the kernel to try to guess which IRQ
+  to use for your serial port.
+
+  This is considered unsafe; it is far better to configure the IRQ in
+  a boot script using the setserial command.
+
+  If unsure, say N.
+
+Support special multiport boards
+CONFIG_SERIAL_MULTIPORT
+  Some multiport serial ports have special ports which are used to
+  signal when there are any serial ports on the board which need
+  servicing. Say Y here to enable the serial driver to take advantage
+  of those special I/O ports.
+
+SGI IP22 Zilog85C30 serial support
+CONFIG_IP22_SERIAL
+  If you want to use your IP22's built-in serial ports under Linux,
+  answer Y.
+
+SGI Newport Console support
+CONFIG_SGI_NEWPORT_CONSOLE
+  Say Y here if you want the console on the Newport aka XL graphics
+  card of your Indy.  Most people say Y here.
+
+SGI DS1286 RTC support
+CONFIG_SGI_DS1286
+  If you say Y here and create a character special file /dev/rtc with
+  major number 10 and minor number 135 using mknod ("man mknod"), you
+  will get access to the real time clock built into your computer.
+  Every SGI has such a clock built in. It reports status information
+  via the file /proc/rtc and its behaviour is set by various ioctls on
+  /dev/rtc.
+
+Indy/I2 Hardware Watchdog
+CONFIG_INDYDOG
+  Hardwaredriver for the Indy's/I2's watchdog. This is a
+  watchdog timer that will reboot the machine after a 60 second 
+  timer expired and no process has written to /dev/watchdog during
+  that time.
+
+Support the Bell Technologies HUB6 card
+CONFIG_HUB6
+  Say Y here to enable support in the dumb serial driver to support
+  the HUB6 card.
+
+PCMCIA serial device support
+CONFIG_PCMCIA_SERIAL_CS
+  Say Y here to enable support for 16-bit PCMCIA serial devices,
+  including serial port cards, modems, and the modem functions of
+  multi-function Ethernet/modem cards. (PCMCIA- or PC-cards are
+  credit-card size devices often used with laptops.)
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called serial_cs.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+  If unsure, say N.
+
+CONFIG_SYNCLINK_CS
+  Enable support for the SyncLink PC Card serial adapter, running
+  asynchronous and HDLC communications up to 512Kbps. The port is
+  selectable for RS-232, V.35, RS-449, RS-530, and X.21
+
+  This driver may be built as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called synclinkmp.o.  If you want to do that, say M
+  here.
+
+ACP Modem (Mwave) support
+CONFIG_MWAVE
+  The ACP modem (Mwave) for Linux is a WinModem. It is composed of a
+  kernel driver and a user level application. Together these components
+  support direct attachment to public switched telephone networks (PSTNs)
+  and support selected world wide countries.
+
+  This version of the ACP Modem driver supports the IBM Thinkpad 600E,
+  600, and 770 that include on board ACP modem hardware.
+
+  The modem also supports the standard communications port interface
+  (ttySx) and is compatible with the Hayes AT Command Set.
+
+  The user level application needed to use this driver can be found at
+  the IBM Linux Technology Center (LTC) web site:
+  <http://www.ibm.com/linux/ltc/>.
+
+  If you own one of the above IBM Thinkpads which has the Mwave chipset
+  in it, say Y.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called mwave.o. If you want to compile it as
+  a module, say M here and read Documentation/modules.txt.
+
+/dev/agpgart (AGP Support)
+CONFIG_AGP
+  AGP (Accelerated Graphics Port) is a bus system mainly used to
+  connect graphics cards to the rest of the system.
+
+  If you have an AGP system and you say Y here, it will be possible to
+  use the AGP features of your 3D rendering video card. This code acts
+  as a sort of "AGP driver" for the motherboard's chipset.
+
+  If you need more texture memory than you can get with the AGP GART
+  (theoretically up to 256 MB, but in practice usually 64 or 128 MB
+  due to kernel allocation issues), you could use PCI accesses
+  and have up to a couple gigs of texture space.
+
+  Note that this is the only means to have XFree4/GLX use
+  write-combining with MTRR support on the AGP bus. Without it, OpenGL
+  direct rendering will be a lot slower but still faster than PIO.
+
+  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
+  use GLX or DRI.  If unsure, say N.
+
+  This driver is available as a module.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.  The
+  module will be called agpgart.o.
+
+Intel 440LX/BX/GX/815/820/830/840/845/850/860 support
+CONFIG_AGP_INTEL
+  This option gives you AGP support for the GLX component of the
+  XFree86 4.x on Intel 440LX/BX/GX, 815, 820, 830, 840, 845, 850 and 860 chipsets.
+
+  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
+  use GLX or DRI.  If unsure, say N.
+
+Intel 460GX support
+CONFIG_AGP_I460
+  This option gives you AGP support for the Intel 460GX chipset.  This
+  chipset, the first to support Intel Itanium processors, is new and
+  this option is correspondingly a little experimental.
+
+  If you don't have a 460GX based machine (such as BigSur) with an AGP 
+  slot then this option isn't going to do you much good.  If you're
+  dying to do Direct Rendering on IA-64, this is what you're looking for.
+
+Intel I810/I815 DC100/I810e support
+CONFIG_AGP_I810
+  This option gives you AGP support for the Xserver on the Intel 810
+  815 and 830m chipset boards for their on-board integrated graphics. This
+  is required to do any useful video modes with these boards.
+
+VIA chipset support
+CONFIG_AGP_VIA
+  This option gives you AGP support for the GLX component of the
+  XFree86 4.x on VIA MPV3/Apollo Pro chipsets.
+
+  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
+  use GLX or DRI.  If unsure, say N.
+
+AMD Irongate, 761, and 762 support
+CONFIG_AGP_AMD
+  This option gives you AGP support for the GLX component of the
+  XFree86 4.x on AMD Irongate, 761, and 762 chipsets.
+
+  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
+  use GLX or DRI.  If unsure, say N.
+
+CONFIG_AGP_AMD_8151
+  This option gives you AGP support for the GLX component of
+  XFree86 on AMD K8 with an AGP 8151 chipset.
+
+  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
+  use GLX or DRI.  If unsure, say N.
+
+Generic SiS support
+CONFIG_AGP_SIS
+  This option gives you AGP support for the GLX component of the "soon
+  to be released" XFree86 4.x on Silicon Integrated Systems [SiS]
+  chipsets.
+
+  Note that 5591/5592 AGP chipsets are NOT supported.
+
+  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
+  use GLX or DRI.  If unsure, say N.
+
+Serverworks LE/HE support
+CONFIG_AGP_SWORKS
+  Say Y here to support the Serverworks AGP card.  See 
+  <http://www.serverworks.com/> for product descriptions and images.
+
+NVIDIA chipset support
+CONFIG_AGP_NVIDIA
+  This option gives you AGP support for the GLX component of the
+  XFree86 4.x on NVIDIA nForce/nForce2 chipsets.
+
+  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
+  use GLX or DRI.  If unsure, say N.
+
+ALI chipset support
+CONFIG_AGP_ALI
+  This option gives you AGP support for the GLX component of the
+  XFree86 4.x on the following ALi chipsets.  The supported chipsets
+  include M1541, M1621, M1631, M1632, M1641,M1647,and M1651.
+  For the ALi-chipset question, ALi suggests you refer to
+  <http://www.ali.com.tw/eng/support/index.shtml>.
+
+  The M1541 chipset can do AGP 1x and 2x, but note that there is an
+  acknowledged incompatibility with Matrox G200 cards. Due to
+  timing issues, this chipset cannot do AGP 2x with the G200.
+  This is a hardware limitation. AGP 1x seems to be fine, though.
+
+  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
+  use GLX or DRI.  If unsure, say N.
+
+CONFIG_AGP_HP_ZX1
+  This option gives you AGP GART support for the HP ZX1 chipset
+  for IA64 processors.
+
+Support for ISA-bus hardware
+CONFIG_ISA
+  Find out whether you have ISA slots on your motherboard.  ISA is the
+  name of a bus system, i.e. the way the CPU talks to the other stuff
+  inside your box.  Other bus systems are PCI, EISA, MicroChannel
+  (MCA) or VESA.  ISA is an older system, now being displaced by PCI;
+  newer boards don't support it.  If you have ISA, say Y, otherwise N.
+
+Support for PCI bus hardware
+CONFIG_PCI
+  Find out whether you have a PCI motherboard. PCI is the name of a
+  bus system, i.e. the way the CPU talks to the other stuff inside
+  your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or
+  VESA. If you have PCI, say Y, otherwise N.
+
+  The PCI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>, contains valuable
+  information about which PCI hardware does work under Linux and which
+  doesn't.
+
+PCI support
+CONFIG_PCI_INTEGRATOR
+  Find out whether you have a PCI motherboard. PCI is the name of a
+  bus system, i.e. the way the CPU talks to the other stuff inside
+  your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or
+  VESA. If you have PCI, say Y, otherwise N.
+
+  The PCI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>, contains valuable
+  information about which PCI hardware does work under Linux and which
+  doesn't.
+
+QSpan PCI
+CONFIG_PCI_QSPAN
+  Find out whether you have a PCI motherboard. PCI is the name of a
+  bus system, i.e. the way the CPU talks to the other stuff inside
+  your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or
+  VESA. If you have PCI, say Y, otherwise N.
+
+  The PCI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>, contains valuable
+  information about which PCI hardware does work under Linux and which
+  doesn't.
+
+# Choice: pci_access
+PCI access mode
+CONFIG_PCI_GOBIOS
+  On PCI systems, the BIOS can be used to detect the PCI devices and
+  determine their configuration. However, some old PCI motherboards
+  have BIOS bugs and may crash if this is done. Also, some embedded
+  PCI-based systems don't have any BIOS at all. Linux can also try to
+  detect the PCI hardware directly without using the BIOS.
+
+  With this option, you can specify how Linux should detect the PCI
+  devices. If you choose "BIOS", the BIOS will be used, if you choose
+  "Direct", the BIOS won't be used, and if you choose "Any", the
+  kernel will try the direct access method and falls back to the BIOS
+  if that doesn't work. If unsure, go with the default, which is
+  "Any".
+
+PCI device name database
+CONFIG_PCI_NAMES
+  By default, the kernel contains a database of all known PCI device
+  names to make the information in /proc/pci, /proc/ioports and
+  similar files comprehensible to the user. This database increases
+  size of the kernel image by about 80KB, but it gets freed after the
+  system boots up, so it doesn't take up kernel memory. Anyway, if you
+  are building an installation floppy or kernel for an embedded system
+  where kernel image size really matters, you can disable this feature
+  and you'll get device ID numbers instead of names.
+
+  When in doubt, say Y.
+
+Generic PCI hotplug support
+CONFIG_HOTPLUG_PCI
+  Say Y here if you have a motherboard with a PCI Hotplug controller.
+  This allows you to add and remove PCI cards while the machine is
+  powered up and running.  The file system pcihpfs must be mounted
+  in order to interact with any PCI Hotplug controllers.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called pci_hotplug.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+  When in doubt, say N.
+
+Compaq PCI Hotplug driver
+CONFIG_HOTPLUG_PCI_COMPAQ
+  Say Y here if you have a motherboard with a Compaq PCI Hotplug
+  controller.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called cpqphp.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+  When in doubt, say N.
+
+PCI Compaq Hotplug controller NVRAM support
+CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM
+  Say Y here if you have a Compaq server that has a PCI Hotplug
+  controller.  This will allow the PCI Hotplug driver to store the PCI
+  system configuration options in NVRAM.
+
+  When in doubt, say N.
+
+ACPI PCI Hotplug driver
+CONFIG_HOTPLUG_PCI_ACPI
+  Say Y here if you have a system that supports PCI Hotplug using
+  ACPI.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called acpiphp.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+MCA support
+CONFIG_MCA
+  MicroChannel Architecture is found in some IBM PS/2 machines and
+  laptops.  It is a bus system similar to PCI or ISA. See
+  <file:Documentation/mca.txt> (and especially the web page given
+  there) before attempting to build an MCA bus kernel.
+
+Support for EISA-bus hardware
+CONFIG_EISA
+  The Extended Industry Standard Architecture (EISA) bus was
+  developed as an open alternative to the IBM MicroChannel bus.
+
+  The EISA bus provided some of the features of the IBM MicroChannel
+  bus while maintaining backward compatibility with cards made for
+  the older ISA bus.  The EISA bus saw limited use between 1988 and
+  1995 when it was made obsolete by the PCI bus.
+
+  Say Y here if you are building a kernel for an EISA-based machine.
+
+  Otherwise, say N.
+
+SGI Visual Workstation support
+CONFIG_VISWS
+  The SGI Visual Workstation series is an IA32-based workstation
+  based on SGI systems chips with some legacy PC hardware attached.
+  Say Y here to create a kernel to run on the SGI 320 or 540.
+  A kernel compiled for the Visual Workstation will not run on other
+  PC boards and vice versa.
+  See <file:Documentation/sgi-visws.txt> for more.
+
+SGI Visual Workstation framebuffer support
+CONFIG_FB_SGIVW
+  SGI Visual Workstation support for framebuffer graphics.
+
+I2O support
+CONFIG_I2O
+  The Intelligent Input/Output (I2O) architecture allows hardware
+  drivers to be split into two parts: an operating system specific
+  module called the OSM and an hardware specific module called the
+  HDM. The OSM can talk to a whole range of HDM's, and ideally the
+  HDM's are not OS dependent. This allows for the same HDM driver to
+  be used under different operating systems if the relevant OSM is in
+  place. In order for this to work, you need to have an I2O interface
+  adapter card in your computer. This card contains a special I/O
+  processor (IOP), thus allowing high speeds since the CPU does not
+  have to deal with I/O.
+
+  If you say Y here, you will get a choice of interface adapter
+  drivers and OSM's with the following questions.
+
+  This support is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  You will get modules called
+  i2o_core.o and i2o_config.o.
+
+  If unsure, say N.
+
+I2O PCI support
+CONFIG_I2O_PCI
+  Say Y for support of PCI bus I2O interface adapters. Currently this
+  is the only variety supported, so you should say Y.
+
+  This support is also available as a module called i2o_pci.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+I2O Block OSM
+CONFIG_I2O_BLOCK
+  Include support for the I2O Block OSM. The Block OSM presents disk
+  and other structured block devices to the operating system.
+
+  This support is also available as a module called i2o_block.o ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+I2O LAN OSM
+CONFIG_I2O_LAN
+  Include support for the LAN OSM. You will also need to include
+  support for token ring or FDDI if you wish to use token ring or FDDI
+  I2O cards with this driver.
+
+  This support is also available as a module called i2o_lan.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+I2O SCSI OSM
+CONFIG_I2O_SCSI
+  Allows direct SCSI access to SCSI devices on a SCSI or FibreChannel
+  I2O controller. You can use both the SCSI and Block OSM together if
+  you wish.
+
+  This support is also available as a module called i2o_scsi.o ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+I2O /proc support
+CONFIG_I2O_PROC
+  If you say Y here and to "/proc file system support", you will be
+  able to read I2O related information from the virtual directory
+  /proc/i2o.
+
+  This support is also available as a module called i2o_proc.o ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Plug and Play support
+CONFIG_PNP
+  Plug and Play (PnP) is a standard for peripherals which allows those
+  peripherals to be configured by software, e.g. assign IRQ's or other
+  parameters. No jumpers on the cards are needed, instead the values
+  are provided to the cards from the BIOS, from the operating system,
+  or using a user-space utility.
+
+  Say Y here if you would like Linux to configure your Plug and Play
+  devices. You should then also say Y to "ISA Plug and Play support",
+  below. Alternatively, you can say N here and configure your PnP
+  devices using the user space utilities contained in the isapnptools
+  package.
+
+  This support is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+ISA Plug and Play support
+CONFIG_ISAPNP
+  Say Y here if you would like support for ISA Plug and Play devices.
+  Some information is in <file:Documentation/isapnp.txt>.
+
+  This support is also available as a module called isapnp.o ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+  If unsure, say Y.
+
+PNPBIOS support
+CONFIG_PNPBIOS
+  Linux uses the PNPBIOS as defined in "Plug and Play BIOS
+  Specification Version 1.0A May 5, 1994" to autodetect built-in
+  mainboard resources (e.g. parallel port resources).
+
+  Other features (e.g. change resources, ESCD, event notification,
+  Docking station information, ISAPNP services) are not used.
+
+  Note: ACPI is expected to supersede PNPBIOS some day, currently it
+  co-exists nicely.
+
+  See latest pcmcia-cs (stand-alone package) for a nice "lspnp" tools,
+  or have a look at /proc/bus/pnp.
+
+  If unsure, say Y.
+
+Support for hot-pluggable devices
+CONFIG_HOTPLUG
+  Say Y here if you want to plug devices into your computer while
+  the system is running, and be able to use them quickly.  In many
+  cases, the devices can likewise be unplugged at any time too.
+
+  One well known example of this is PCMCIA- or PC-cards, credit-card
+  size devices such as network cards, modems or hard drives which are
+  plugged into slots found on all modern laptop computers.  Another
+  example, used on modern desktops as well as laptops, is USB.
+
+  Enable HOTPLUG and KMOD, and build a modular kernel.  Get agent
+  software (at <http://linux-hotplug.sourceforge.net/>) and install it.
+  Then your kernel will automatically call out to a user mode "policy
+  agent" (/sbin/hotplug) to load modules and set up software needed
+  to use devices as you hotplug them.
+
+PCMCIA/CardBus support
+CONFIG_PCMCIA
+  Say Y here if you want to attach PCMCIA- or PC-cards to your Linux
+  computer.  These are credit-card size devices such as network cards,
+  modems or hard drives often used with laptops computers.  There are
+  actually two varieties of these cards: the older 16 bit PCMCIA cards
+  and the newer 32 bit CardBus cards.  If you want to use CardBus
+  cards, you need to say Y here and also to "CardBus support" below.
+
+  To use your PC-cards, you will need supporting software from David
+  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
+  for location).  Please also read the PCMCIA-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  When compiled this way, there will be modules called pcmcia_core.o
+  and ds.o.  If you want to compile it as a module, say M here and
+  read <file:Documentation/modules.txt>.
+
+CardBus card and (Yenta) bridge support
+CONFIG_CARDBUS
+  CardBus is a bus mastering architecture for PC-cards, which allows
+  for 32 bit PC-cards (the original PCMCIA standard specifies only
+  a 16 bit wide bus). Many newer PC-cards are actually CardBus cards.
+
+  This option enables support for CardBus PC Cards, as well as support
+  for CardBus host bridges.  Virtually all modern PCMCIA bridges are
+  CardBus compatible.  A "bridge" is the hardware inside your computer
+  that PCMCIA cards are plugged into.
+
+  To use your PC-cards, you will need supporting software from David
+  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
+  for location).
+
+  If unsure, say Y.
+
+i82092 compatible bridge support
+CONFIG_I82092
+  This provides support for the Intel I82092AA PCI-to-PCMCIA bridge device,
+  found in some older laptops and more commonly in evaluation boards for the
+  chip.
+
+i82365 compatible host bridge support
+CONFIG_I82365
+  Say Y here to include support for ISA-bus PCMCIA host bridges that
+  are register compatible with the Intel i82365.  These are found on
+  older laptops and ISA-bus card readers for desktop systems.  A
+  "bridge" is the hardware inside your computer that PCMCIA cards are
+  plugged into. If unsure, say N.
+
+Databook TCIC host bridge support
+CONFIG_TCIC
+  Say Y here to include support for the Databook TCIC family of PCMCIA
+  host bridges. These are only found on a handful of old systems.
+  "Bridge" is the name used for the hardware inside your computer that
+  PCMCIA cards are plugged into. If unsure, say N.
+
+CONFIG_PCMCIA_SIBYTE
+  Say Y here to include support for the SiByte SOC's built-in PCMCIA
+  interface.  Only ATA cards and CompactFlash are currently
+  supported.
+
+System V IPC
+CONFIG_SYSVIPC
+  Inter Process Communication is a suite of library functions and
+  system calls which let processes (running programs) synchronize and
+  exchange information. It is generally considered to be a good thing,
+  and some programs won't run unless you say Y here. In particular, if
+  you want to run the DOS emulator dosemu under Linux (read the
+  DOSEMU-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>), you'll need to say Y
+  here.
+
+  You can find documentation about IPC with "info ipc" and also in
+  section 6.4 of the Linux Programmer's Guide, available from
+  <http://www.tldp.org/docs.html#guide>.
+
+BSD Process Accounting
+CONFIG_BSD_PROCESS_ACCT
+  If you say Y here, a user level program will be able to instruct the
+  kernel (via a special system call) to write process accounting
+  information to a file: whenever a process exits, information about
+  that process will be appended to the file by the kernel.  The
+  information includes things such as creation time, owning user,
+  command name, memory usage, controlling terminal etc. (the complete
+  list is in the struct acct in <file:include/linux/acct.h>).  It is
+  up to the user level program to do useful things with this
+  information.  This is generally a good idea, so say Y.
+
+Sysctl support
+CONFIG_SYSCTL
+  The sysctl interface provides a means of dynamically changing
+  certain kernel parameters and variables on the fly without requiring
+  a recompile of the kernel or reboot of the system.  The primary
+  interface consists of a system call, but if you say Y to "/proc
+  file system support", a tree of modifiable sysctl entries will be
+  generated beneath the /proc/sys directory. They are explained in the
+  files in <file:Documentation/sysctl/>.  Note that enabling this
+  option will enlarge the kernel by at least 8 KB.
+
+  As it is generally a good thing, you should say Y here unless
+  building a kernel for install/rescue disks or your system is very
+  limited in memory.
+
+# Choice: kcore
+Kernel core (/proc/kcore) format
+CONFIG_KCORE_ELF
+  If you enabled support for /proc file system then the file
+  /proc/kcore will contain the kernel core image. This can be used
+  in gdb:
+
+  $ cd /usr/src/linux ; gdb vmlinux /proc/kcore
+
+  You have two choices here: ELF and A.OUT. Selecting ELF will make
+  /proc/kcore appear in ELF core format as defined by the Executable
+  and Linking Format specification. Selecting A.OUT will choose the
+  old "a.out" format which may be necessary for some old versions
+  of binutils or on some architectures.
+
+  This is especially useful if you have compiled the kernel with the
+  "-g" option to preserve debugging information. It is mainly used
+  for examining kernel data structures on the live kernel so if you
+  don't understand what this means or are not a kernel hacker, just
+  leave it at its default value ELF.
+
+Select a.out format for /proc/kcore
+CONFIG_KCORE_AOUT
+  Not necessary unless you're using a very out-of-date binutils
+  version.  You probably want KCORE_ELF.
+
+Kernel support for ELF binaries
+CONFIG_BINFMT_ELF
+  ELF (Executable and Linkable Format) is a format for libraries and
+  executables used across different architectures and operating
+  systems. Saying Y here will enable your kernel to run ELF binaries
+  and enlarge it by about 13 KB. ELF support under Linux has now all
+  but replaced the traditional Linux a.out formats (QMAGIC and ZMAGIC)
+  because it is portable (this does *not* mean that you will be able
+  to run executables from different architectures or operating systems
+  however) and makes building run-time libraries very easy. Many new
+  executables are distributed solely in ELF format. You definitely
+  want to say Y here.
+
+  Information about ELF is contained in the ELF HOWTO available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you find that after upgrading from Linux kernel 1.2 and saying Y
+  here, you still can't run any ELF binaries (they just crash), then
+  you'll have to install the newest ELF runtime libraries, including
+  ld.so (check the file <file:Documentation/Changes> for location and
+  latest version).
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called binfmt_elf.o. Saying M or N here is dangerous because
+  some crucial programs on your system might be in ELF format.
+
+Kernel support for a.out binaries
+CONFIG_BINFMT_AOUT
+  A.out (Assembler.OUTput) is a set of formats for libraries and
+  executables used in the earliest versions of UNIX. Linux used the
+  a.out formats QMAGIC and ZMAGIC until they were replaced with the
+  ELF format.
+
+  As more and more programs are converted to ELF, the use for a.out
+  will gradually diminish. If you disable this option it will reduce
+  your kernel by one page. This is not much and by itself does not
+  warrant removing support. However its removal is a good idea if you
+  wish to ensure that absolutely none of your programs will use this
+  older executable format. If you don't know what to answer at this
+  point then answer Y. If someone told you "You need a kernel with
+  QMAGIC support" then you'll have to say Y here. You may answer M to
+  compile a.out support as a module and later load the module when you
+  want to use a program or library in a.out format. The module will be
+  called binfmt_aout.o. Saying M or N here is dangerous though,
+  because some crucial programs on your system might still be in A.OUT
+  format.
+
+OSF/1 v4 readv/writev compatibility
+CONFIG_OSF4_COMPAT
+  Say Y if you are using OSF/1 binaries (like Netscape and Acrobat)
+  with v4 shared libraries freely available from Compaq. If you're
+  going to use shared libraries from Tru64 version 5.0 or later, say N.
+
+Kernel support for Linux/Intel ELF binaries
+CONFIG_BINFMT_EM86
+  Say Y here if you want to be able to execute Linux/Intel ELF
+  binaries just like native Alpha binaries on your Alpha machine. For
+  this to work, you need to have the emulator /usr/bin/em86 in place.
+
+  You can get the same functionality by saying N here and saying Y to
+  "Kernel support for MISC binaries".
+
+  You may answer M to compile the emulation support as a module and
+  later load the module when you want to use a Linux/Intel binary. The
+  module will be called binfmt_em86.o. If unsure, say Y.
+
+Kernel support for SOM binaries
+CONFIG_BINFMT_SOM
+  SOM is a binary executable format inherited from HP/UX.  Say Y here
+  to be able to load and execute SOM binaries directly.
+
+Kernel support for MISC binaries
+CONFIG_BINFMT_MISC
+  If you say Y here, it will be possible to plug wrapper-driven binary
+  formats into the kernel. You will like this especially when you use
+  programs that need an interpreter to run like Java, Python or
+  Emacs-Lisp. It's also useful if you often run DOS executables under
+  the Linux DOS emulator DOSEMU (read the DOSEMU-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>). Once you have
+  registered such a binary class with the kernel, you can start one of
+  those programs simply by typing in its name at a shell prompt; Linux
+  will automatically feed it to the correct interpreter.
+
+  You can do other nice things, too. Read the file
+  <file:Documentation/binfmt_misc.txt> to learn how to use this
+  feature, and <file:Documentation/java.txt> for information about how
+  to include Java support.
+
+  You must say Y to "/proc file system support" (CONFIG_PROC_FS) to
+  use this part of the kernel.
+
+  You may say M here for module support and later load the module when
+  you have use for it; the module is called binfmt_misc.o. If you
+  don't know what to answer at this point, say Y.
+
+Kernel support for JAVA binaries
+CONFIG_BINFMT_JAVA
+  If you say Y here, the kernel will load and execute Java J-code
+  binaries directly.  Note: this option is obsolete and scheduled for
+  removal, use CONFIG_BINFMT_MISC instead.
+
+Solaris binary emulation
+CONFIG_SOLARIS_EMUL
+  This is experimental code which will enable you to run (many)
+  Solaris binaries on your SPARC Linux machine.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called solaris.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+SUN SME environment monitoring
+CONFIG_ENVCTRL
+  Kernel support for temperature and fan monitoring on Sun SME
+  machines.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called envctrl.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+# Choice: x86type
+Processor family
+CONFIG_M386
+  This is the processor type of your CPU. This information is used for
+  optimizing purposes. In order to compile a kernel that can run on
+  all x86 CPU types (albeit not optimally fast), you can specify
+  "386" here.
+
+  The kernel will not necessarily run on earlier architectures than
+  the one you have chosen, e.g. a Pentium optimized kernel will run on
+  a PPro, but not necessarily on a i486.
+
+  Here are the settings recommended for greatest speed:
+   - "386" for the AMD/Cyrix/Intel 386DX/DXL/SL/SLC/SX, Cyrix/TI
+     486DLC/DLC2, UMC 486SX-S and NexGen Nx586.  Only "386" kernels
+     will run on a 386 class machine.
+   - "486" for the AMD/Cyrix/IBM/Intel 486DX/DX2/DX4 or
+     SL/SLC/SLC2/SLC3/SX/SX2 and UMC U5D or U5S.
+   - "586" for generic Pentium CPUs, possibly lacking the TSC
+     (time stamp counter) register.
+   - "Pentium-Classic" for the Intel Pentium.
+   - "Pentium-MMX" for the Intel Pentium MMX.
+   - "Pentium-Pro" for the Intel Pentium Pro/Celeron/Pentium II.
+   - "Pentium-III" for the Intel Pentium III
+     and Celerons based on the Coppermine core.
+   - "Pentium-4" for the Intel Pentium 4.
+   - "K6" for the AMD K6, K6-II and K6-III (aka K6-3D).
+   - "Athlon" for the AMD K7 family (Athlon/Duron/Thunderbird).
+   - "Elan" for the AMD Elan family (Elan SC400/SC410).
+   - "Crusoe" for the Transmeta Crusoe series.
+   - "Winchip-C6" for original IDT Winchip.
+   - "Winchip-2" for IDT Winchip 2.
+   - "Winchip-2A" for IDT Winchips with 3dNow! capabilities.
+   - "CyrixIII" for VIA Cyrix III or VIA C3.
+   - "VIA C3-2 for VIA C3-2 "Nehemiah" (model 9 and above).
+
+  If you don't know what to do, choose "386".
+
+486
+CONFIG_M486
+  Select this for a x486 processor, ether Intel or one of the
+  compatible processors from AMD, Cyrix, IBM, or Intel.  Includes DX,
+  DX2, and DX4 variants; also SL/SLC/SLC2/SLC3/SX/SX2 and UMC U5D or
+  U5S.
+
+586/K5/5x86/6x86/6x86MX
+CONFIG_M586
+  Select this for an x586 or x686 processor such as the AMD K5, the
+  Intel 5x86 or 6x86, or the Intel 6x86MX.  This choice does not
+  assume the RDTSC instruction.
+
+Pentium Classic
+CONFIG_M586TSC
+  Select this for a Pentium Classic processor with the RDTSC (Read
+  Time Stamp Counter) instruction for benchmarking.
+
+VIA C3-2 (Nehemiah)
+CONFIG_MVIAC3_2
+  Select this for a VIA C3 "Nehemiah". Selecting this enables usage of SSE
+  and tells gcc to treat the CPU as a 686.
+
+  Note, this kernel will not boot on older (pre model 9) C3s.
+
+32-bit PDC
+CONFIG_PDC_NARROW
+  Saying Y here will allow developers with a C180, C200, C240, C360,
+  J200, J210, and/or a J2240 to test 64-bit kernels by providing a
+  wrapper for the 32-bit PDC calls.  Since the machines which require
+  this option do not support over 4G of RAM, this option is targeted
+  for developers of these machines wishing to test changes on both
+  32-bit and 64-bit configurations.
+
+  If unsure, say N.
+
+VGA text console
+CONFIG_VGA_CONSOLE
+  Saying Y here will allow you to use Linux in text mode through a
+  display that complies with the generic VGA standard. Virtually
+  everyone wants that.
+
+  The program SVGATextMode can be used to utilize SVGA video cards to
+  their full potential in text mode. Download it from
+  <ftp://ibiblio.org/pub/Linux/utils/console/>.
+
+  Say Y.
+
+Distribute interrupts on all CPUs by default
+CONFIG_IRQ_ALL_CPUS
+  This option gives the kernel permission to distribute IRQs across
+  multiple CPUs.  Saying N here will route all IRQs to the first
+  CPU. Generally SMP PowerMacs can answer Y. SMP IBM CHRP boxes or
+  Power3 boxes should say N for now.
+
+Video mode selection support
+CONFIG_VIDEO_SELECT
+  This enables support for text mode selection on kernel startup. If
+  you want to take advantage of some high-resolution text mode your
+  card's BIOS offers, but the traditional Linux utilities like
+  SVGATextMode don't, you can say Y here and set the mode using the
+  "vga=" option from your boot loader (lilo or loadlin) or set
+  "vga=ask" which brings up a video mode menu on kernel startup. (Try
+  "man bootparam" or see the documentation of your boot loader about
+  how to pass options to the kernel.)
+
+  Read the file <file:Documentation/svga.txt> for more information
+  about the Video mode selection support. If unsure, say N.
+
+Support for frame buffer devices
+CONFIG_FB
+  The frame buffer device provides an abstraction for the graphics
+  hardware. It represents the frame buffer of some video hardware and
+  allows application software to access the graphics hardware through
+  a well-defined interface, so the software doesn't need to know
+  anything about the low-level (hardware register) stuff.
+
+  Frame buffer devices work identically across the different
+  architectures supported by Linux and make the implementation of
+  application programs easier and more portable; at this point, an X
+  server exists which uses the frame buffer device exclusively.
+  On several non-X86 architectures, the frame buffer device is the
+  only way to use the graphics hardware.
+
+  The device is accessed through special device nodes, usually located
+  in the /dev directory, i.e. /dev/fb*.
+
+  You need an utility program called fbset to make full use of frame
+  buffer devices. Please read <file:Documentation/fb/framebuffer.txt>
+  and the Framebuffer-HOWTO at
+  <http://www.tahallah.demon.co.uk/programming/prog.html> for more
+  information.
+
+  Say Y here and to the driver for your graphics board below if you
+  are compiling a kernel for a non-x86 architecture.
+
+  If you are compiling for the x86 architecture, you can say Y if you
+  want to play with it, but it is not essential. Please note that
+  running graphical applications that directly touch the hardware
+  (e.g. an accelerated X server) and that are not frame buffer
+  device-aware may cause unexpected results. If unsure, say N.
+
+Acorn VIDC support
+CONFIG_FB_ACORN
+  This is the frame buffer device driver for the Acorn VIDC graphics
+  hardware found in Acorn RISC PCs and other ARM-based machines.  If
+  unsure, say N.
+
+Permedia2 support
+CONFIG_FB_PM2
+  This is the frame buffer device driver for the Permedia2 AGP frame
+  buffer card from ASK, aka `Graphic Blaster Exxtreme'.  There is a
+  product page at
+  <http://www.ask.com.hk/product/Permedia%202/permedia2.htm>.
+
+Enable FIFO disconnect feature
+CONFIG_FB_PM2_FIFO_DISCONNECT
+  Support the Permedia2 FIFOI disconnect feature (see CONFIG_FB_PM2).
+
+Generic Permedia2 PCI board support
+CONFIG_FB_PM2_PCI
+  Say Y to enable support for Permedia2 AGP frame buffer card from
+  3Dlabs (aka `Graphic Blaster Exxtreme') on the PCI bus.
+
+Phase5 CVisionPPC/BVisionPPC support
+CONFIG_FB_PM2_CVPPC
+  Say Y to enable support for the Amiga Phase 5 CVisionPPC BVisionPPC
+  framebuffer cards.  Phase 5 is no longer with us, alas.
+
+Amiga native chipset support
+CONFIG_FB_AMIGA
+  This is the frame buffer device driver for the builtin graphics
+  chipset found in Amigas.
+
+  The driver is also available as a module ( = code which can be
+  inserted and removed from the running kernel whenever you want). The
+  module will be called amifb.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Amiga OCS chipset support
+CONFIG_FB_AMIGA_OCS
+  This enables support for the original Agnus and Denise video chips,
+  found in the Amiga 1000 and most A500's and A2000's. If you intend
+  to run Linux on any of these systems, say Y; otherwise say N.
+
+Amiga ECS chipset support
+CONFIG_FB_AMIGA_ECS
+  This enables support for the Enhanced Chip Set, found in later
+  A500's, later A2000's, the A600, the A3000, the A3000T and CDTV. If
+  you intend to run Linux on any of these systems, say Y; otherwise
+  say N.
+
+Amiga AGA chipset support
+CONFIG_FB_AMIGA_AGA
+  This enables support for the Advanced Graphics Architecture (also
+  known as the AGA or AA) Chip Set, found in the A1200, A4000, A4000T
+  and CD32. If you intend to run Linux on any of these systems, say Y;
+  otherwise say N.
+
+Amiga CyberVision support
+CONFIG_FB_CYBER
+  This enables support for the Cybervision 64 graphics card from
+  Phase5. Please note that its use is not all that intuitive (i.e. if
+  you have any questions, be sure to ask!). Say N unless you have a
+  Cybervision 64 or plan to get one before you next recompile the
+  kernel. Please note that this driver DOES NOT support the
+  Cybervision 64 3D card, as they use incompatible video chips.
+
+CyberPro 20x0 support
+CONFIG_FB_CYBER2000
+  This enables support for the Integraphics CyberPro 20x0 and 5000
+  VGA chips used in the Rebel.com Netwinder and other machines.
+  Say Y if you have a NetWinder or a graphics card containing this
+  device, otherwise say N.
+
+Amiga CyberVision3D support
+CONFIG_FB_VIRGE
+  This enables support for the Cybervision 64/3D graphics card from
+  Phase5. Please note that its use is not all that intuitive (i.e. if
+  you have any questions, be sure to ask!). Say N unless you have a
+  Cybervision 64/3D or plan to get one before you next recompile the
+  kernel. Please note that this driver DOES NOT support the older
+  Cybervision 64 card, as they use incompatible video chips.
+
+Amiga RetinaZ3 support
+CONFIG_FB_RETINAZ3
+  This enables support for the Retina Z3 graphics card. Say N unless
+  you have a Retina Z3 or plan to get one before you next recompile
+  the kernel.
+
+Cirrus Logic generic driver
+CONFIG_FB_CLGEN
+  This enables support for Cirrus Logic GD542x/543x based boards on
+  Amiga: SD64, Piccolo, Picasso II/II+, Picasso IV, or EGS Spectrum.
+
+  If you have a PCI-based system, this enables support for these
+  chips: GD-543x, GD-544x, GD-5480.
+
+  Please read the file <file:Documentation/fb/clgenfb.txt>.
+
+  Say N unless you have such a graphics board or plan to get one
+  before you next recompile the kernel.
+
+Apollo support
+CONFIG_APOLLO
+  Say Y here if you want to run Linux on an MC680x0-based Apollo
+  Domain workstation such as the DN3500.
+
+Apollo 3c505 "EtherLink Plus" support
+CONFIG_APOLLO_ELPLUS
+  Say Y or M here if your Apollo has a 3Com 3c505 ISA Ethernet card.
+  If you don't have one made for Apollos, you can use one from a PC,
+  except that your Apollo won't be able to boot from it (because the
+  code in the ROM will be for a PC).
+
+Atari native chipset support
+CONFIG_FB_ATARI
+  This is the frame buffer device driver for the builtin graphics
+  chipset found in Ataris.
+
+Amiga FrameMaster II/Rainbow II support
+CONFIG_FB_FM2
+  This is the frame buffer device driver for the Amiga FrameMaster
+  card from BSC (exhibited 1992 but not shipped as a CBM product).
+
+Open Firmware frame buffer device support
+CONFIG_FB_OF
+  Say Y if you want support with Open Firmware for your graphics
+  board.
+
+S3 Trio frame buffer device support
+CONFIG_FB_S3TRIO
+  If you have a S3 Trio say Y. Say N for S3 Virge.
+
+3Dfx Banshee/Voodoo3 display support
+CONFIG_FB_3DFX
+  This driver supports graphics boards with the 3Dfx Banshee/Voodoo3
+  chips. Say Y if you have such a graphics board.
+
+  The driver is also available as a module ( = code which can be
+  inserted and removed from the running kernel whenever you want). The
+  module will be called tdfxfb.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+nVidia Riva support
+CONFIG_FB_RIVA
+  This driver supports graphics boards with the nVidia Riva/Geforce
+  chips.
+  Say Y if you have such a graphics board.
+
+  The driver is also available as a module ( = code which can be
+  inserted and removed from the running kernel whenever you want). The
+  module will be called rivafb.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Trident Blade/Image support
+CONFIG_FB_TRIDENT
+  This driver is supposed to support graphics boards with the
+  Trident CyberXXXX/Image/CyberBlade chips mostly found in laptops
+  but also on some motherboards.Read <file:Documentation/fb/tridentfb.txt>
+
+  Say Y if you have such a graphics board.
+
+  The driver is also available as a module ( = code which can be
+  inserted and removed from the running kernel whenever you want). The
+  module will be called tridentfb.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+ATI Mach64 display support
+CONFIG_FB_ATY
+  This driver supports graphics boards with the ATI Mach64 chips.
+  Say Y if you have such a graphics board.
+
+  The driver is also available as a module ( = code which can be
+  inserted and removed from the running kernel whenever you want). The
+  module will be called atyfb.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+ATI Rage128 display support
+CONFIG_FB_ATY128
+  This driver supports graphics boards with the ATI Rage128 chips.
+  Say Y if you have such a graphics board and read
+  <file:Documentation/fb/aty128fb.txt>.
+
+  The driver is also available as a module ( = code which can be
+  inserted and removed from the running kernel whenever you want). The
+  module will be called aty128fb.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Maxine (Personal DECstation) onboard framebuffer support
+CONFIG_FB_MAXINE
+  Support for the onboard framebuffer (1024x768x8) in the Personal
+  DECstation series (Personal DECstation 5000/20, /25, /33, /50,
+  Codename "Maxine").
+
+PMAG-BA TURBOchannel framebuffer support
+CONFIG_FB_PMAG_BA
+  Support for the PMAG-BA TURBOchannel framebuffer card (1024x864x8)
+  used mainly in the MIPS-based DECstation series.
+
+PMAGB-B TURBOchannel framebuffer support
+CONFIG_FB_PMAGB_B
+  Support for the PMAGB-B TURBOchannel framebuffer card used mainly
+  in the MIPS-based DECstation series. The card is currently only 
+  supported in 1280x1024x8 mode.  
+
+FutureTV PCI card
+CONFIG_ARCH_FTVPCI
+  Say Y here if you intend to run this kernel on a FutureTV (nee Nexus
+  Electronics) StrongARM PCI card.
+
+ANAKIN Vehicle Telematics Platform
+CONFIG_ARCH_ANAKIN
+  The Anakin is a StrongArm based SA110 - 2 DIN Vehicle Telematics Platform.
+  64MB SDRAM - 4 Mb Flash - Compact Flash Interface - 1 MB VRAM
+
+  On board peripherals:
+        * Front display: 400x234 16 bit TFT touchscreen
+        * External independent second screen interface
+        * CAN controller SJA1000
+        * USB host controller
+        * 6 channel video codec with hardware overlay
+        * Smartcard reader
+        * IrDa
+
+  Modules interfaced over the Multi Media Extension slots:
+        * A communication card
+                Wavecom GPRS modem
+                uBlock GPS
+                Bosch DAB module
+        * An audio card ( 4 * 40W, AC97 Codec, I2S)
+
+Altera Excalibur XA10 Dev Board
+ARCH_CAMELOT
+  This enables support for Altera's Excalibur XA10 development board.
+  If you would like to build your kernel to run on one of these boards
+  then you must say 'Y' here. Otherwise say 'N'
+
+Link-Up Systems LCD support
+CONFIG_FB_L7200
+  This driver supports the L7200 Color LCD.
+  Say Y if you want graphics support.
+
+NeoMagic display support (EXPERIMENTAL)
+CONFIG_FB_NEOMAGIC
+  This driver supports notebooks with NeoMagic PCI chips.
+  Say Y if you have such a graphics card. 
+
+  The driver is also available as a module ( = code which can be
+  inserted and removed from the running kernel whenever you want). The
+  module will be called neofb.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt.
+
+PowerMac "control" frame buffer device support
+CONFIG_FB_CONTROL
+  This driver supports a frame buffer for the graphics adapter in the
+  Power Macintosh 7300 and others.
+
+PowerMac "platinum" frame buffer device support
+CONFIG_FB_PLATINUM
+  This driver supports a frame buffer for the "platinum" graphics
+  adapter in some Power Macintoshes.
+
+PowerMac "valkyrie" frame buffer device support
+CONFIG_FB_VALKYRIE
+  This driver supports a frame buffer for the "valkyrie" graphics
+  adapter in some Power Macintoshes.
+
+Chips 65550 display support
+CONFIG_FB_CT65550
+  This is the frame buffer device driver for the Chips & Technologies
+  65550 graphics chip in PowerBooks.
+
+TGA frame buffer support
+CONFIG_FB_TGA
+  This is the frame buffer device driver for generic TGA graphic
+  cards. Say Y if you have one of those.
+
+VESA VGA graphics console
+CONFIG_FB_VESA
+  This is the frame buffer device driver for generic VESA 2.0
+  compliant graphic cards. The older VESA 1.2 cards are not supported.
+  You will get a boot time penguin logo at no additional cost. Please
+  read <file:Documentation/fb/vesafb.txt>. If unsure, say Y.
+
+VGA 16-color planar support
+CONFIG_FBCON_VGA_PLANES
+  This low level frame buffer console driver enable the kernel to use
+  the 16-color planar modes of the old VGA cards where the bits of
+  each pixel are separated into 4 planes.
+
+  Only answer Y here if you have a (very old) VGA card that isn't VESA
+  2 compatible.
+
+VGA 16-color graphics console
+CONFIG_FB_VGA16
+  This is the frame buffer device driver for VGA 16 color graphic
+  cards. Say Y if you have such a card.
+
+  This code is also available as a module. If you want to compile it
+  as a module ( = code which can be inserted in and removed from the
+  running kernel whenever you want), say M here and read
+  <file:Documentation/modules.txt>.  The module will be called
+  vga16fb.o.
+
+Generic STI frame buffer device support
+CONFIG_FB_STI
+  STI refers to the HP "Standard Text Interface" which is a set of
+  BIOS routines contained in a ROM chip in HP PA-RISC based machines.
+  Enabling this option will implement the linux framebuffer device and
+  an fbcon color text console using calls to the STI BIOS routines.
+  The HP framebuffer device is sometimes planar, using a strange memory
+  layout, and changing the plane mask to create colored pixels
+  can require a call to the STI routines, so /dev/fb may not actually 
+  be useful.  However, on some systems packed pixel formats are supported.  
+  It is sufficient for basic text console functions, including fonts.
+
+  You should probably enable this option, unless you are having
+  trouble getting video when booting the kernel (make sure it isn't
+  just that you are running the console on the serial port, though).
+  Really old HP boxes may not have STI, and must use the PDC BIOS
+  console or the IODC BIOS.
+
+Select other compiled-in fonts
+CONFIG_FBCON_FONTS
+  Say Y here if you would like to use fonts other than the default
+  your frame buffer console usually use.
+
+  Note that the answer to this question won't directly affect the
+  kernel: saying N will just cause the configurator to skip all
+  the questions about foreign fonts.
+
+  If unsure, say N (the default choices are safe).
+
+VGA 8x16 font
+CONFIG_FONT_8x16
+  This is the "high resolution" font for the VGA frame buffer (the one
+  provided by the VGA text console 80x25 mode.
+
+  If unsure, say Y.
+
+Support only 8 pixels wide fonts
+CONFIG_FBCON_FONTWIDTH8_ONLY
+  Answer Y here will make the kernel provide only the 8x8 fonts (these
+  are the less readable).
+
+  If unsure, say N.
+
+Sparc console 8x16 font
+CONFIG_FONT_SUN8x16
+  This is the high resolution console font for Sun machines. Say Y.
+
+Sparc console 12x22 font (not supported by all drivers)
+CONFIG_FONT_SUN12x22
+  This is the high resolution console font for Sun machines with very
+  big letters (like the letters used in the SPARC PROM). If the
+  standard font is unreadable for you, say Y, otherwise say N.
+
+VGA 8x8 font
+CONFIG_FONT_8x8
+  This is the "high resolution" font for the VGA frame buffer (the one
+  provided by the text console 80x50 (and higher) modes).
+
+  Note that this is a poor quality font. The VGA 8x16 font is quite a
+  lot more readable.
+
+  Given the resolution provided by the frame buffer device, answer N
+  here is safe.
+
+Mac console 6x11 font (not supported by all drivers)
+CONFIG_FONT_6x11
+  Small console font with Macintosh-style high-half glyphs.  Some Mac
+  framebuffer drivers don't support this one at all.
+
+Pearl (old m68k) console 8x8 font
+CONFIG_FONT_PEARL_8x8
+  Small console font with PC-style control-character and high-half
+  glyphs.
+
+Acorn console 8x8 font
+CONFIG_FONT_ACORN_8x8
+  Small console font with PC-style control characters and high-half
+  glyphs.
+
+Backward compatibility mode for Xpmac
+CONFIG_FB_COMPAT_XPMAC
+  If you use the Xpmac X server (common with mklinux), you'll need to
+  say Y here to use X. You should consider changing to XFree86 which
+  includes a server that supports the frame buffer device directly
+  (XF68_FBDev).
+
+Hercules (HGA) mono graphics support
+CONFIG_FB_HGA
+  Say Y here if you have a Hercules mono graphics card.
+
+  This driver is also available as a module ( = code which can be
+  inserted and removed from the running kernel whenever you want).
+  The module will be called hgafb.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+  As this card technology is 15 years old, most people will answer N
+  here.
+
+Epson 1355 framebuffer support
+CONFIG_FB_E1355
+  Build in support for the SED1355 Epson Research Embedded RAMDAC
+  LCD/CRT Controller (since redesignated as the S1D13505) as a
+  framebuffer.  Product specs at
+  <http://www.erd.epson.com/vdc/html/products.htm>.
+
+Dreamcast Frame Buffer support
+CONFIG_FB_DC
+  Say Y here to enable support for the framebuffer on the Sega
+  Dreamcast.  This driver is also available as a module, dcfb.o.
+
+Register Base Address
+CONFIG_E1355_REG_BASE
+  Epson SED1355/S1D13505 LCD/CRT controller register base address.
+  See the manuals at
+  <http://www.erd.epson.com/vdc/html/contents/S1D13505.htm> for
+  discussion.
+
+Framebuffer Base Address
+CONFIG_E1355_FB_BASE
+  Epson SED1355/S1D13505 LCD/CRT controller memory base address.  See
+  the manuals at
+  <http://www.erd.epson.com/vdc/html/contents/S1D13505.htm> for
+  discussion.
+
+NEC PowerVR 2 display support
+CONFIG_FB_PVR2
+  Say Y here if you have a PowerVR 2 card in your box.  If you plan to
+  run linux on your Dreamcast, you will have to say Y here.
+  This driver may or may not work on other PowerVR 2 cards, but is
+  totally untested.  Use at your own risk.  If unsure, say N.
+
+  This driver is also available as a module ( = code which can be
+  inserted and removed from the running kernel whenever you want).
+  The module will be called pvr2fb.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+  You can pass several parameters to the driver at boot time or at
+  module load time.  The parameters look like "video=pvr2:XXX", where
+  the meaning of XXX can be found at the end of the main source file
+  (<file:drivers/video/pvr2fb.c>). Please see the file
+  <file:Documentation/fb/pvr2fb.txt>.
+
+Debug pvr2fb
+CONFIG_FB_PVR2_DEBUG
+  Say Y here if you wish for the pvr2fb driver to print out debugging
+  messages. Most people will want to say N here. If unsure, you will
+  also want to say N.
+
+Matrox unified accelerated driver
+CONFIG_FB_MATROX
+  Say Y here if you have a Matrox Millennium, Millennium II, Mystique,
+  Mystique 220, Productiva G100, Mystique G200, Millennium G200,
+  Matrox G400, G450 or G550 card in your box. At this time, support for 
+  the G-series digital output is almost non-existant.
+
+  This driver is also available as a module ( = code which can be
+  inserted and removed from the running kernel whenever you want).
+  The module will be called matroxfb.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+  You can pass several parameters to the driver at boot time or at
+  module load time. The parameters look like "video=matrox:XXX", and
+  are described in <file:Documentation/fb/matroxfb.txt>.
+
+Matrox Millennium I/II support
+CONFIG_FB_MATROX_MILLENIUM
+  Say Y here if you have a Matrox Millennium or Matrox Millennium II
+  video card. If you select "Advanced lowlevel driver options" below,
+  you should check 4 bpp packed pixel, 8 bpp packed pixel, 16 bpp
+  packed pixel, 24 bpp packed pixel and 32 bpp packed pixel. You can
+  also use font widths different from 8.
+
+Matrox Mystique support
+CONFIG_FB_MATROX_MYSTIQUE
+  Say Y here if you have a Matrox Mystique or Matrox Mystique 220
+  video card. If you select "Advanced lowlevel driver options" below,
+  you should check 8 bpp packed pixel, 16 bpp packed pixel, 24 bpp
+  packed pixel and 32 bpp packed pixel. You can also use font widths
+  different from 8.
+
+CONFIG_FB_MATROX_G450
+  Say Y here if you have a Matrox G100, G200, G400, G450 or G550 based
+  video card. If you select "Advanced lowlevel driver options", you
+  should check 8 bpp packed pixel, 16 bpp packed pixel, 24 bpp packed
+  pixel and 32 bpp packed pixel. You can also use font widths
+  different from 8.
+
+  If you need support for G400 secondary head, you must first say Y to
+  "I2C support" and "I2C bit-banging support" in the character devices
+  section, and then to "Matrox I2C support" and "G400 second head
+  support" here in the framebuffer section. G450/G550 secondary head
+  and digital output are supported without additional modules.
+  
+  The driver starts in monitor mode. You must use the matroxset tool 
+  (available at <ftp://platan.vc.cvut.cz/pub/linux/matrox-latest/>) to 
+  swap primary and secondary head outputs, or to change output mode.  
+  Secondary head driver always start in 640x480 resolution and you 
+  must use fbset to change it.
+
+  Do not forget that second head supports only 16 and 32 bpp
+  packed pixels, so it is a good idea to compile them into the kernel
+  too. You can use only some font widths, as the driver uses generic
+  painting procedures (the secondary head does not use acceleration
+  engine).
+  
+  G450/G550 hardware can display TV picture only from secondary CRTC,
+  and it performs no scaling, so picture must have 525 or 625 lines.
+
+CONFIG_FB_MATROX_G100A
+  Say Y here if you have a Matrox G100, G200 or G400 based
+  video card. If you select "Advanced lowlevel driver options", you
+  should check 8 bpp packed pixel, 16 bpp packed pixel, 24 bpp packed
+  pixel and 32 bpp packed pixel. You can also use font widths
+  different from 8.
+
+  If you need support for G400 secondary head, you must first say Y to
+  "I2C support" and "I2C bit-banging support" in the character devices
+  section, and then to "Matrox I2C support" and "G400 second head
+  support" here in the framebuffer section.
+
+CONFIG_FB_MATROX_I2C
+  This drivers creates I2C buses which are needed for accessing the
+  DDC (I2C) bus present on all Matroxes, an I2C bus which
+  interconnects Matrox optional devices, like MGA-TVO on G200 and
+  G400, and the secondary head DDC bus, present on G400 only.
+
+  You can say Y or M here if you want to experiment with monitor
+  detection code. You must say Y or M here if you want to use either
+  second head of G400 or MGA-TVO on G200 or G400.
+
+  If you compile it as module, it will create a module named
+  i2c-matroxfb.o.
+
+Matrox G400 second head support
+CONFIG_FB_MATROX_MAVEN
+  WARNING !!! This support does not work with G450 !!!
+
+  Say Y or M here if you want to use a secondary head (meaning two
+  monitors in parallel) on G400 or MGA-TVO add-on on G200. Secondary
+  head is not compatible with accelerated XFree 3.3.x SVGA servers -
+  secondary head output is blanked while you are in X. With XFree
+  3.9.17 preview you can use both heads if you use SVGA over fbdev or
+  the fbdev driver on first head and the fbdev driver on second head.
+
+  If you compile it as module, two modules are created,
+  matroxfb_crtc2.o and matroxfb_maven.o. Matroxfb_maven is needed for
+  both G200 and G400, matroxfb_crtc2 is needed only by G400. You must
+  also load i2c-matroxfb to get it to run.
+
+  The driver starts in monitor mode and you must use the matroxset
+  tool (available at
+  <ftp://platan.vc.cvut.cz/pub/linux/matrox-latest/>) to switch it to
+  PAL or NTSC or to swap primary and secondary head outputs.
+  Secondary head driver also always start in 640x480 resolution, you
+  must use fbset to change it.
+
+  Also do not forget that second head supports only 16 and 32 bpp
+  packed pixels, so it is a good idea to compile them into the kernel
+  too.  You can use only some font widths, as the driver uses generic
+  painting procedures (the secondary head does not use acceleration
+  engine).
+
+CONFIG_FB_MATROX_PROC
+  Say Y or M here if you want to access some informations about driver
+  state through /proc interface.
+  
+  You should download matrox_pins tool (available at
+  <ftp://platan.vc.cvut.cz/pub/linux/matrox-latest/>) to get human
+  readable output.
+  
+CONFIG_FB_MATROX_MULTIHEAD
+  Say Y here if you have more than one (supported) Matrox device in
+  your computer and you want to use all of them for different monitors
+  ("multihead"). If you have only one device, you should say N because
+  the driver compiled with Y is larger and a bit slower, especially on
+  ia32 (ix86).
+
+  If you said M to "Matrox unified accelerated driver" and N here, you
+  will still be able to use several Matrox devices simultaneously:
+  insert several instances of the module matroxfb.o into the kernel
+  with insmod, supplying the parameter "dev=N" where N is 0, 1, etc.
+  for the different Matrox devices. This method is slightly faster but
+  uses 40 KB of kernel memory per Matrox card.
+
+  There is no need for enabling 'Matrox multihead support' if you have
+  only one Matrox card in the box.
+
+3Dfx Voodoo Graphics / Voodoo2 frame buffer support
+CONFIG_FB_VOODOO1
+  Say Y here if you have a 3Dfx Voodoo Graphics (Voodoo1/sst1) or 
+  Voodoo2 (cvg) based graphics card.
+
+  This driver is also available as a module ( = code which can be 
+  inserted and removed from the running kernel whenever you want).
+  The module will be called sstfb.o. If you want to compile it as
+  a module, say M here and read Documentation/modules.txt.
+
+  WARNING: Do not use any application that uses the 3D engine
+  (namely glide) while using this driver.
+  Please read the file Documentation/fb/README-sstfb.txt for supported
+  options and other important info  support.
+
+MDA text console (dual-headed)
+CONFIG_MDA_CONSOLE
+  Say Y here if you have an old MDA or monochrome Hercules graphics
+  adapter in your system acting as a second head ( = video card). You
+  will then be able to use two monitors with your Linux system. Do not
+  say Y here if your MDA card is the primary card in your system; the
+  normal VGA driver will handle it.
+
+  This driver is also available as a module ( = code which can be
+  inserted and removed from the running kernel whenever you want).
+  The module will be called mdacon.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+  If unsure, say N.
+
+SBUS and UPA framebuffers
+CONFIG_FB_SBUS
+  Say Y if you want support for SBUS or UPA based frame buffer device.
+
+Creator/Creator3D support
+CONFIG_FB_CREATOR
+  This is the frame buffer device driver for the Creator and Creator3D
+  graphics boards.
+
+CGsix (GX,TurboGX) support
+CONFIG_FB_CGSIX
+  This is the frame buffer device driver for the CGsix (GX, TurboGX)
+  frame buffer.
+
+BWtwo support
+CONFIG_FB_BWTWO
+  This is the frame buffer device driver for the BWtwo frame buffer.
+
+CGthree support
+CONFIG_FB_CGTHREE
+  This is the frame buffer device driver for the CGthree frame buffer.
+
+CGfourteen (SX) support
+CONFIG_FB_CGFOURTEEN
+  This is the frame buffer device driver for the CGfourteen frame
+  buffer on Desktop SPARCsystems with the SX graphics option.
+
+P9100 (Sparcbook 3 only) support
+CONFIG_FB_P9100
+  This is the frame buffer device driver for the P9100 card
+  supported on Sparcbook 3 machines.
+
+Leo (ZX) support
+CONFIG_FB_LEO
+  This is the frame buffer device driver for the SBUS-based Sun ZX
+  (leo) frame buffer cards.
+
+IGA 168x display support
+CONFIG_FB_IGA
+  This is the framebuffer device for the INTERGRAPHICS 1680 and
+  successor frame buffer cards.
+
+TCX (SS4/SS5 only) support
+CONFIG_FB_TCX
+  This is the frame buffer device driver for the TCX 24/8bit frame
+  buffer.
+
+HD64461 Frame Buffer support
+CONFIG_FB_HIT
+  This is the frame buffer device driver for the Hitachi HD64461 LCD
+  frame buffer card.
+
+SIS acceleration
+CONFIG_FB_SIS
+  This is the frame buffer device driver for the SiS 630 and 640 Super
+  Socket 7 UMA cards.  Specs available at <http://www.sis.com.tw/>.
+
+SIS 630/540/730 support
+CONFIG_FB_SIS_300
+  This is the frame buffer device driver for the SiS 630 and related
+  Super Socket 7 UMA cards.  Specs available at
+  <http://www.sis.com.tw/>.
+
+SIS 315H/315 support
+CONFIG_FB_SIS_315
+  This is the frame buffer device driver for the SiS 315 graphics
+  card.  Specs available at <http://www.sis.com.tw/>.
+
+IMS Twin Turbo display support
+CONFIG_FB_IMSTT
+  The IMS Twin Turbo is a PCI-based frame buffer card bundled with
+  many Macintosh and compatible computers.
+
+CONFIG_FB_TX3912
+  The TX3912 is a Toshiba RISC processor based on the MIPS 3900 core;
+  see <http://www.toshiba.com/taec/components/Generic/risc/tx3912.htm>.
+
+  Say Y here to enable kernel support for the on-board framebuffer.
+
+Virtual Frame Buffer support (ONLY FOR TESTING!)
+CONFIG_FB_VIRTUAL
+  This is a `virtual' frame buffer device. It operates on a chunk of
+  unswappable kernel memory instead of on the memory of a graphics
+  board. This means you cannot see any output sent to this frame
+  buffer device, while it does consume precious memory. The main use
+  of this frame buffer device is testing and debugging the frame
+  buffer subsystem. Do NOT enable it for normal systems! To protect
+  the innocent, it has to be enabled explicitly at boot time using the
+  kernel option `video=vfb:'.
+
+  This driver is also available as a module ( = code which can be
+  inserted and removed from the running kernel whenever you want). The
+  module will be called vfb.o. If you want to compile it as a module,
+  say M here and read <file:Documentation/modules.txt>.
+
+  If unsure, say N.
+
+Mach64 CT/VT/GT/LT (incl. 3D RAGE) support
+CONFIG_FB_ATY_CT
+  Say Y here to support use of ATI's 64-bit Rage boards (or other
+  boards based on the Mach64 CT, VT, GT, and LT chipsets) as a
+  framebuffer device.  The ATI product support page for these boards
+  is at <http://support.ati.com/products/pc/mach64/>.
+
+Sony Vaio Picturebook laptop LCD panel support
+CONFIG_FB_ATY_CT_VAIO_LCD
+  Say Y here if you want to use the full width of the Sony Vaio 
+  Picturebook laptops LCD panels (you will get a 128x30 console).
+
+  Note that you need to activate this mode using the 'vga=0x301'
+  option from your boot loader (lilo or loadlin).  See the
+  documentation of your boot loader about how to pass options to the
+  kernel.
+  
+Mach64 GX support
+CONFIG_FB_ATY_GX
+  Say Y here to support use of the ATI Mach64 Graphics Expression
+  board (or other boards based on the Mach64 GX chipset) as a
+  framebuffer device.  The ATI product support page for these boards
+  is at
+  <http://support.ati.com/products/pc/mach64/graphics_xpression.html>.
+
+ATI Radeon display support
+CONFIG_FB_RADEON
+  Choose this option if you want to use an ATI Radeon graphics card as
+  a framebuffer device.  There are both PCI and AGP versions.  You
+  don't need to choose this to run the Radeon in plain VGA mode.
+  There is a product page at
+  <http://www.ati.com/na/pages/products/pc/radeon32/index.html>.
+
+SA-1100 LCD support
+CONFIG_FB_SA1100
+  This is a framebuffer device for the SA-1100 LCD Controller.
+  See <http://www.linux-fbdev.org/> for information on framebuffer
+  devices.
+
+  If you plan to use the LCD display with your SA-1100 system, say
+  Y here.
+
+Advanced low level driver options
+CONFIG_FBCON_ADVANCED
+  The frame buffer console uses character drawing routines that are
+  tailored to the specific organization of pixels in the memory of
+  your graphics hardware. These are called the low level frame buffer
+  console drivers. Note that they are used for text console output
+  only; they are NOT needed for graphical applications.
+
+  If you say N here, the needed low level drivers are automatically
+  enabled, depending on what frame buffer devices you selected above.
+  This is recommended for most users.
+
+  If you say Y here, you have more fine-grained control over which low
+  level drivers are enabled. You can e.g. leave out low level drivers
+  for color depths you do not intend to use for text consoles.
+
+  Low level frame buffer console drivers can be modules ( = code which
+  can be inserted and removed from the running kernel whenever you
+  want). The modules will be called fbcon-*.o. If you want to compile
+  (some of) them as modules, read <file:Documentation/modules.txt>.
+
+  If unsure, say N.
+
+Monochrome support
+CONFIG_FBCON_MFB
+  This is the low level frame buffer console driver for monochrome
+  (2 colors) packed pixels.
+
+2 bpp packed pixels support
+CONFIG_FBCON_CFB2
+  This is the low level frame buffer console driver for 2 bits per
+  pixel (4 colors) packed pixels.
+
+4 bpp packed pixels support
+CONFIG_FBCON_CFB4
+  This is the low level frame buffer console driver for 4 bits per
+  pixel (16 colors) packed pixels.
+
+8 bpp packed pixels support
+CONFIG_FBCON_CFB8
+  This is the low level frame buffer console driver for 8 bits per
+  pixel (256 colors) packed pixels.
+
+16 bpp packed pixels support
+CONFIG_FBCON_CFB16
+  This is the low level frame buffer console driver for 15 or 16 bits
+  per pixel (32K or 64K colors, also known as `hicolor') packed
+  pixels.
+
+24 bpp packed pixels support
+CONFIG_FBCON_CFB24
+  This is the low level frame buffer console driver for 24 bits per
+  pixel (16M colors, also known as `truecolor') packed pixels. It is
+  NOT for `sparse' 32 bits per pixel mode.
+
+32 bpp packed pixels support
+CONFIG_FBCON_CFB32
+  This is the low level frame buffer console driver for 32 bits per
+  pixel (16M colors, also known as `truecolor') sparse packed pixels.
+
+Amiga bitplanes support
+CONFIG_FBCON_AFB
+  This is the low level frame buffer console driver for 1 to 8
+  bitplanes (2 to 256 colors) on Amiga.
+
+Amiga interleaved bitplanes support
+CONFIG_FBCON_ILBM
+  This is the low level frame buffer console driver for 1 to 8
+  interleaved bitplanes (2 to 256 colors) on Amiga.
+
+Atari interleaved bitplanes (2 planes) support
+CONFIG_FBCON_IPLAN2P2
+  This is the low level frame buffer console driver for 2 interleaved
+  bitplanes (4 colors) on Atari.
+
+Atari interleaved bitplanes (4 planes) support
+CONFIG_FBCON_IPLAN2P4
+  This is the low level frame buffer console driver for 4 interleaved
+  bitplanes (16 colors) on Atari.
+
+Atari interleaved bitplanes (8 planes) support
+CONFIG_FBCON_IPLAN2P8
+  This is the low level frame buffer console driver for 8 interleaved
+  bitplanes (256 colors) on Atari.
+
+Mac variable bpp packed pixels support
+CONFIG_FBCON_MAC
+  This is the low level frame buffer console driver for 1/2/4/8/16/32
+  bits per pixel packed pixels on Mac. It supports variable font
+  widths for low resolution screens.
+
+Permedia3 support (EXPERIMENTAL)
+CONFIG_FB_PM3
+  This is the frame buffer device driver for the 3DLabs Permedia3
+  chipset, used in Formac ProFormance III, 3DLabs Oxygen VX1 &
+  similar boards, 3DLabs Permedia3 Create!, Appian Jeronimo 2000
+  and maybe other boards.
+
+HGA monochrome support
+CONFIG_FBCON_HGA
+  This is the low level frame buffer console driver for Hercules mono
+  graphics cards.
+
+VGA characters/attributes support
+CONFIG_FBCON_VGA
+  This is the low level frame buffer console driver for VGA text mode;
+  it is used by frame buffer device drivers that support VGA text
+  mode.
+
+Parallel-port support
+CONFIG_PARPORT
+  If you want to use devices connected to your machine's parallel port
+  (the connector at the computer with 25 holes), e.g. printer, ZIP
+  drive, PLIP link (Parallel Line Internet Protocol is mainly used to
+  create a mini network by connecting the parallel ports of two local
+  machines) etc., then you need to say Y here; please read
+  <file:Documentation/parport.txt> and
+  <file:drivers/parport/BUGS-parport>.
+
+  For extensive information about drivers for many devices attaching
+  to the parallel port see <http://www.torque.net/linux-pp.html> on
+  the WWW.
+
+  It is possible to share a single parallel port among several devices
+  and it is safe to compile all the corresponding drivers into the
+  kernel.  If you want to compile parallel port support as a module
+  ( = code which can be inserted in and removed from the running
+  kernel whenever you want), say M here and read
+  <file:Documentation/modules.txt>.  The module will be called
+  parport.o.  If you have more than one parallel port and want to
+  specify which port and IRQ to be used by this driver at module load
+  time, take a look at <file:Documentation/parport.txt>.
+
+  If unsure, say Y.
+
+PC-style hardware
+CONFIG_PARPORT_PC
+  You should say Y here if you have a PC-style parallel port. All IBM
+  PC compatible computers and some Alphas have PC-style parallel
+  ports.
+
+  This code is also available as a module.  If you want to compile it
+  as a module ( = code which can be inserted in and removed from the
+  running kernel whenever you want), say M here and read
+  <file:Documentation/modules.txt>.  The module will be called
+  parport_pc.o.
+
+  If unsure, say Y.
+
+Parallel+serial PCI multi-IO card support
+CONFIG_PARPORT_SERIAL
+  This adds support for multi-IO PCI cards that have parallel and
+  serial ports.  You should say Y or M here.  If you say M, the module
+  will be called parport_serial.o.
+
+Use FIFO/DMA if available
+CONFIG_PARPORT_PC_FIFO
+  Many parallel port chipsets provide hardware that can speed up
+  printing. Say Y here if you want to take advantage of that.
+
+  As well as actually having a FIFO, or DMA capability, the kernel
+  will need to know which IRQ the parallel port has.  By default,
+  parallel port interrupts will not be used, and so neither will the
+  FIFO.  See <file:Documentation/parport.txt> to find out how to
+  specify which IRQ/DMA to use.
+
+SuperIO chipset support
+CONFIG_PARPORT_PC_SUPERIO
+  Saying Y here enables some probes for Super-IO chipsets in order to
+  find out things like base addresses, IRQ lines and DMA channels.  It
+  is safe to say N.
+
+Support for PCMCIA management for PC-style ports
+CONFIG_PARPORT_PC_PCMCIA
+  Say Y here if you need PCMCIA support for your PC-style parallel
+  ports. If unsure, say N.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  parport_cs.o
+
+Support foreign hardware
+CONFIG_PARPORT_OTHER
+  Say Y here if you want to be able to load driver modules to support
+  other non-standard types of parallel ports. This causes a
+  performance loss, so most people say N.
+
+Amiga built-in parallel port support
+CONFIG_PARPORT_AMIGA
+  Say Y here if you need support for the parallel port hardware on
+  Amiga machines. This code is also available as a module (say M),
+  called parport_amiga.o. If in doubt, saying N is the safe plan.
+
+Atari built-in parallel port support
+CONFIG_PARPORT_ATARI
+  Say Y here if you need support for the parallel port hardware on
+  Atari machines. This code is also available as a module (say M),
+  called parport_atari.o. If in doubt, saying N is the safe plan.
+
+Multiface III parallel port support
+CONFIG_PARPORT_MFC3
+  Say Y here if you need parallel port support for the MFC3 card.
+  This code is also available as a module (say M), called
+  parport_mfc3.o. If in doubt, saying N is the safe plan.
+
+Support IEEE 1284 status readback
+CONFIG_PRINTER_READBACK
+  If you have a device on your parallel port that support this
+  protocol, this option will allow the device to report its status. It
+  is safe to say Y.
+
+IEEE 1284 transfer modes
+CONFIG_PARPORT_1284
+  If you have a printer that supports status readback or device ID, or
+  want to use a device that uses enhanced parallel port transfer modes
+  such as EPP and ECP, say Y here to enable advanced IEEE 1284
+  transfer modes. Also say Y if you want device ID information to
+  appear in /proc/sys/dev/parport/*/autoprobe*. It is safe to say N.
+
+Enable loadable module support
+CONFIG_MODULES
+  Kernel modules are small pieces of compiled code which can be
+  inserted in or removed from the running kernel, using the programs
+  insmod and rmmod. This is described in the file
+  <file:Documentation/modules.txt>, including the fact that you have
+  to say "make modules" in order to compile the modules that you chose
+  during kernel configuration.  Modules can be device drivers, file
+  systems, binary executable formats, and so on. If you think that you
+  may want to make use of modules with this kernel in the future, then
+  say Y here.  If unsure, say Y.
+
+Set version information on all symbols for modules
+CONFIG_MODVERSIONS
+  Usually, modules have to be recompiled whenever you switch to a new
+  kernel.  Saying Y here makes it possible, and safe, to use the
+  same modules even after compiling a new kernel; this requires the
+  program modprobe. All the software needed for module support is in
+  the modutils package (check the file <file:Documentation/Changes>
+  for location and latest version).  NOTE: if you say Y here but don't
+  have the program genksyms (which is also contained in the above
+  mentioned modutils package), then the building of your kernel will
+  fail.  If you are going to use modules that are generated from
+  non-kernel sources, you would benefit from this option.  Otherwise
+  it's not that important.  So, N ought to be a safe bet.
+
+Kernel module loader support
+CONFIG_KMOD
+  Normally when you have selected some drivers and/or file systems to
+  be created as loadable modules, you also have the responsibility to
+  load the corresponding modules (using the programs insmod or
+  modprobe) before you can use them. If you say Y here however, the
+  kernel will be able to load modules for itself: when a part of the
+  kernel needs a module, it runs modprobe with the appropriate
+  arguments, thereby loading the module if it is available. (This is a
+  replacement for kerneld.) Say Y here and read about configuring it
+  in <file:Documentation/kmod.txt>.
+
+ARP daemon support
+CONFIG_ARPD
+  Normally, the kernel maintains an internal cache which maps IP
+  addresses to hardware addresses on the local network, so that
+  Ethernet/Token Ring/ etc. frames are sent to the proper address on
+  the physical networking layer. For small networks having a few
+  hundred directly connected hosts or less, keeping this address
+  resolution (ARP) cache inside the kernel works well. However,
+  maintaining an internal ARP cache does not work well for very large
+  switched networks, and will use a lot of kernel memory if TCP/IP
+  connections are made to many machines on the network.
+
+  If you say Y here, the kernel's internal ARP cache will never grow
+  to more than 256 entries (the oldest entries are expired in a LIFO
+  manner) and communication will be attempted with the user space ARP
+  daemon arpd. Arpd then answers the address resolution request either
+  from its own cache or by asking the net.
+
+  This code is experimental and also obsolete. If you want to use it,
+  you need to find a version of the daemon arpd on the net somewhere,
+  and you should also say Y to "Kernel/User network link driver",
+  below. If unsure, say N.
+
+TCP/IP networking
+CONFIG_INET
+  These are the protocols used on the Internet and on most local
+  Ethernets. It is highly recommended to say Y here (this will enlarge
+  your kernel by about 144 KB), since some programs (e.g. the X window
+  system) use TCP/IP even if your machine is not connected to any
+  other computer. You will get the so-called loopback device which
+  allows you to ping yourself (great fun, that!).
+
+  For an excellent introduction to Linux networking, please read the
+  NET-3-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This option is also necessary if you want to use the full power of
+  term (term is a program which gives you almost full Internet
+  connectivity if you have a regular dial up shell account on some
+  Internet connected Unix computer; for more information, read
+  <http://www.bart.nl/~patrickr/term-howto/Term-HOWTO.html>).
+
+  If you say Y here and also to "/proc file system support" and
+  "Sysctl support" below, you can change various aspects of the
+  behaviour of the TCP/IP code by writing to the (virtual) files in
+  /proc/sys/net/ipv4/*; the options are explained in the file
+  <file:Documentation/networking/ip-sysctl.txt>.
+
+  Short answer: say Y.
+
+IP multicasting
+CONFIG_IP_MULTICAST
+  This is code for addressing several networked computers at once,
+  enlarging your kernel by about 2 KB. You need multicasting if you
+  intend to participate in the MBONE, a high bandwidth network on top
+  of the Internet which carries audio and video broadcasts. More
+  information about the MBONE is on the WWW at
+  <http://www-itg.lbl.gov/mbone/>. Information about the multicast
+  capabilities of the various network cards is contained in
+  <file:Documentation/networking/multicast.txt>. For most people, it's
+  safe to say N.
+
+Advanced router
+CONFIG_IP_ADVANCED_ROUTER
+  If you intend to run your Linux box mostly as a router, i.e. as a
+  computer that forwards and redistributes network packets, say Y; you
+  will then be presented with several options that allow more precise
+  control about the routing process.
+
+  The answer to this question won't directly affect the kernel:
+  answering N will just cause the configurator to skip all the
+  questions about advanced routing.
+
+  Note that your box can only act as a router if you enable IP
+  forwarding in your kernel; you can do that by saying Y to "/proc
+  file system support" and "Sysctl support" below and executing the
+  line
+
+    echo "1" > /proc/sys/net/ipv4/ip_forward
+
+  at boot time after the /proc file system has been mounted.
+
+  If you turn on IP forwarding, you will also get the rp_filter, which
+  automatically rejects incoming packets if the routing table entry
+  for their source address doesn't match the network interface they're
+  arriving on. This has security advantages because it prevents the
+  so-called IP spoofing, however it can pose problems if you use
+  asymmetric routing (packets from you to a host take a different path
+  than packets from that host to you) or if you operate a non-routing
+  host which has several IP addresses on different interfaces. To turn
+  rp_filter off use:
+
+        echo 0 > /proc/sys/net/ipv4/conf/<device>/rp_filter
+  or
+        echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
+
+  If unsure, say N here.
+
+Policy routing
+CONFIG_IP_MULTIPLE_TABLES
+  Normally, a router decides what to do with a received packet based
+  solely on the packet's final destination address. If you say Y here,
+  the Linux router will also be able to take the packet's source
+  address into account. Furthermore, if you also say Y to "Use TOS
+  value as routing key" below, the TOS (Type-Of-Service) field of the
+  packet can be used for routing decisions as well. In addition, if
+  you say Y here and to "Fast network address translation" below,
+  the router will also be able to modify source and destination
+  addresses of forwarded packets.
+
+  If you are interested in this, please see the preliminary
+  documentation at <http://www.compendium.com.ar/policy-routing.txt>
+  and <ftp://post.tepkom.ru/pub/vol2/Linux/docs/advanced-routing.tex>.
+  You will need supporting software from
+  <ftp://ftp.inr.ac.ru/ip-routing/>.
+
+  If unsure, say N.
+
+Equal cost multipath
+CONFIG_IP_ROUTE_MULTIPATH
+  Normally, the routing tables specify a single action to be taken in
+  a deterministic manner for a given packet. If you say Y here
+  however, it becomes possible to attach several actions to a packet
+  pattern, in effect specifying several alternative paths to travel
+  for those packets. The router considers all these paths to be of
+  equal "cost" and chooses one of them in a non-deterministic fashion
+  if a matching packet arrives.
+
+Use TOS value as routing key
+CONFIG_IP_ROUTE_TOS
+  The header of every IP packet carries a TOS (Type Of Service) value
+  with which the packet requests a certain treatment, e.g. low
+  latency (for interactive traffic), high throughput, or high
+  reliability.  If you say Y here, you will be able to specify
+  different routes for packets with different TOS values.
+
+Use netfilter MARK value as routing key
+CONFIG_IP_ROUTE_FWMARK
+  If you say Y here, you will be able to specify different routes for
+  packets with different mark values (see iptables(8), MARK target).
+
+Verbose route monitoring
+CONFIG_IP_ROUTE_VERBOSE
+  If you say Y here, which is recommended, then the kernel will print
+  verbose messages regarding the routing, for example warnings about
+  received packets which look strange and could be evidence of an
+  attack or a misconfigured system somewhere. The information is
+  handled by the klogd daemon which is responsible for kernel messages
+  ("man klogd").
+
+Fast network address translation
+CONFIG_IP_ROUTE_NAT
+  If you say Y here, your router will be able to modify source and
+  destination addresses of packets that pass through it, in a manner
+  you specify.  General information about Network Address Translation
+  can be gotten from the document
+  <http://www.csn.tu-chemnitz.de/~mha/linux-ip-nat/diplom/nat.html>.
+
+Kernel level IP autoconfiguration
+CONFIG_IP_PNP
+  This enables automatic configuration of IP addresses of devices and
+  of the routing table during kernel boot, based on either information
+  supplied on the kernel command line or by BOOTP or RARP protocols.
+  You need to say Y only for diskless machines requiring network
+  access to boot (in which case you want to say Y to "Root file system
+  on NFS" as well), because all other machines configure the network
+  in their startup scripts.
+
+BOOTP support
+CONFIG_IP_PNP_BOOTP
+  If you want your Linux box to mount its whole root file system (the
+  one containing the directory /) from some other computer over the
+  net via NFS and you want the IP address of your computer to be
+  discovered automatically at boot time using the BOOTP protocol (a
+  special protocol designed for doing this job), say Y here. In case
+  the boot ROM of your network card was designed for booting Linux and
+  does BOOTP itself, providing all necessary information on the kernel
+  command line, you can say N here. If unsure, say Y. Note that if you
+  want to use BOOTP, a BOOTP server must be operating on your network.
+  Read <file:Documentation/nfsroot.txt> for details.
+
+DHCP support
+CONFIG_IP_PNP_DHCP
+  If you want your Linux box to mount its whole root file system (the
+  one containing the directory /) from some other computer over the
+  net via NFS and you want the IP address of your computer to be
+  discovered automatically at boot time using the DHCP protocol (a
+  special protocol designed for doing this job), say Y here. In case
+  the boot ROM of your network card was designed for booting Linux and
+  does DHCP itself, providing all necessary information on the kernel
+  command line, you can say N here.
+
+  If unsure, say Y. Note that if you want to use DHCP, a DHCP server
+  must be operating on your network.  Read
+  <file:Documentation/nfsroot.txt> for details.
+
+RARP support
+CONFIG_IP_PNP_RARP
+  If you want your Linux box to mount its whole root file system (the
+  one containing the directory /) from some other computer over the
+  net via NFS and you want the IP address of your computer to be
+  discovered automatically at boot time using the RARP protocol (an
+  older protocol which is being obsoleted by BOOTP and DHCP), say Y
+  here. Note that if you want to use RARP, a RARP server must be
+  operating on your network. Read <file:Documentation/nfsroot.txt> for
+  details.
+
+IP tunneling
+CONFIG_NET_IPIP
+  Tunneling means encapsulating data of one protocol type within
+  another protocol and sending it over a channel that understands the
+  encapsulating protocol. This particular tunneling driver implements
+  encapsulation of IP within IP, which sounds kind of pointless, but
+  can be useful if you want to make your (or some other) machine
+  appear on a different network than it physically is, or to use
+  mobile-IP facilities (allowing laptops to seamlessly move between
+  networks without changing their IP addresses; check out
+  <http://anchor.cs.binghamton.edu/~mobileip/LJ/index.html>).
+
+  Saying Y to this option will produce two modules ( = code which can
+  be inserted in and removed from the running kernel whenever you
+  want). Most people won't need this and can say N.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  ipip.o
+
+GRE tunnels over IP
+CONFIG_NET_IPGRE
+  Tunneling means encapsulating data of one protocol type within
+  another protocol and sending it over a channel that understands the
+  encapsulating protocol. This particular tunneling driver implements
+  GRE (Generic Routing Encapsulation) and at this time allows
+  encapsulating of IPv4 or IPv6 over existing IPv4 infrastructure.
+  This driver is useful if the other endpoint is a Cisco router: Cisco
+  likes GRE much better than the other Linux tunneling driver ("IP
+  tunneling" above). In addition, GRE allows multicast redistribution
+  through the tunnel.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  ip_gre.o
+
+Broadcast GRE over IP
+CONFIG_NET_IPGRE_BROADCAST
+  One application of GRE/IP is to construct a broadcast WAN (Wide Area
+  Network), which looks like a normal Ethernet LAN (Local Area
+  Network), but can be distributed all over the Internet. If you want
+  to do that, say Y here and to "IP multicast routing" below.
+
+IP multicast routing
+CONFIG_IP_MROUTE
+  This is used if you want your machine to act as a router for IP
+  packets that have several destination addresses. It is needed on the
+  MBONE, a high bandwidth network on top of the Internet which carries
+  audio and video broadcasts. In order to do that, you would most
+  likely run the program mrouted. Information about the multicast
+  capabilities of the various network cards is contained in
+  <file:Documentation/networking/multicast.txt>. If you haven't heard
+  about it, you don't need it.
+
+PIM-SM version 1 support
+CONFIG_IP_PIMSM_V1
+  Kernel side support for Sparse Mode PIM (Protocol Independent
+  Multicast) version 1. This multicast routing protocol is used widely
+  because Cisco supports it. You need special software to use it
+  (pimd-v1). Please see <http://netweb.usc.edu/pim/> for more
+  information about PIM.
+
+  Say Y if you want to use PIM-SM v1. Note that you can say N here if
+  you just want to use Dense Mode PIM.
+
+PIM-SM version 2 support
+CONFIG_IP_PIMSM_V2
+  Kernel side support for Sparse Mode PIM version 2. In order to use
+  this, you need an experimental routing daemon supporting it (pimd or
+  gated-5). This routing protocol is not used widely, so say N unless
+  you want to play with it.
+
+Unix domain sockets
+CONFIG_UNIX
+  If you say Y here, you will include support for Unix domain sockets;
+  sockets are the standard Unix mechanism for establishing and
+  accessing network connections.  Many commonly used programs such as
+  the X Window system and syslog use these sockets even if your
+  machine is not connected to any network.  Unless you are working on
+  an embedded system or something similar, you therefore definitely
+  want to say Y here.
+
+  However, the socket support is also available as a module ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>. The module will be
+  called unix.o.  If you try building this as a module and you have
+  said Y to "Kernel module loader support" above, be sure to add
+  'alias net-pf-1 unix' to your /etc/modules.conf file. Note that
+  several important services won't work correctly if you say M here
+  and then neglect to load the module.
+
+  Say Y unless you know what you are doing.
+
+The IPv6 protocol
+CONFIG_IPV6
+  This is experimental support for the next version of the Internet
+  Protocol: IP version 6 (also called IPng "IP next generation").
+  Features of this new protocol include: expanded address space,
+  authentication and privacy, and seamless interoperability with the
+  current version of IP (IP version 4). For general information about
+  IPv6, see <http://playground.sun.com/pub/ipng/html/ipng-main.html>;
+  for specific information about IPv6 under Linux read the HOWTO at
+  <http://www.bieringer.de/linux/IPv6/> and the file net/ipv6/README
+  in the kernel source.
+
+  If you want to use IPv6, please upgrade to the newest net-tools as
+  given in <file:Documentation/Changes>. You will still be able to do
+  regular IPv4 networking as well.
+
+  This protocol support is also available as a module ( = code which
+  can be inserted in and removed from the running kernel whenever you
+  want). The module will be called ipv6.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+  It is safe to say N here for now.
+
+Kernel httpd acceleration
+CONFIG_KHTTPD
+  The kernel httpd acceleration daemon (kHTTPd) is a (limited) web
+  server built into the kernel. It is limited since it can only serve
+  files from the file system and cannot deal with executable content
+  such as CGI scripts. Serving files is sped up if you use kHTTPd.
+  If kHTTPd is not able to fulfill a request, it can transparently
+  pass it through to a user space web server such as apache.
+
+  Saying "M" here builds the kHTTPd module; this is NOT enough to have
+  a working kHTTPd. For safety reasons, the module has to be activated
+  by doing a "echo 1 > /proc/sys/net/khttpd/start" after inserting the
+  module.
+
+  Before using this, read the README in net/khttpd !
+
+  The kHTTPd is experimental. Be careful when using it on a production
+  machine. Also note that kHTTPd doesn't support virtual servers yet.
+
+The IPX protocol
+CONFIG_IPX
+  This is support for the Novell networking protocol, IPX, commonly
+  used for local networks of Windows machines.  You need it if you
+  want to access Novell NetWare file or print servers using the Linux
+  Novell client ncpfs (available from
+  <ftp://platan.vc.cvut.cz/pub/linux/ncpfs/>) or from
+  within the Linux DOS emulator DOSEMU (read the DOSEMU-HOWTO,
+  available from <http://www.tldp.org/docs.html#howto>).  In order
+  to do the former, you'll also have to say Y to "NCP file system
+  support", below.
+
+  IPX is similar in scope to IP, while SPX, which runs on top of IPX,
+  is similar to TCP. There is also experimental support for SPX in
+  Linux (see "SPX networking", below).
+
+  To turn your Linux box into a fully featured NetWare file server and
+  IPX router, say Y here and fetch either lwared from
+  <ftp://ibiblio.org/pub/Linux/system/network/daemons/> or
+  mars_nwe from <ftp://www.compu-art.de/mars_nwe/>. For more
+  information, read the IPX-HOWTO available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  General information about how to connect Linux, Windows machines and
+  Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>.
+
+  The IPX driver would enlarge your kernel by about 16 KB. This driver
+  is also available as a module ( = code which can be inserted in and
+  removed from the running kernel whenever you want).  The module will
+  be called ipx.o.  If you want to compile it as a module, say M here
+  and read <file:Documentation/modules.txt>.  Unless you want to
+  integrate your Linux box with a local Novell network, say N.
+
+Full internal IPX network
+CONFIG_IPX_INTERN
+  Every IPX network has an address that identifies it. Sometimes it is
+  useful to give an IPX "network" address to your Linux box as well
+  (for example if your box is acting as a file server for different
+  IPX networks: it will then be accessible from everywhere using the
+  same address). The way this is done is to create a virtual internal
+  "network" inside your box and to assign an IPX address to this
+  network. Say Y here if you want to do this; read the IPX-HOWTO at
+  <http://www.tldp.org/docs.html#howto> for details.
+
+  The full internal IPX network enables you to allocate sockets on
+  different virtual nodes of the internal network. This is done by
+  evaluating the field sipx_node of the socket address given to the
+  bind call. So applications should always initialize the node field
+  to 0 when binding a socket on the primary network. In this case the
+  socket is assigned the default node that has been given to the
+  kernel when the internal network was created. By enabling the full
+  internal IPX network the cross-forwarding of packets targeted at
+  'special' sockets to sockets listening on the primary network is
+  disabled. This might break existing applications, especially RIP/SAP
+  daemons. A RIP/SAP daemon that works well with the full internal net
+  can be found on <ftp://ftp.gwdg.de/pub/linux/misc/ncpfs/>.
+
+  If you don't know what you are doing, say N.
+
+#(We're told this will come back someday)
+
+SPX networking
+CONFIG_SPX
+  * Orphaned entry retained 20 April 2001 by Petr Vandrovec     *
+  * If you read this note from the configurator, please contact *
+  * the Configure.help maintainers.                             *
+  The Sequenced Packet eXchange protocol is a transport layer protocol
+  built on top of IPX. It is used in Novell NetWare systems for
+  client-server applications and is similar to TCP (which runs on top
+  of IP).
+
+  Note that Novell NetWare file sharing does not use SPX; it uses a
+  protocol called NCP, for which separate Linux support is available
+  ("NCP file system support" below for the client side, and the user
+  space programs lwared or mars_nwe for the server side).
+
+  Say Y here if you have use for SPX; read the IPX-HOWTO at
+  <http://www.tldp.org/docs.html#howto> for details.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called af_spx.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+DECnet networking
+CONFIG_DECNET
+  The DECnet networking protocol was used in many products made by
+  Digital (now Compaq).  It provides reliable stream and sequenced
+  packet communications over which run a variety of services similar
+  to those which run over TCP/IP.
+
+  To find some tools to use with the kernel layer support, please
+  look at Patrick Caulfield's web site:
+  <http://linux.dreamtime.org/decnet/>.
+
+  More detailed documentation is available in
+  <file:Documentation/networking/decnet.txt>.
+
+  Be sure to say Y to "/proc file system support" and "Sysctl support"
+  below when using DECnet, since you will need sysctl support to aid
+  in configuration at run time.
+
+  The DECnet code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called decnet.o.
+
+DECnet SIOCFIGCONF support
+CONFIG_DECNET_SIOCGIFCONF
+  This option should only be turned on if you are really sure that
+  you know what you are doing. It can break other applications which
+  use this system call and the proper way to get the information
+  provided by this call is to use rtnetlink.
+
+  If unsure, say N.
+
+DECnet router support
+CONFIG_DECNET_ROUTER
+  Add support for turning your DECnet Endnode into a level 1 or 2
+  router.  This is an unfinished option for developers only.  If you
+  do say Y here, then make sure that you also say Y to "Kernel/User
+  network link driver", "Routing messages" and "Network packet
+  filtering".  The first two are required to allow configuration via
+  rtnetlink (currently you need Alexey Kuznetsov's iproute2 package
+  from <ftp://ftp.inr.ac.ru/>). The "Network packet filtering" option
+  will be required for the forthcoming routing daemon to work.
+
+  See <file:Documentation/networking/decnet.txt> for more information.
+
+Use FWMARK value as DECnet routing key
+CONFIG_DECNET_ROUTE_FWMARK
+  If you say Y here, you will be able to specify different routes for
+  packets with different FWMARK ("firewalling mark") values
+  (see ipchains(8), "-m" argument).
+
+AppleTalk interfaces support
+CONFIG_DEV_APPLETALK
+  AppleTalk is the protocol that Apple computers can use to communicate
+  on a network.  If your Linux box is connected to such a network, and wish
+  to do IP over it, or you have a LocalTalk card and wish to use it to
+  connect to the AppleTalk network, say Y.
+
+AppleTalk protocol support
+CONFIG_ATALK
+  AppleTalk is the protocol that Apple computers can use to communicate
+  on a network.  If your Linux box is connected to such a network and you
+  wish to connect to it, say Y.  You will need to use the netatalk package
+  so that your Linux box can act as a print and file server for Macs as
+  well as access AppleTalk printers.  Check out
+  <http://www.zettabyte.net/netatalk/> on the WWW for details.
+  EtherTalk is the name used for AppleTalk over Ethernet and the
+  cheaper and slower LocalTalk is AppleTalk over a proprietary Apple
+  network using serial links.  EtherTalk and LocalTalk are fully
+  supported by Linux.
+
+  General information about how to connect Linux, Windows machines and
+  Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>.  The
+  NET-3-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>, contains valuable
+  information as well.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called appletalk.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.  You
+  almost certainly want to compile it as a module so you can restart
+  your AppleTalk stack without rebooting your machine.  I hear that
+  the GNU boycott of Apple is over, so even politically correct people
+  are allowed to say Y here.
+
+AppleTalk-IP driver support
+CONFIG_IPDDP
+  This allows IP networking for users who only have AppleTalk
+  networking available. This feature is experimental. With this
+  driver, you can encapsulate IP inside AppleTalk (e.g. if your Linux
+  box is stuck on an AppleTalk only network) or decapsulate (e.g. if
+  you want your Linux box to act as an Internet gateway for a zoo of
+  AppleTalk connected Macs). Please see the file
+  <file:Documentation/networking/ipddp.txt> for more information.
+
+  If you say Y here, the AppleTalk-IP support will be compiled into
+  the kernel. In this case, you can either use encapsulation or
+  decapsulation, but not both. With the following two questions, you
+  decide which one you want.
+
+  If you say M here, the AppleTalk-IP support will be compiled as a
+  module ( = code which can be inserted in and removed from the
+  running kernel whenever you want, read
+  <file:Documentation/modules.txt>).  The module is called ipddp.o.
+  In this case, you will be able to use both encapsulation and
+  decapsulation simultaneously, by loading two copies of the module
+  and specifying different values for the module option ipddp_mode.
+
+IP to AppleTalk-IP Encapsulation support
+CONFIG_IPDDP_ENCAP
+  If you say Y here, the AppleTalk-IP code will be able to encapsulate
+  IP packets inside AppleTalk frames; this is useful if your Linux box
+  is stuck on an AppleTalk network (which hopefully contains a
+  decapsulator somewhere). Please see
+  <file:Documentation/networking/ipddp.txt> for more information. If
+  you said Y to "AppleTalk-IP driver support" above and you say Y
+  here, then you cannot say Y to "AppleTalk-IP to IP Decapsulation
+  support", below.
+
+AppleTalk-IP to IP Decapsulation support
+CONFIG_IPDDP_DECAP
+  If you say Y here, the AppleTalk-IP code will be able to decapsulate
+  AppleTalk-IP frames to IP packets; this is useful if you want your
+  Linux box to act as an Internet gateway for an AppleTalk network.
+  Please see <file:Documentation/networking/ipddp.txt> for more
+  information.  If you said Y to "AppleTalk-IP driver support" above
+  and you say Y here, then you cannot say Y to "IP to AppleTalk-IP
+  Encapsulation support", above.
+
+Apple/Farallon LocalTalk PC card support
+CONFIG_LTPC
+  This allows you to use the AppleTalk PC card to connect to LocalTalk
+  networks. The card is also known as the Farallon PhoneNet PC card.
+  If you are in doubt, this card is the one with the 65C02 chip on it.
+  You also need version 1.3.3 or later of the netatalk package.
+  This driver is experimental, which means that it may not work.
+  See the file <file:Documentation/networking/ltpc.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  ltpc.o
+
+COPS LocalTalk PC card support
+CONFIG_COPS
+  This allows you to use COPS AppleTalk cards to connect to LocalTalk
+  networks. You also need version 1.3.3 or later of the netatalk
+  package. This driver is experimental, which means that it may not
+  work. This driver will only work if you choose "AppleTalk DDP"
+  networking support, above.
+  Please read the file <file:Documentation/networking/cops.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  cops.o
+
+Dayna firmware support
+CONFIG_COPS_DAYNA
+  Support COPS compatible cards with Dayna style firmware (Dayna
+  DL2000/ Daynatalk/PC (half length), COPS LT-95, Farallon PhoneNET PC
+  III, Farallon PhoneNET PC II).
+
+Tangent firmware support
+CONFIG_COPS_TANGENT
+  Support COPS compatible cards with Tangent style firmware (Tangent
+  ATB_II, Novell NL-1000, Daystar Digital LT-200.
+
+Amateur Radio support
+CONFIG_HAMRADIO
+  If you want to connect your Linux box to an amateur radio, answer Y
+  here. You want to read <http://www.tapr.org/tapr/html/pkthome.html> and
+  the AX25-HOWTO, available from <http://www.tldp.org/docs.html#howto>.
+
+  Note that the answer to this question won't directly affect the
+  kernel: saying N will just cause the configurator to skip all
+  the questions about amateur radio.
+
+Amateur Radio AX.25 Level 2 protocol
+CONFIG_AX25
+  This is the protocol used for computer communication over amateur
+  radio. It is either used by itself for point-to-point links, or to
+  carry other protocols such as tcp/ip. To use it, you need a device
+  that connects your Linux box to your amateur radio. You can either
+  use a low speed TNC (a Terminal Node Controller acts as a kind of
+  modem connecting your computer's serial port to your radio's
+  microphone input and speaker output) supporting the KISS protocol or
+  one of the various SCC cards that are supported by the generic Z8530
+  or the DMA SCC driver. Another option are the Baycom modem serial
+  and parallel port hacks or the sound card modem (supported by their
+  own drivers). If you say Y here, you also have to say Y to one of
+  those drivers.
+
+  Information about where to get supporting software for Linux amateur
+  radio as well as information about how to configure an AX.25 port is
+  contained in the AX25-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>. You might also want to
+  check out the file <file:Documentation/networking/ax25.txt> in the
+  kernel source. More information about digital amateur radio in
+  general is on the WWW at
+  <http://www.tapr.org/tapr/html/pkthome.html>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ax25.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+AX.25 DAMA Slave support
+CONFIG_AX25_DAMA_SLAVE
+  DAMA is a mechanism to prevent collisions when doing AX.25
+  networking. A DAMA server (called "master") accepts incoming traffic
+  from clients (called "slaves") and redistributes it to other slaves.
+  If you say Y here, your Linux box will act as a DAMA slave; this is
+  transparent in that you don't have to do any special DAMA
+  configuration. (Linux cannot yet act as a DAMA server.) If unsure,
+  say N.
+
+AX.25 DAMA Master support
+CONFIG_AX25_DAMA_MASTER
+  DAMA is a mechanism to prevent collisions when doing AX.25
+  networking. A DAMA server (called "master") accepts incoming traffic
+  from clients (called "slaves") and redistributes it to other
+  slaves. If you say Y here, your Linux box will act as a DAMA server.
+  If unsure, say N.
+
+Amateur Radio NET/ROM support
+CONFIG_NETROM
+  NET/ROM is a network layer protocol on top of AX.25 useful for
+  routing.
+
+  A comprehensive listing of all the software for Linux amateur radio
+  users as well as information about how to configure an AX.25 port is
+  contained in the AX25-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>. You also might want to
+  check out the file <file:Documentation/networking/ax25.txt>. More
+  information about digital amateur radio in general is on the WWW at
+  <http://www.tapr.org/tapr/html/pkthome.html>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called netrom.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Amateur Radio X.25 PLP (Rose)
+CONFIG_ROSE
+  The Packet Layer Protocol (PLP) is a way to route packets over X.25
+  connections in general and amateur radio AX.25 connections in
+  particular, essentially an alternative to NET/ROM.
+
+  A comprehensive listing of all the software for Linux amateur radio
+  users as well as information about how to configure an AX.25 port is
+  contained in the AX25-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.  You also might want to
+  check out the file <file:Documentation/networking/ax25.txt>. More
+  information about digital amateur radio in general is on the WWW at
+  <http://www.tapr.org/tapr/html/pkthome.html>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called rose.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Serial port KISS driver for AX.25
+CONFIG_MKISS
+  KISS is a protocol used for the exchange of data between a computer
+  and a Terminal Node Controller (a small embedded system commonly
+  used for networking over AX.25 amateur radio connections; it
+  connects the computer's serial port with the radio's microphone
+  input and speaker output).
+
+  Although KISS is less advanced than the 6pack protocol, it has
+  the advantage that it is already supported by most modern TNCs
+  without the need for a firmware upgrade.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called mkiss.o.
+
+Serial port 6PACK driver for AX.25
+CONFIG_6PACK
+  6pack is a transmission protocol for the data exchange between your
+  PC and your TNC (the Terminal Node Controller acts as a kind of
+  modem connecting your computer's serial port to your radio's
+  microphone input and speaker output). This protocol can be used as
+  an alternative to KISS for networking over AX.25 amateur radio
+  connections, but it has some extended functionality.
+
+  Note that this driver is still experimental and might cause
+  problems. For details about the features and the usage of the
+  driver, read <file:Documentation/networking/6pack.txt>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called 6pack.o.
+
+BPQ Ethernet driver
+CONFIG_BPQETHER
+  AX.25 is the protocol used for computer communication over amateur
+  radio. If you say Y here, you will be able to send and receive AX.25
+  traffic over Ethernet (also called "BPQ AX.25"), which could be
+  useful if some other computer on your local network has a direct
+  amateur radio connection.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called bpqether.o.
+
+High-speed (DMA) SCC driver for AX.25
+CONFIG_DMASCC
+  This is a driver for high-speed SCC boards, i.e. those supporting
+  DMA on one port. You usually use those boards to connect your
+  computer to an amateur radio modem (such as the WA4DSY 56kbps
+  modem), in order to send and receive AX.25 packet radio network
+  traffic.
+
+  Currently, this driver supports Ottawa PI/PI2, Paccomm/Gracilis
+  PackeTwin, and S5SCC/DMA boards. They are detected automatically.
+  If you have one of these cards, say Y here and read the AX25-HOWTO,
+  available from <http://www.tldp.org/docs.html#howto>.
+
+  This driver can operate multiple boards simultaneously. If you
+  compile it as a module (by saying M instead of Y), it will be called
+  dmascc.o. If you don't pass any parameter to the driver, all
+  possible I/O addresses are probed. This could irritate other devices
+  that are currently not in use. You may specify the list of addresses
+  to be probed by "dmascc=addr1,addr2,..." (when compiled into the
+  kernel image) or "io=addr1,addr2,..." (when loaded as a module). The
+  network interfaces will be called dmascc0 and dmascc1 for the board
+  detected first, dmascc2 and dmascc3 for the second one, and so on.
+
+  Before you configure each interface with ifconfig, you MUST set
+  certain parameters, such as channel access timing, clock mode, and
+  DMA channel. This is accomplished with a small utility program,
+  dmascc_cfg, available at
+  <http://www.nt.tuwien.ac.at/~kkudielk/Linux/>. Please be sure to get
+  at least version 1.27 of dmascc_cfg, as older versions will not
+  work with the current driver.
+
+Z8530 SCC driver for AX.25
+CONFIG_SCC
+  These cards are used to connect your Linux box to an amateur radio
+  in order to communicate with other computers. If you want to use
+  this, read <file:Documentation/networking/z8530drv.txt> and the
+  AX25-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>. Also make sure to say Y
+  to "Amateur Radio AX.25 Level 2" support.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called scc.o.
+
+Support for TRX that feedback the tx signal to rx
+CONFIG_SCC_TRXECHO
+  Some transmitters feed the transmitted signal back to the receive
+  line.  Say Y here to foil this by explicitly disabling the receiver
+  during data transmission.  If in doubt, say Y.
+
+Additional delay for PA0HZP OptoSCC compatible boards
+CONFIG_SCC_DELAY
+  Say Y here if you experience problems with the SCC driver not
+  working properly; please read
+  <file:Documentation/networking/z8530drv.txt> for details. If unsure,
+  say N.
+
+YAM driver for AX.25
+CONFIG_YAM
+  The YAM is a modem for packet radio which connects to the serial
+  port and includes some of the functions of a Terminal Node
+  Controller. If you have one of those, say Y here.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called yam.o.
+
+BAYCOM picpar and par96 driver for AX.25
+CONFIG_BAYCOM_PAR
+  This is a driver for Baycom style simple amateur radio modems that
+  connect to a parallel interface. The driver supports the picpar and
+  par96 designs. To configure the driver, use the sethdlc utility
+  available in the standard ax25 utilities package. For information on
+  the modems, see <http://www.baycom.de/> and the file
+  <file:Documentation/networking/baycom.txt>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called baycom_par.o.
+
+BAYCOM EPP driver for AX.25
+CONFIG_BAYCOM_EPP
+  This is a driver for Baycom style simple amateur radio modems that
+  connect to a parallel interface. The driver supports the EPP
+  designs. To configure the driver, use the sethdlc utility available
+  in the standard ax25 utilities package. For information on the
+  modems, see <http://www.baycom.de/> and the file
+  <file:Documentation/networking/baycom.txt>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called baycom_par.o.
+
+BAYCOM ser12 full-duplex driver for AX.25
+CONFIG_BAYCOM_SER_FDX
+  This is one of two drivers for Baycom style simple amateur radio
+  modems that connect to a serial interface. The driver supports the
+  ser12 design in full-duplex mode. In addition, it allows the
+  baudrate to be set between 300 and 4800 baud (however not all modems
+  support all baudrates). This is the preferred driver. The next
+  driver, "BAYCOM ser12 half-duplex driver for AX.25" is the old
+  driver and still provided in case this driver does not work with
+  your serial interface chip. To configure the driver, use the sethdlc
+  utility available in the standard ax25 utilities package. For
+  information on the modems, see <http://www.baycom.de/> and
+  <file:Documentation/networking/baycom.txt>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called baycom_ser_fdx.o.
+
+BAYCOM ser12 half-duplex driver for AX.25
+CONFIG_BAYCOM_SER_HDX
+  This is one of two drivers for Baycom style simple amateur radio
+  modems that connect to a serial interface. The driver supports the
+  ser12 design in full-duplex mode. This is the old driver.  It is
+  still provided in case your serial interface chip does not work with
+  the full-duplex driver. This driver is depreciated.  To configure
+  the driver, use the sethdlc utility available in the standard ax25
+  utilities package. For information on the modems, see
+  <http://www.baycom.de/> and
+  <file:Documentation/networking/baycom.txt>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called baycom_ser_hdx.o.
+
+Sound card modem driver for AX.25
+CONFIG_SOUNDMODEM
+  This experimental driver allows a standard Sound Blaster or
+  WindowsSoundSystem compatible sound card to be used as a packet
+  radio modem (NOT as a telephone modem!), to send digital traffic
+  over amateur radio.
+
+  To configure the driver, use the sethdlc, smdiag and smmixer
+  utilities available in the standard ax25 utilities package. For
+  information on how to key the transmitter, see
+  <http://www.ife.ee.ethz.ch/~sailer/pcf/ptt_circ/ptt.html> and
+  <file:Documentation/networking/soundmodem.txt>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called soundmodem.o.
+
+Sound card modem support for Sound Blaster and compatible cards
+CONFIG_SOUNDMODEM_SBC
+  This option enables the soundmodem driver to use Sound Blaster and
+  compatible cards. If you have a dual mode card (i.e. a WSS cards
+  with a Sound Blaster emulation) you should say N here and Y to
+  "Sound card modem support for WSS and Crystal cards", below, because
+  this usually results in better performance. This option also
+  supports SB16/32/64 in full-duplex mode.
+
+Sound card modem support for WSS and Crystal cards
+CONFIG_SOUNDMODEM_WSS
+  This option enables the soundmodem driver to use WindowsSoundSystem
+  compatible cards. These cards feature a codec chip from either
+  Analog Devices (such as AD1848, AD1845, AD1812) or Crystal
+  Semiconductors (such as CS4248, CS423x). This option also supports
+  the WSS full-duplex operation which currently works with Crystal
+  CS423x chips. If you don't need full-duplex operation, do not enable
+  it to save performance.
+
+Sound card modem support for 1200 baud AFSK modulation
+CONFIG_SOUNDMODEM_AFSK1200
+  This option enables the soundmodem driver 1200 baud AFSK modem,
+  compatible to popular modems using TCM3105 or AM7911. The
+  demodulator requires about 12% of the CPU power of a Pentium 75 CPU
+  per channel.
+
+Sound card modem support for 2400 baud AFSK modulation (7.3728MHz crystal)
+CONFIG_SOUNDMODEM_AFSK2400_7
+  This option enables the soundmodem driver 2400 baud AFSK modem,
+  compatible to TCM3105 modems (over-)clocked with a 7.3728MHz
+  crystal. Note that the availability of this driver does _not_ imply
+  that I recommend building such links. It is only here since users
+  especially in eastern Europe have asked me to do so. In fact this
+  modulation scheme has many disadvantages, mainly its incompatibility
+  with many transceiver designs and the fact that the TCM3105 (if
+  used) is operated widely outside its specifications.
+
+Sound card modem support for 2400 baud AFSK modulation (8MHz crystal)
+CONFIG_SOUNDMODEM_AFSK2400_8
+  This option enables the soundmodem driver 2400 baud AFSK modem,
+  compatible to TCM3105 modems (over-)clocked with an 8MHz crystal.
+  Note that the availability of this driver does _not_ imply that I
+  recommend building such links. It is only here since users
+  especially in eastern Europe have asked me to do so. In fact this
+  modulation scheme has many disadvantages, mainly its incompatibility
+  with many transceiver designs and the fact that the TCM3105 (if
+  used) is operated widely outside its specifications.
+
+Sound card modem support for 2666 baud AFSK modulation
+CONFIG_SOUNDMODEM_AFSK2666
+  This option enables the soundmodem driver 2666 baud AFSK modem.
+  This modem is experimental, and not compatible to anything
+  else I know of.
+
+Sound card modem support for 4800 baud 8PSK modulation
+CONFIG_SOUNDMODEM_PSK4800
+  This option enables the soundmodem driver 4800 baud 8PSK modem.
+  This modem is experimental, and not compatible to anything
+  else I know of.
+
+Sound card modem support for 4800 baud HAPN-1 modulation
+CONFIG_SOUNDMODEM_HAPN4800
+  This option enables the soundmodem driver 4800 baud HAPN-1
+  compatible modem. This modulation seems to be widely used 'down
+  under' and in the Netherlands. Here, nobody uses it, so I could not
+  test if it works. It is compatible to itself, however :-)
+
+Sound card modem support for 9600 baud FSK G3RUH modulation
+CONFIG_SOUNDMODEM_FSK9600
+  This option enables the soundmodem driver 9600 baud FSK modem,
+  compatible to the G3RUH standard. The demodulator requires about 4%
+  of the CPU power of a Pentium 75 CPU per channel. You can say Y to
+  both 1200 baud AFSK and 9600 baud FSK if you want (but obviously you
+  can only use one protocol at a time, depending on what the other end
+  can understand).
+
+CCITT X.25 Packet Layer
+CONFIG_X25
+  X.25 is a set of standardized network protocols, similar in scope to
+  frame relay; the one physical line from your box to the X.25 network
+  entry point can carry several logical point-to-point connections
+  (called "virtual circuits") to other computers connected to the X.25
+  network. Governments, banks, and other organizations tend to use it
+  to connect to each other or to form Wide Area Networks (WANs). Many
+  countries have public X.25 networks. X.25 consists of two
+  protocols: the higher level Packet Layer Protocol (PLP) (say Y here
+  if you want that) and the lower level data link layer protocol LAPB
+  (say Y to "LAPB Data Link Driver" below if you want that).
+
+  You can read more about X.25 at <http://www.sangoma.com/x25.htm> and
+  <http://www.cisco.com/univercd/data/doc/software/11_0/rpcg/cx25.htm>.
+  Information about X.25 for Linux is contained in the files
+  <file:Documentation/networking/x25.txt> and
+  <file:Documentation/networking/x25-iface.txt>.
+
+  One connects to an X.25 network either with a dedicated network card
+  using the X.21 protocol (not yet supported by Linux) or one can do
+  X.25 over a standard telephone line using an ordinary modem (say Y
+  to "X.25 async driver" below) or over Ethernet using an ordinary
+  Ethernet card and either the 802.2 LLC protocol (say Y to "802.2
+  LLC" below) or LAPB over Ethernet (say Y to "LAPB Data Link Driver"
+  and "LAPB over Ethernet driver" below).
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called x25.o. If unsure, say N.
+
+LAPB Data Link Driver
+CONFIG_LAPB
+  Link Access Procedure, Balanced (LAPB) is the data link layer (i.e.
+  the lower) part of the X.25 protocol. It offers a reliable
+  connection service to exchange data frames with one other host, and
+  it is used to transport higher level protocols (mostly X.25 Packet
+  Layer, the higher part of X.25, but others are possible as well).
+  Usually, LAPB is used with specialized X.21 network cards, but Linux
+  currently supports LAPB only over Ethernet connections. If you want
+  to use LAPB connections over Ethernet, say Y here and to "LAPB over
+  Ethernet driver" below. Read
+  <file:Documentation/networking/lapb-module.txt> for technical
+  details.
+
+  If you want to compile this driver as a module though ( = code which
+  can be inserted in and removed from the running kernel whenever you
+  want), say M here and read <file:Documentation/modules.txt>.  The
+  module will be called lapb.o.  If unsure, say N.
+
+802.2 LLC
+CONFIG_LLC
+  This is a Logical Link Layer protocol used for X.25 connections over
+  Ethernet, using ordinary Ethernet cards.
+
+Frame Diverter
+CONFIG_NET_DIVERT
+  The Frame Diverter allows you to divert packets from the
+  network, that are not aimed at the interface receiving it (in
+  promisc. mode). Typically, a Linux box setup as an Ethernet bridge
+  with the Frames Diverter on, can do some *really* transparent www
+  caching using a Squid proxy for example.
+
+  This is very useful when you don't want to change your router's
+  config (or if you simply don't have access to it).
+
+  The other possible usages of diverting Ethernet Frames are
+  numberous:
+   - reroute smtp traffic to another interface
+   - traffic-shape certain network streams
+   - transparently proxy smtp connections
+   - etc...
+
+  For more informations, please refer to:
+    <http://diverter.sourceforge.net/>
+    <http://perso.wanadoo.fr/magpie/EtherDivert.html>
+
+  If unsure, say N.
+
+802.1d Ethernet Bridging
+CONFIG_BRIDGE
+  If you say Y here, then your Linux box will be able to act as an
+  Ethernet bridge, which means that the different Ethernet segments it
+  is connected to will appear as one Ethernet to the participants.
+  Several such bridges can work together to create even larger
+  networks of Ethernets using the IEEE 802.1 spanning tree algorithm.
+  As this is a standard, Linux bridges will cooperate properly with
+  other third party bridge products.
+
+  In order to use the Ethernet bridge, you'll need the bridge
+  configuration tools; see <file:Documentation/networking/bridge.txt>
+  for location. Please read the Bridge mini-HOWTO for more
+  information.
+
+  Note that if your box acts as a bridge, it probably contains several
+  Ethernet devices, but the kernel is not able to recognize more than
+  one at boot time without help; for details read the Ethernet-HOWTO,
+  available from in <http://www.tldp.org/docs.html#howto>.
+
+  If you want to compile this code as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called bridge.o.
+
+  If unsure, say N.
+
+Packet socket
+CONFIG_PACKET
+  The Packet protocol is used by applications which communicate
+  directly with network devices without an intermediate network
+  protocol implemented in the kernel, e.g. tcpdump.  If you want them
+  to work, choose Y.
+
+  This driver is also available as a module called af_packet.o ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>; if you use modprobe
+  or kmod, you may also want to add "alias net-pf-17 af_packet" to
+  /etc/modules.conf.
+
+  If unsure, say Y.
+
+Packet socket: mmapped IO
+CONFIG_PACKET_MMAP
+  If you say Y here, the Packet protocol driver will use an IO
+  mechanism that results in faster communication.
+
+  If unsure, say N.
+
+Netlink device emulation
+CONFIG_NETLINK_DEV
+  This option will be removed soon. Any programs that want to use
+  character special nodes like /dev/tap0 or /dev/route (all with major
+  number 36) need this option, and need to be rewritten soon to use
+  the real netlink socket.
+  This is a backward compatibility option, choose Y for now.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  netlink_dev.o
+
+Asynchronous Transfer Mode (ATM)
+CONFIG_ATM
+  ATM is a high-speed networking technology for Local Area Networks
+  and Wide Area Networks.  It uses a fixed packet size and is
+  connection oriented, allowing for the negotiation of minimum
+  bandwidth requirements.
+
+  In order to participate in an ATM network, your Linux box needs an
+  ATM networking card. If you have that, say Y here and to the driver
+  of your ATM card below.
+
+  Note that you need a set of user-space programs to actually make use
+  of ATM.  See the file <file:Documentation/networking/atm.txt> for
+  further details.
+
+Classical IP over ATM
+CONFIG_ATM_CLIP
+  Classical IP over ATM for PVCs and SVCs, supporting InARP and
+  ATMARP. If you want to communication with other IP hosts on your ATM
+  network, you will typically either say Y here or to "LAN Emulation
+  (LANE)" below.
+
+Do NOT send ICMP if no neighbour
+CONFIG_ATM_CLIP_NO_ICMP
+  Normally, an "ICMP host unreachable" message is sent if a neighbour
+  cannot be reached because there is no VC to it in the kernel's
+  ATMARP table. This may cause problems when ATMARP table entries are
+  briefly removed during revalidation. If you say Y here, packets to
+  such neighbours are silently discarded instead.
+
+RFC1483/2684 Bridged protocols
+CONFIG_ATM_BR2684
+  ATM PVCs can carry ethernet PDUs according to rfc2684 (formerly 1483)
+  This device will act like an ethernet from the kernels point of view,
+  with the traffic being carried by ATM PVCs (currently 1 PVC/device).
+  This is sometimes used over DSL lines.  If in doubt, say N.
+
+Per-VC IP filter kludge
+CONFIG_ATM_BR2684_IPFILTER
+  This is an experimental mechanism for users who need to terminating a
+  large number of IP-only vcc's.  Do not enable this unless you are sure
+  you know what you are doing.
+
+LAN Emulation (LANE) support
+CONFIG_ATM_LANE
+  LAN Emulation emulates services of existing LANs across an ATM
+  network. Besides operating as a normal ATM end station client, Linux
+  LANE client can also act as an proxy client bridging packets between
+  ELAN and Ethernet segments. You need LANE if you want to try MPOA.
+
+Multi-Protocol Over ATM (MPOA) support
+CONFIG_ATM_MPOA
+  Multi-Protocol Over ATM allows ATM edge devices such as routers,
+  bridges and ATM attached hosts establish direct ATM VCs across
+  subnetwork boundaries. These shortcut connections bypass routers
+  enhancing overall network performance.
+
+ATM over TCP
+CONFIG_ATM_TCP
+  ATM over TCP driver. Useful mainly for development and for
+  experiments. If unsure, say N.
+
+Efficient Networks ENI155P
+CONFIG_ATM_ENI
+  Driver for the Efficient Networks ENI155p series and SMC ATM
+  Power155 155 Mbps ATM adapters. Both, the versions with 512KB and
+  2MB on-board RAM (Efficient calls them "C" and "S", respectively),
+  and the FPGA and the ASIC Tonga versions of the board are supported.
+  The driver works with MMF (-MF or ...F) and UTP-5 (-U5 or ...D)
+  adapters.
+
+  This driver is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called eni.o.
+
+Enable extended debugging
+CONFIG_ATM_ENI_DEBUG
+  Extended debugging records various events and displays that list
+  when an inconsistency is detected. This mechanism is faster than
+  generally using printks, but still has some impact on performance.
+  Note that extended debugging may create certain race conditions
+  itself. Enable this ONLY if you suspect problems with the driver.
+
+Fine-tune burst settings
+CONFIG_ATM_ENI_TUNE_BURST
+  In order to obtain good throughput, the ENI NIC can transfer
+  multiple words of data per PCI bus access cycle. Such a multi-word
+  transfer is called a burst.
+
+  The default settings for the burst sizes are suitable for most PCI
+  chipsets. However, in some cases, large bursts may overrun buffers
+  in the PCI chipset and cause data corruption. In such cases, large
+  bursts must be disabled and only (slower) small bursts can be used.
+  The burst sizes can be set independently in the send (TX) and
+  receive (RX) direction.
+
+  Note that enabling many different burst sizes in the same direction
+  may increase the cost of setting up a transfer such that the
+  resulting throughput is lower than when using only the largest
+  available burst size.
+
+  Also, sometimes larger bursts lead to lower throughput, e.g. on an
+  Intel 440FX board, a drop from 135 Mbps to 103 Mbps was observed
+  when going from 8W to 16W bursts.
+
+Enable 16W TX bursts (discouraged)
+CONFIG_ATM_ENI_BURST_TX_16W
+  Burst sixteen words at once in the send direction. This may work
+  with recent PCI chipsets, but is known to fail with older chipsets.
+
+Enable 8W TX bursts (recommended)
+CONFIG_ATM_ENI_BURST_TX_8W
+  Burst eight words at once in the send direction. This is the default
+  setting.
+
+Enable 4W TX bursts (optional)
+CONFIG_ATM_ENI_BURST_TX_4W
+  Burst four words at once in the send direction. You may want to try
+  this if you have disabled 8W bursts. Enabling 4W if 8W is also set
+  may or may not improve throughput.
+
+Enable 2W TX bursts (optional)
+CONFIG_ATM_ENI_BURST_TX_2W
+  Burst two words at once in the send direction. You may want to try
+  this if you have disabled 4W and 8W bursts. Enabling 2W if 4W or 8W
+  are also set may or may not improve throughput.
+
+Enable 16W RX bursts (discouraged)
+CONFIG_ATM_ENI_BURST_RX_16W
+  Burst sixteen words at once in the receive direction. This may work
+  with recent PCI chipsets, but is known to fail with older chipsets.
+
+Enable 8W RX bursts (discouraged)
+CONFIG_ATM_ENI_BURST_RX_8W
+  Burst eight words at once in the receive direction. This may work
+  with recent PCI chipsets, but is known to fail with older chipsets,
+  such as the Intel Neptune series.
+
+Enable 4W RX bursts (recommended)
+CONFIG_ATM_ENI_BURST_RX_4W
+  Burst four words at once in the receive direction. This is the
+  default setting. Enabling 4W if 8W is also set may or may not
+  improve throughput.
+
+Enable 2W RX bursts (optional)
+CONFIG_ATM_ENI_BURST_RX_2W
+  Burst two words at once in the receive direction. You may want to
+  try this if you have disabled 4W and 8W bursts. Enabling 2W if 4W or
+  8W are also set may or may not improve throughput.
+
+ZeitNet ZN1221/ZN1225
+CONFIG_ATM_ZATM
+  Driver for the ZeitNet ZN1221 (MMF) and ZN1225 (UTP-5) 155 Mbps ATM
+  adapters.
+
+  This driver is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called zatm.o.
+
+Enable extended debugging
+CONFIG_ATM_ZATM_DEBUG
+  Extended debugging records various events and displays that list
+  when an inconsistency is detected. This mechanism is faster than
+  generally using printks, but still has some impact on performance.
+  Note that extended debugging may create certain race conditions
+  itself. Enable this ONLY if you suspect problems with the driver.
+
+Fujitsu FireStream (FS50/FS155)
+CONFIG_ATM_FIRESTREAM
+  Driver for the Fujitsu FireStream 155 (MB86697) and
+  FireStream 50 (MB86695) ATM PCI chips.
+
+  This driver is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called
+  firestream.o.
+
+Enable usec resolution timestamps
+CONFIG_ATM_ZATM_EXACT_TS
+  The uPD98401 SAR chip supports a high-resolution timer (approx. 30
+  MHz) that is used for very accurate reception timestamps. Because
+  that timer overflows after 140 seconds, and also to avoid timer
+  drift, time measurements need to be periodically synchronized with
+  the normal system time. Enabling this feature will add some general
+  overhead for timer synchronization and also per-packet overhead for
+  time conversion.
+
+IDT 77201/11 (NICStAR) (ForeRunnerLE)
+CONFIG_ATM_NICSTAR
+  The NICStAR chipset family is used in a large number of ATM NICs for
+  25 and for 155 Mbps, including IDT cards and the Fore ForeRunnerLE
+  series. Say Y if you have one of those.
+
+  This driver is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  nicstar.o.
+
+Use suni PHY driver (155Mbps)
+CONFIG_ATM_NICSTAR_USE_SUNI
+  Support for the S-UNI and compatible PHYsical layer chips. These are
+  found in most 155Mbps NICStAR based ATM cards, namely in the
+  ForeRunner LE155 cards. This driver provides detection of cable~
+  removal and reinsertion and provides some statistics. This driver
+  doesn't have removal capability when compiled as a module, so if you
+  need that capability don't include S-UNI support (it's not needed to
+  make the card work).
+
+Use IDT77015 PHY driver (25Mbps)
+CONFIG_ATM_NICSTAR_USE_IDT77105
+  Support for the PHYsical layer chip in ForeRunner LE25 cards. In
+  addition to cable removal/reinsertion detection, this driver allows
+  you to control the loopback mode of the chip via a dedicated IOCTL.
+  This driver is required for proper handling of temporary carrier
+  loss, so if you have a 25Mbps NICStAR based ATM card you must say Y.
+
+IDT 77252 (NICStAR II)
+CONFIG_ATM_IDT77252
+  Driver for the IDT 77252 ATM PCI chips.
+
+  This driver is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called idt77252.o
+
+Enable debugging messages
+CONFIG_ATM_IDT77252_DEBUG
+  Somewhat useful debugging messages are available. The choice of
+  messages is controlled by a bitmap.  This may be specified as a
+  module argument.  See the file <file:drivers/atm/idt77252.h> for
+  the meanings of the bits in the mask.
+
+  When active, these messages can have a significant impact on the
+  speed of the driver, and the size of your syslog files! When
+  inactive, they will have only a modest impact on performance.
+
+Receive ALL cells in raw queue
+CONFIG_ATM_IDT77252_RCV_ALL
+  Enable receiving of all cells on the ATM link, that do not match
+  an open connection in the raw cell queue of the driver.  Useful
+  for debugging or special applications only, so the safe answer is N.
+
+Madge Ambassador (Collage PCI 155 Server)
+CONFIG_ATM_AMBASSADOR
+  This is a driver for ATMizer based ATM card produced by Madge
+  Networks Ltd. Say Y (or M to compile as a module named ambassador.o)
+  here if you have one of these cards.
+
+Enable debugging messages
+CONFIG_ATM_AMBASSADOR_DEBUG
+  Somewhat useful debugging messages are available. The choice of
+  messages is controlled by a bitmap.  This may be specified as a
+  module argument (kernel command line argument as well?), changed
+  dynamically using an ioctl (not yet) or changed by sending the
+  string "Dxxxx" to VCI 1023 (where x is a hex digit).  See the file
+  <file:drivers/atm/ambassador.h> for the meanings of the bits in the
+  mask.
+
+  When active, these messages can have a significant impact on the
+  speed of the driver, and the size of your syslog files! When
+  inactive, they will have only a modest impact on performance.
+
+Madge Horizon [Ultra] (Collage PCI 25 and Collage PCI 155 Client)
+CONFIG_ATM_HORIZON
+  This is a driver for the Horizon chipset ATM adapter cards once
+  produced by Madge Networks Ltd. Say Y (or M to compile as a module
+  named horizon.o) here if you have one of these cards.
+
+Enable debugging messages
+CONFIG_ATM_HORIZON_DEBUG
+  Somewhat useful debugging messages are available. The choice of
+  messages is controlled by a bitmap.  This may be specified as a
+  module argument (kernel command line argument as well?), changed
+  dynamically using an ioctl (not yet) or changed by sending the
+  string "Dxxxx" to VCI 1023 (where x is a hex digit).  See the file
+  <file:drivers/atm/horizon.h> for the meanings of the bits in the
+  mask.
+
+  When active, these messages can have a significant impact on the
+  speed of the driver, and the size of your syslog files! When
+  inactive, they will have only a modest impact on performance.
+
+Interphase ATM PCI x575/x525/x531
+CONFIG_ATM_IA
+  This is a driver for the Interphase (i)ChipSAR adapter cards
+  which include a variety of variants in term of the size of the
+  control memory (128K-1KVC, 512K-4KVC), the size of the packet
+  memory (128K, 512K, 1M), and the PHY type (Single/Multi mode OC3,
+  UTP155, UTP25, DS3 and E3). Go to:
+       <http://www.iphase.com/products/ClassSheet.cfm?ClassID=ATM>
+  for more info about the cards. Say Y (or M to compile as a module
+  named iphase.o) here if you have one of these cards.
+
+  See the file <file:Documentation/networking/iphase.txt> for further
+  details.
+
+Enable debugging messages
+CONFIG_ATM_IA_DEBUG
+  Somewhat useful debugging messages are available. The choice of
+  messages is controlled by a bitmap. This may be specified as a
+  module argument (kernel command line argument as well?), changed
+  dynamically using an ioctl (Get the debug utility, iadbg, from
+  <ftp://ftp.iphase.com/pub/atm/pci/>).
+
+  See the file <file:drivers/atm/iphase.h> for the meanings of the
+  bits in the mask.
+
+  When active, these messages can have a significant impact on the
+  speed of the driver, and the size of your syslog files! When
+  inactive, they will have only a modest impact on performance.
+
+Efficient Networks Speedstream 3010
+CONFIG_ATM_LANAI
+  Supports ATM cards based on the Efficient Networks "Lanai"
+  chipset such as the Speedstream 3010 and the ENI-25p.  The
+  Speedstream 3060 is currently not supported since we don't
+  have the code to drive the on-board Alcatel DSL chipset (yet).
+
+Linux telephony support
+CONFIG_PHONE
+  Say Y here if you have a telephony card, which for example allows
+  you to use a regular phone for voice-over-IP applications.
+
+  Note: this has nothing to do with modems.  You do not need to say Y
+  here in order to be able to use a modem under Linux.
+
+  This support is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called
+  phonedev.o.
+
+Compaq Smart Array support
+CONFIG_BLK_CPQ_CISS_DA
+  This is the driver for Compaq Smart Array 5xxx controllers.
+  Everyone using these boards should say Y here.
+  See <file:Documentation/cciss.txt> for the current list of
+  boards supported by this driver, and for further information
+  on the use of this driver.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  cciss.o
+
+SCSI tape drive support for Smart Array 5xxx
+CONFIG_CISS_SCSI_TAPE
+  When enabled (Y), this option allows SCSI tape drives and SCSI medium
+  changers (tape robots) to be accessed via a Compaq 5xxx array
+  controller.  (See Documentation/cciss.txt for more details.)
+
+  "SCSI support" and "SCSI tape support" must also be enabled for this
+  option to work.
+
+  When this option is disabled (N), the SCSI portion of the driver
+  is not compiled.
+
+QuickNet Internet LineJack/PhoneJack support
+CONFIG_PHONE_IXJ
+  Say M if you have a telephony card manufactured by Quicknet
+  Technologies, Inc.  These include the Internet PhoneJACK and
+  Internet LineJACK Telephony Cards. You will get a module called
+  ixj.o.
+
+  For the ISA versions of these products, you can configure the
+  cards using the isapnp tools (pnpdump/isapnp) or you can use the
+  isapnp support.  Please read <file:Documentation/telephony/ixj.txt>.
+
+  For more information on these cards, see Quicknet's web site at:
+  <http://www.quicknet.net/>.
+
+  If you do not have any Quicknet telephony cards, you can safely
+  say N here.
+
+QuickNet Internet LineJack/PhoneJack PCMCIA support
+CONFIG_PHONE_IXJ_PCMCIA
+  Say Y here to configure in PCMCIA service support for the Quicknet
+  cards manufactured by Quicknet Technologies, Inc.  This builds an
+  additional support module for the PCMCIA version of the card.
+
+FORE Systems 200E-series
+CONFIG_ATM_FORE200E_MAYBE
+  This is a driver for the FORE Systems 200E-series ATM adapter
+  cards. It simultaneously supports PCA-200E and SBA-200E models
+  on PCI and SBUS hosts. Say Y (or M to compile as a module
+  named fore_200e.o) here if you have one of these ATM adapters.
+
+  Note that the driver will actually be compiled only if you
+  additionally enable the support for PCA-200E and/or SBA-200E
+  cards.
+
+  See the file <file:Documentation/networking/fore200e.txt> for
+  further details.
+
+Enable PCA-200E card support on PCI-based hosts
+CONFIG_ATM_FORE200E_PCA
+  Say Y here if you want your PCA-200E cards to be probed.
+
+Use default PCA-200E firmware
+CONFIG_ATM_FORE200E_PCA_DEFAULT_FW
+  Use the default PCA-200E firmware data shipped with the driver.
+
+  Normal users do not have to deal with the firmware stuff, so
+  they should say Y here.
+
+Pathname of user-supplied binary firmware
+CONFIG_ATM_FORE200E_PCA_FW
+  This defines the pathname of an alternative PCA-200E binary
+  firmware image supplied by the user. This pathname may be
+  absolute or relative to the drivers/atm directory.
+
+  The driver comes with an adequate firmware image, so normal users do
+  not have to supply an alternative one. They just say Y to "Use
+  default PCA-200E firmware" instead.
+
+Enable SBA-200E card support on SBUS-based hosts
+CONFIG_ATM_FORE200E_SBA
+  Say Y here if you want your SBA-200E cards to be probed.
+
+Use default SBA-200E firmware
+CONFIG_ATM_FORE200E_SBA_DEFAULT_FW
+  Use the default SBA-200E firmware data shipped with the driver.
+
+  Normal users do not have to deal with the firmware stuff, so
+  they should say Y here.
+
+Pathname of user-supplied binary firmware
+CONFIG_ATM_FORE200E_SBA_FW
+  This defines the pathname of an alternative SBA-200E binary
+  firmware image supplied by the user. This pathname may be
+  absolute or relative to the drivers/atm directory.
+
+  The driver comes with an adequate firmware image, so normal users do
+  not have to supply an alternative one. They just say Y to "Use
+  default SBA-200E firmware", above.
+
+Maximum number of tx retries
+CONFIG_ATM_FORE200E_TX_RETRY
+  Specifies the number of times the driver attempts to transmit
+  a message before giving up, if the transmit queue of the ATM card
+  is transiently saturated.
+
+  Saturation of the transmit queue may occur only under extreme
+  conditions, e.g. when a fast host continuously submits very small
+  frames (<64 bytes) or raw AAL0 cells (48 bytes) to the ATM adapter.
+
+  Note that under common conditions, it is unlikely that you encounter
+  a saturation of the transmit queue, so the retry mechanism never
+  comes into play.
+
+Debugging level (0-3)
+CONFIG_ATM_FORE200E_DEBUG
+  Specifies the level of debugging messages issued by the driver.
+  The verbosity of the driver increases with the value of this
+  parameter.
+
+  When active, these messages can have a significant impact on
+  the performances of the driver, and the size of your syslog files!
+  Keep the debugging level to 0 during normal operations.
+
+ForeRunner HE Series
+CONFIG_ATM_HE
+  This is a driver for the Marconi ForeRunner HE-series ATM adapter
+  cards. It simultaneously supports the 155 and 622 versions.
+
+Use S/UNI PHY driver
+  Support for the S/UNI-Ultra and S/UNI-622 found in the ForeRunner
+  HE cards.  This driver provides carrier detection some statistics.
+
+PPP over ATM
+CONFIG_PPPOATM
+  Support PPP (Point to Point Protocol) encapsulated in ATM frames.
+  This implementation does not yet comply with section 8 of RFC2364,
+  which can lead to bad results idf the ATM peer loses state and 
+  changes its encapsulation unilaterally.
+
+Fusion MPT device support
+CONFIG_FUSION
+  LSI Logic Fusion(TM) Message Passing Technology (MPT) device support
+  provides high performance SCSI host initiator, and LAN [1] interface
+  services to a host system.  The Fusion architecture is capable of
+  duplexing these protocols on high-speed Fibre Channel
+  (up to 2 GHz x 2 ports = 4 GHz) and parallel SCSI (up to Ultra-320)
+  physical medium.
+
+          [1] LAN is not supported on parallel SCSI medium.
+
+  These drivers require a Fusion MPT compatible PCI adapter installed
+  in the host system.  MPT adapters contain specialized I/O processors
+  to handle I/O workload, and more importantly to offload this work
+  from the host CPU(s).
+
+  If you have Fusion MPT hardware and want to use it, you can say
+  Y or M here to add MPT (base + ScsiHost) drivers.
+    <Y> = build lib (fusion.o), and link [static] into the kernel [2]
+          proper
+    <M> = compiled as [dynamic] modules [3] named: (mptbase.o,
+          mptscsih.o)
+
+          [2] In order enable capability to boot the linux kernel
+              natively from a Fusion MPT target device, you MUST
+               answer Y here! (currently requires CONFIG_BLK_DEV_SD)
+          [3] This support is also available as a module ( = code
+              which can be inserted in and removed from the running
+              kernel whenever you want).  If you want to compile as
+              modules, say M here and read
+              <file:Documentation/modules.txt>.
+
+  If unsure, say N.
+
+  If you say Y or M here you will get a choice of these
+  additional protocol and support module options:         Module Name:
+    <M>   Enhanced SCSI error reporting                     (isense.o)
+    <M>   Fusion MPT misc device (ioctl) driver             (mptctl.o)
+    <M>   Fusion MPT LAN driver                             (mptlan.o)
+
+  ---
+  Fusion MPT is trademark of LSI Logic Corporation, and its
+  architecture is based on LSI Logic's Message Passing Interface (MPI)
+  specification.
+
+Fusion MPT enhanced SCSI error reporting [optional] module
+CONFIG_FUSION_ISENSE
+  The isense module (roughly stands for Interpret SENSE data) is
+  completely optional.  It simply provides extra English readable
+  strings in SCSI Error Report(s) that might be generated from the
+  Fusion MPT SCSI Host driver, for example when a target device
+  returns a SCSI check condition on a I/O.  Without this module
+  loaded you might see:
+
+    SCSI Error Report =-=-= (ioc0,scsi5:0)
+      SCSI_Status=02h (CHECK_CONDITION)
+      Original_CDB[]: 2A 00 00 00 00 41 00 00 02 00
+      SenseData[12h]: 70 00 02 00 00 00 00 0A 00 00 00 00 04 02 02 00 00 00
+      SenseKey=2h (NOT READY); FRU=02h
+      ASC/ASCQ=29h/00h
+
+  Where otherwise, if this module had been loaded, you would see:
+
+    SCSI Error Report =-=-= (ioc0,scsi5:0)
+      SCSI_Status=02h (CHECK_CONDITION)
+      Original_CDB[]: 2A 00 00 00 00 41 00 00 02 00 - "WRITE(10)"
+      SenseData[12h]: 70 00 02 00 00 00 00 0A 00 00 00 00 04 02 02 00 00 00
+      SenseKey=2h (NOT READY); FRU=02h
+      ASC/ASCQ=29h/00h "LOGICAL UNIT NOT READY, INITIALIZING CMD. REQUIRED"
+
+  Say M for "Enhanced SCSI error reporting" to compile this optional module,
+  creating a driver named: isense.o.
+
+  NOTE: Support for building this feature into the kernel is not
+  available, due to kernel size considerations.
+
+Fusion MPT misc device (ioctl) driver [optional] module
+CONFIG_FUSION_CTL
+  The Fusion MPT misc device driver provides specialized control
+  of MPT adapters via system ioctl calls.  Use of ioctl calls to
+  the MPT driver requires that you create and use a misc device
+  node ala:
+    mknod /dev/mptctl c 10 240
+
+  One use of this ioctl interface is to perform an upgrade (reflash)
+  of the MPT adapter firmware.  Refer to readme file(s) distributed
+  with the Fusion MPT linux driver for additional details.
+
+  If enabled by saying M to this, a driver named: mptctl.o
+  will be compiled.
+
+  If unsure whether you really want or need this, say N.
+
+Fusion MPT LAN driver [optional]
+CONFIG_FUSION_LAN
+  This module supports LAN IP traffic over Fibre Channel port(s)
+  on Fusion MPT compatible hardware (LSIFC9xx chips).
+  The physical interface used is defined in RFC 2625.
+  Please refer to that document for details.
+
+  Installing this driver requires the knowledge to configure and
+  activate a new network interface, "fc0", using standard Linux tools.
+
+  If enabled by saying M to this, a driver named: mptlan.o
+  will be compiled.
+
+  If unsure whether you really want or need this, say N.
+
+  NOTES: This feature is NOT available nor supported for linux-2.2.x
+  kernels.  You must be building a linux-2.3.x or linux-2.4.x kernel
+  in order to configure this option.
+  Support for building this feature into the linux kernel is not
+  yet available.
+
+SCSI support
+CONFIG_SCSI
+  If you want to use a SCSI hard disk, SCSI tape drive, SCSI CD-ROM or
+  any other SCSI device under Linux, say Y and make sure that you know
+  the name of your SCSI host adapter (the card inside your computer
+  that "speaks" the SCSI protocol, also called SCSI controller),
+  because you will be asked for it.
+
+  You also need to say Y here if you want support for the parallel
+  port version of the 100 MB IOMEGA ZIP drive.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called scsi_mod.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt> and
+  <file:Documentation/scsi.txt>.  However, do not compile this as a
+  module if your root file system (the one containing the directory /)
+  is located on a SCSI device.
+
+SCSI disk support
+CONFIG_BLK_DEV_SD
+  If you want to use a SCSI hard disk or the SCSI or parallel port
+  version of the IOMEGA ZIP drive under Linux, say Y and read the
+  SCSI-HOWTO, the Disk-HOWTO and the Multi-Disk-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>. This is NOT for SCSI
+  CD-ROMs.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called sd_mod.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> and
+  <file:Documentation/scsi.txt>.  Do not compile this driver as a
+  module if your root file system (the one containing the directory /)
+  is located on a SCSI disk. In this case, do not compile the driver
+  for your SCSI host adapter (below) as a module either.
+
+Maximum number of SCSI disks that can be loaded as modules
+CONFIG_SD_EXTRA_DEVS
+  This controls the amount of additional space allocated in tables for
+  drivers that are loaded as modules after the kernel is booted.  In
+  the event that the SCSI core itself was loaded as a module, this
+  value is the number of additional disks that can be loaded after the
+  first host driver is loaded.
+
+  Admittedly this isn't pretty, but there are tons of race conditions
+  involved with resizing the internal arrays on the fly.  Someday this
+  flag will go away, and everything will work automatically.
+
+  If you don't understand what's going on, go with the default.
+
+Maximum number of SCSI tapes that can be loaded as modules
+CONFIG_ST_EXTRA_DEVS
+  This controls the amount of additional space allocated in tables for
+  drivers that are loaded as modules after the kernel is booted.  In
+  the event that the SCSI core itself was loaded as a module, this
+  value is the number of additional tapes that can be loaded after the
+  first host driver is loaded.
+
+  Admittedly this isn't pretty, but there are tons of race conditions
+  involved with resizing the internal arrays on the fly.  Someday this
+  flag will go away, and everything will work automatically.
+
+  If you don't understand what's going on, go with the default.
+
+SCSI tape support
+CONFIG_CHR_DEV_ST
+  If you want to use a SCSI tape drive under Linux, say Y and read the
+  SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>, and
+  <file:drivers/scsi/README.st> in the kernel source.  This is NOT for
+  SCSI CD-ROMs.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called st.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> and
+  <file:Documentation/scsi.txt>.
+
+OnStream SC-x0 SCSI tape support
+CONFIG_CHR_DEV_OSST
+  The OnStream SC-x0 SCSI tape drives can not be driven by the
+  standard st driver, but instead need this special osst driver and
+  use the  /dev/osstX char device nodes (major 206).  Via usb-storage
+  and ide-scsi, you may be able to drive the USB-x0 and DI-x0 drives
+  as well.  Note that there is also a second generation of OnStream
+  tape drives (ADR-x0) that supports the standard SCSI-2 commands for
+  tapes (QIC-157) and can be driven by the standard driver st.
+  For more information, you may have a look at the SCSI-HOWTO
+  <http://www.tldp.org/docs.html#howto>  and
+  <file:drivers/scsi/README.osst>  in the kernel source.
+  More info on the OnStream driver may be found on
+  <http://linux1.onstream.nl/test/>
+  Please also have a look at the standard st docu, as most of it
+  applies to osst as well.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called osst.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> and
+  <file:Documentation/scsi.txt>.
+
+SCSI CD-ROM support
+CONFIG_BLK_DEV_SR
+  If you want to use a SCSI CD-ROM under Linux, say Y and read the
+  SCSI-HOWTO and the CD-ROM-HOWTO at
+  <http://www.tldp.org/docs.html#howto>. Also make sure to say Y
+  or M to "ISO 9660 CD-ROM file system support" later.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called sr_mod.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> and
+  <file:Documentation/scsi.txt>.
+
+Maximum number of CD-ROM devices that can be loaded as modules
+CONFIG_SR_EXTRA_DEVS
+  This controls the amount of additional space allocated in tables for
+  drivers that are loaded as modules after the kernel is booted. In
+  the event that the SCSI core itself was loaded as a module, this
+  value is the number of additional CD-ROMs that can be loaded after
+  the first host driver is loaded.
+
+  Admittedly this isn't pretty, but there are tons of race conditions
+  involved with resizing the internal arrays on the fly.  Someday this
+  flag will go away, and everything will work automatically.
+
+  If you don't understand what's going on, go with the default.
+
+Enable vendor-specific extensions (for SCSI CD-ROM)
+CONFIG_BLK_DEV_SR_VENDOR
+  This enables the usage of vendor specific SCSI commands. This is
+  required to support multisession CDs with old NEC/TOSHIBA cdrom
+  drives (and HP Writers). If you have such a drive and get the first
+  session only, try saying Y here; everybody else says N.
+
+SCSI generic support
+CONFIG_CHR_DEV_SG
+  If you want to use SCSI scanners, synthesizers or CD-writers or just
+  about anything having "SCSI" in its name other than hard disks,
+  CD-ROMs or tapes, say Y here. These won't be supported by the kernel
+  directly, so you need some additional software which knows how to
+  talk to these devices using the SCSI protocol:
+
+  For scanners, look at SANE (<http://www.mostang.com/sane/>). For CD
+  writer software look at Cdrtools
+  (<http://www.fokus.gmd.de/research/cc/glone/employees/joerg.schilling/private/cdrecord.html>)
+  and for burning a "disk at once": CDRDAO
+  (<http://cdrdao.sourceforge.net/>). Cdparanoia is a high
+  quality digital reader of audio CDs (<http://www.xiph.org/paranoia/>).
+  For other devices, it's possible that you'll have to write the
+  driver software yourself. Please read the file
+  <file:Documentation/scsi-generic.txt> for more information.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt> and
+  <file:Documentation/scsi.txt>. The module will be called sg.o. If unsure,
+  say N.
+
+Probe all LUNs on each SCSI device
+CONFIG_SCSI_MULTI_LUN
+  If you have a SCSI device that supports more than one LUN (Logical
+  Unit Number), e.g. a CD jukebox, and only one LUN is detected, you
+  can say Y here to force the SCSI driver to probe for multiple LUNs.
+  A SCSI device with multiple LUNs acts logically like multiple SCSI
+  devices. The vast majority of SCSI devices have only one LUN, and
+  so most people can say N here and should in fact do so, because it
+  is safer.
+
+Verbose SCSI error reporting (kernel size +=12K)
+CONFIG_SCSI_CONSTANTS
+  The error messages regarding your SCSI hardware will be easier to
+  understand if you say Y here; it will enlarge your kernel by about
+  12 KB. If in doubt, say Y.
+
+SCSI logging facility
+CONFIG_SCSI_LOGGING
+  This turns on a logging facility that can be used to debug a number
+  of SCSI related problems.
+
+  If you say Y here, no logging output will appear by default, but you
+  can enable logging by saying Y to "/proc file system support" and
+  "Sysctl support" below and executing the command
+
+     echo "scsi log token [level]" > /proc/scsi/scsi
+
+  at boot time after the /proc file system has been mounted.
+
+  There are a number of things that can be used for 'token' (you can
+  find them in the source: <file:drivers/scsi/scsi.c>), and this
+  allows you to select the types of information you want, and the
+  level allows you to select the level of verbosity.
+
+  If you say N here, it may be harder to track down some types of SCSI
+  problems. If you say Y here your kernel will be somewhat larger, but
+  there should be no noticeable performance impact as long as you have
+  logging turned off.
+
+SGI WD93C93 SCSI Driver
+CONFIG_SCSI_SGIWD93
+  Say Y here to support the on-board WD93C93 SCSI controller found (a)
+  on the Indigo2 and other MIPS-based SGI machines, and (b) on ARCS
+  ARM-based machines.
+
+DEC NCR53C94 SCSI Driver
+CONFIG_SCSI_DECNCR
+  Say Y here to support the NCR53C94 SCSI controller chips on IOASIC
+  based TURBOchannel DECstations and TURBOchannel PMAZ-A cards.
+
+AdvanSys SCSI support
+CONFIG_SCSI_ADVANSYS
+  This is a driver for all SCSI host adapters manufactured by
+  AdvanSys. It is documented in the kernel source in
+  <file:drivers/scsi/advansys.c>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called
+  advansys.o.
+
+Adaptec AHA152X/2825 support
+CONFIG_SCSI_AHA152X
+  This is a driver for the AHA-1510, AHA-1520, AHA-1522, and AHA-2825
+  SCSI host adapters. It also works for the AVA-1505, but the IRQ etc.
+  must be manually specified in this case.
+
+  It is explained in section 3.3 of the SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>. You might also want to
+  read the file <file:drivers/scsi/README.aha152x>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called aha152x.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Adaptec AHA1542 support
+CONFIG_SCSI_AHA1542
+  This is support for a SCSI host adapter.  It is explained in section
+  3.4 of the SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.  Note that Trantor was
+  purchased by Adaptec, and some former Trantor products are being
+  sold under the Adaptec name.  If it doesn't work out of the box, you
+  may have to change some settings in <file:drivers/scsi/aha1542.h>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called aha1542.o.
+
+Adaptec AHA1740 support
+CONFIG_SCSI_AHA1740
+  This is support for a SCSI host adapter.  It is explained in section
+  3.5 of the SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.  If it doesn't work out
+  of the box, you may have to change some settings in
+  <file:drivers/scsi/aha1740.h>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called aha1740.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Adaptec AIC7xxx support
+CONFIG_SCSI_AIC7XXX
+  This driver supports all of Adaptec's Fast through Ultra 160 PCI
+  based SCSI controllers as well as the aic7770 based EISA and VLB
+  SCSI controllers (the 274x and 284x series).  For AAA and ARO based
+  configurations, only SCSI functionality is provided.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called aic7xxx.o.
+
+Maximum number of TCQ commands per device
+CONFIG_AIC7XXX_CMDS_PER_DEVICE
+  Specify the number of commands you would like to allocate per SCSI
+  device when Tagged Command Queueing (TCQ) is enabled on that device.
+
+  This is an upper bound value for the number of tagged transactions
+  to be used for any device.  The aic7xxx driver will automatically
+  vary this number based on device behavior.  For devices with a
+  fixed maximum, the driver will eventually lock to this maximum
+  and display a console message indicating this value.
+
+  Due to resource allocation issues in the Linux SCSI mid-layer, using
+  a high number of commands per device may result in memory allocation
+  failures when many devices are attached to the system.  For this reason,
+  the default is set to 32.  Higher values may result in higer performance
+  on some devices.  The upper bound is 253. 0 disables tagged queueing.
+
+  Per device tag depth can be controlled via the kernel command line
+  "tag_info" option.  See drivers/scsi/aic7xxx/README.aic7xxx
+  for details.
+
+  Default: 32
+
+Initial bus reset delay in milli-seconds
+CONFIG_AIC7XXX_RESET_DELAY_MS
+  The number of milliseconds to delay after an initial bus reset.
+  The bus settle delay following all error recovery actions is
+  dictated by the SCSI layer and is not affected by this value.
+
+  Default: 15000 (15 seconds)
+
+Probe for EISA and VL AIC7XXX Adapters
+CONFIG_AIC7XXX_PROBE_EISA_VL
+   Probe for EISA and VLB Aic7xxx controllers.  In many newer systems,
+   the invasive probes necessary to detect these controllers can cause
+   other devices to fail.  For this reason, the non-PCI probe code is
+   disabled by default.  The current value of this option can be "toggled"
+   via the no_probe kernel command line option.
+
+CONFIG_AIC7XXX_BUILD_FIRMWARE
+  This option should only be enabled if you are modifying the firmware
+  source to the aic7xxx driver and wish to have the generated firmware
+  include files updated during a normal kernel build.  The assembler
+  for the firmware requires lex and yacc or their equivalents, as well
+  as the db v1 library.  You may have to install additional packages
+  or modify the assembler Makefile or the files it includes if your
+  build environment is different than that of the author.
+
+Compile in Debugging Code
+CONFIG_AIC7XXX_DEBUG_ENABLE
+  Compile in aic7xxx debugging code that can be useful in diagnosing
+  driver errors.
+
+Debug code enable mask (2048 for all debugging)
+CONFIG_AIC7XXX_DEBUG_MASK
+  Bit mask of debug options that is only valid if the
+  CONFIG_AIC7XXX_DEBUG_ENBLE option is enabled.  The bits in this mask
+  are defined in the drivers/scsi/aic7xxx/aic7xxx.h - search for the
+  variable ahc_debug in that file to find them.
+
+  Default: 0
+
+Decode registers during diagnostics
+CONFIG_AIC7XXX_REG_PRETTY_PRINT
+  Compile in register value tables for the output of expanded register
+  contents in diagnostics.  This make it much easier to understand debug
+  output without having to refer to a data book and/or the aic7xxx.reg file.
+
+Old Adaptec AIC7xxx support
+CONFIG_SCSI_AIC7XXX_OLD
+  WARNING This driver is an older aic7xxx driver and is no longer
+  under active development.  Adaptec, Inc. is writing a new driver to
+  take the place of this one, and it is recommended that whenever
+  possible, people should use the new Adaptec written driver instead
+  of this one.  This driver will eventually be phased out entirely.
+
+  This is support for the various aic7xxx based Adaptec SCSI
+  controllers. These include the 274x EISA cards; 284x VLB cards;
+  2902, 2910, 293x, 294x, 394x, 3985 and several other PCI and
+  motherboard based SCSI controllers from Adaptec. It does not support
+  the AAA-13x RAID controllers from Adaptec, nor will it likely ever
+  support them. It does not support the 2920 cards from Adaptec that
+  use the Future Domain SCSI controller chip. For those cards, you
+  need the "Future Domain 16xx SCSI support" driver.
+
+  In general, if the controller is based on an Adaptec SCSI controller
+  chip from the aic777x series or the aic78xx series, this driver
+  should work. The only exception is the 7810 which is specifically
+  not supported (that's the RAID controller chip on the AAA-13x
+  cards).
+
+  Note that the AHA2920 SCSI host adapter is *not* supported by this
+  driver; choose "Future Domain 16xx SCSI support" instead if you have
+  one of those.
+
+  Information on the configuration options for this controller can be
+  found by checking the help file for each of the available
+  configuration options. You should read
+  <file:drivers/scsi/aic7xxx_old/README.aic7xxx> at a minimum before
+  contacting the maintainer with any questions.  The SCSI-HOWTO,
+  available from <http://www.tldp.org/docs.html#howto>, can also
+  be of great help.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called aic7xxx_old.o.
+
+Enable tagged command queueing (TCQ) by default
+CONFIG_AIC7XXX_OLD_TCQ_ON_BY_DEFAULT
+  This option causes the aic7xxx driver to attempt to use Tagged
+  Command Queueing (TCQ) on all devices that claim to support it.
+
+  TCQ is a feature of SCSI-2 which improves performance: the host
+  adapter can send several SCSI commands to a device's queue even if
+  previous commands haven't finished yet.  Because the device is
+  intelligent, it can optimize its operations (like head positioning)
+  based on its own request queue.  Not all devices implement this
+  correctly.
+
+  If you say Y here, you can still turn off TCQ on troublesome devices
+  with the use of the tag_info boot parameter.  See the file
+  <file:drivers/scsi/README.aic7xxx> for more information on that and
+  other aic7xxx setup commands.  If this option is turned off, you may
+  still enable TCQ on known good devices by use of the tag_info boot
+  parameter.
+
+  If you are unsure about your devices then it is safest to say N
+  here.
+
+  However, TCQ can increase performance on some hard drives by as much
+  as 50% or more, so it is recommended that if you say N here, you
+  should at least read the <file:drivers/scsi/README.aic7xxx> file so
+  you will know how to enable this option manually should your drives
+  prove to be safe in regards to TCQ.
+
+  Conversely, certain drives are known to lock up or cause bus resets
+  when TCQ is enabled on them.  If you have a Western Digital
+  Enterprise SCSI drive for instance, then don't even bother to enable
+  TCQ on it as the drive will become unreliable, and it will actually
+  reduce performance.
+
+Default number of TCQ commands per device
+CONFIG_AIC7XXX_OLD_CMDS_PER_DEVICE
+  Specify the number of commands you would like to allocate per SCSI
+  device when Tagged Command Queueing (TCQ) is enabled on that device.
+
+  Reasonable figures are in the range of 8 to 24 commands per device,
+  but depending on hardware could be increased or decreased from that
+  figure. If the number is too high for any particular device, the
+  driver will automatically compensate usually after only 10 minutes
+  of uptime. It will not hinder performance if some of your devices
+  eventually have their command depth reduced, but is a waste of
+  memory if all of your devices end up reducing this number down to a
+  more reasonable figure.
+
+  NOTE: Certain very broken drives are known to lock up when given
+  more commands than they like to deal with. Quantum Fireball drives
+  are the most common in this category. For the Quantum Fireball
+  drives it is suggested to use no more than 8 commands per device.
+
+  Default: 8
+
+Collect statistics to report in /proc
+CONFIG_AIC7XXX_OLD_PROC_STATS
+  This option tells the driver to keep track of how many commands have
+  been sent to each particular device and report that information to
+  the user via the /proc/scsi/aic7xxx/n file, where n is the number of
+  the aic7xxx controller you want the information on. This adds a
+  small amount of overhead to each and every SCSI command the aic7xxx
+  driver handles, so if you aren't really interested in this
+  information, it is best to leave it disabled. This will only work if
+  you also say Y to "/proc file system support", below.
+
+  If unsure, say N.
+
+CONFIG_SCSI_AIC79XX
+  This driver supports all of Adaptec's Ultra 320 PCI-X based SCSI controllers.
+
+CONFIG_AIC79XX_CMDS_PER_DEVICE 32
+  Specify the number of commands you would like to allocate per SCSI
+  device when Tagged Command Queueing (TCQ) is enabled on that device.
+
+  This is an upper bound value for the number of tagged transactions
+  to be used for any device.  The aic7xxx driver will automatically
+  vary this number based on device behavior.  For devices with a
+  fixed maximum, the driver will eventually lock to this maximum
+  and display a console message indicating this value.
+
+  Due to resource allocation issues in the Linux SCSI mid-layer, using
+  a high number of commands per device may result in memory allocation
+  failures when many devices are attached to the system.  For this reason,
+  the default is set to 32.  Higher values may result in higer performance
+  on some devices.  The upper bound is 253.
+
+  Per device tag depth can be controlled via the kernel command line
+  "tag_info" option.  See drivers/scsi/aic7xxx/README.aic79xx
+  for details.
+
+  Default: 32
+
+CONFIG_AIC79XX_RESET_DELAY_MS 15000
+  The number of milliseconds to delay after an initial bus reset.
+  The bus settle delay following all error recovery actions is
+  dictated by the SCSI layer and is not affected by this value.
+
+  Default: 15000 (15 seconds)
+
+CONFIG_AIC79XX_BUILD_FIRMWARE
+  This option should only be enabled if you are modifying the firmware
+  source to the aic7xxx driver and wish to have the generated firmware
+  include files updated during a normal kernel build.  The assembler
+  for the firmware requires lex and yacc or their equivalents, as well
+  as the db v1 library.  You may have to install additional packages
+  or modify the assembler Makefile or the files it includes if your
+  build environment is different than that of the author.
+
+CONFIG_AIC79XX_ENABLE_RD_STRM
+  Read Streaming is a U320 protocol option that should enhance performance.
+  Early U320 drive firmware actually performs slower with read streaming
+  enabled so it is disabled by default.  Read Streaming can be configured
+  in much the same way as tagged queueing using the "rd_strm" command line
+  option.  See drivers/scsi/aic7xxx/README.aic79xx for details.
+
+CONFIG_AIC79XX_DEBUG_ENABLE
+  Compile in aic79xx debugging code that can be useful in diagnosing
+  driver errors.
+
+CONFIG_AIC79XX_DEBUG_MASK
+  Bit mask of debug options that is only valid if the
+  CONFIG_AIC79XX_DEBUG_ENBLE option is enabled.  The bits in this mask
+  are defined in the drivers/scsi/aic7xxx/aic79xx.h - search for the
+  variable ahd_debug in that file to find them.
+
+  Default: 0
+
+CONFIG_AIC79XX_REG_PRETTY_PRINT
+  Compile in register value tables for the output of expanded register
+  contents in diagnostics.  This make it much easier to understand debug
+  output without having to refer to a data book and/or the aic7xxx.reg file.
+
+Adaptec I2O RAID support
+CONFIG_SCSI_DPT_I2O
+  This driver supports all of Adaptec's I2O based RAID controllers as 
+  well as the DPT SmartRaid V cards.  This is an Adaptec maintained
+  driver by Deanna Bonds.  See <file:drivers/scsi/README.dpti>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called
+  dpt_i2o.o.
+
+IBM ServeRAID support
+CONFIG_SCSI_IPS
+  This is support for the IBM ServeRAID hardware RAID controllers.
+  See <http://www.developer.ibm.com/welcome/netfinity/serveraid.html>
+  for more information.  If this driver does not work correctly
+  without modification please contact the author by email at
+  ipslinux@us.ibm.com.
+
+  You can build this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  but only a single instance may be loaded. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+  The module will be called ips.o.
+
+BusLogic SCSI support
+CONFIG_SCSI_BUSLOGIC
+  This is support for BusLogic MultiMaster and FlashPoint SCSI Host
+  Adapters. Consult the SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>, and the files
+  <file:drivers/scsi/README.BusLogic> and
+  <file:drivers/scsi/README.FlashPoint> for more information. If this
+  driver does not work correctly without modification, please contact
+  the author, Leonard N. Zubkoff, by email to lnz@dandelion.com.
+
+  You can also build this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  but only a single instance may be loaded. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+  The module will be called BusLogic.o.
+
+Omit BusLogic SCSI FlashPoint support
+CONFIG_SCSI_OMIT_FLASHPOINT
+  This option allows you to omit the FlashPoint support from the
+  BusLogic SCSI driver. The FlashPoint SCCB Manager code is
+  substantial, so users of MultiMaster Host Adapters may wish to omit
+  it.
+
+Compaq Fibre Channel 64-bit/66Mhz HBA support
+CONFIG_SCSI_CPQFCTS
+  Say Y here to compile in support for the Compaq StorageWorks Fibre
+  Channel 64-bit/66Mhz Host Bus Adapter.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called cpqfc.o.
+
+DMX3191D SCSI support
+CONFIG_SCSI_DMX3191D
+  This is support for Domex DMX3191D SCSI Host Adapters.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called dmx3191d.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+DTC3180/3280 SCSI support
+CONFIG_SCSI_DTC3280
+  This is support for DTC 3180/3280 SCSI Host Adapters.  Please read
+  the SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>, and the file
+  <file:drivers/scsi/README.dtc3x80>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called dtc.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+EATA-DMA [Obsolete] (DPT, NEC, AT&T, SNI, AST, Olivetti, Alphatronix) support
+CONFIG_SCSI_EATA_DMA
+  This is support for the EATA-DMA protocol compliant SCSI Host
+  Adapters like the SmartCache III/IV, SmartRAID controller families
+  and the DPT PM2011B and PM2012B controllers.
+
+  Note that this driver is obsolete; if you have one of the above
+  SCSI Host Adapters, you should normally say N here and Y to "EATA
+  ISA/EISA/PCI support", below.  Please read the SCSI-HOWTO, available
+  from <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called eata_dma.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+EATA-PIO (old DPT PM2001, PM2012A) support
+CONFIG_SCSI_EATA_PIO
+  This driver supports all EATA-PIO protocol compliant SCSI Host
+  Adapters like the DPT PM2001 and the PM2012A.  EATA-DMA compliant
+  host adapters could also use this driver but are discouraged from
+  doing so, since this driver only supports hard disks and lacks
+  numerous features.  You might want to have a look at the SCSI-HOWTO,
+  available from <http://www.tldp.org/docs.html#howto>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called eata_pio.o.
+
+UltraStor 14F/34F support
+CONFIG_SCSI_U14_34F
+  This is support for the UltraStor 14F and 34F SCSI-2 host adapters.
+  The source at <file:drivers/scsi/u14-34f.c> contains some
+  information about this hardware.  If the driver doesn't work out of
+  the box, you may have to change some settings in
+  <file: drivers/scsi/u14-34f.c>.  Read the SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.  Note that there is also
+  another driver for the same hardware: "UltraStor SCSI support",
+  below.  You should say Y to both only if you want 24F support as
+  well.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called u14-34f.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+enable elevator sorting
+CONFIG_SCSI_U14_34F_LINKED_COMMANDS
+  This option enables elevator sorting for all probed SCSI disks and
+  CD-ROMs. It definitely reduces the average seek distance when doing
+  random seeks, but this does not necessarily result in a noticeable
+  performance improvement: your mileage may vary...
+
+  The safe answer is N.
+
+maximum number of queued commands
+CONFIG_SCSI_U14_34F_MAX_TAGS
+  This specifies how many SCSI commands can be maximally queued for
+  each probed SCSI device. You should reduce the default value of 8
+  only if you have disks with buggy or limited tagged command support.
+  Minimum is 2 and maximum is 14. This value is also the window size
+  used by the elevator sorting option above. The effective value used
+  by the driver for each probed SCSI device is reported at boot time.
+
+Future Domain 16xx SCSI/AHA-2920A support
+CONFIG_SCSI_FUTURE_DOMAIN
+  This is support for Future Domain's 16-bit SCSI host adapters
+  (TMC-1660/1680, TMC-1650/1670, TMC-3260, TMC-1610M/MER/MEX) and
+  other adapters based on the Future Domain chipsets (Quantum
+  ISA-200S, ISA-250MG; Adaptec AHA-2920A; and at least one IBM board).
+  It is explained in section 3.7 of the SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  NOTE: Newer Adaptec AHA-2920C boards use the Adaptec AIC-7850 chip
+  and should use the aic7xxx driver ("Adaptec AIC7xxx chipset SCSI
+  controller support"). This Future Domain driver works with the older
+  Adaptec AHA-2920A boards with a Future Domain chip on them.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called fdomain.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Future Domain MCS-600/700 SCSI support
+CONFIG_SCSI_FD_MCS
+  This is support for Future Domain MCS 600/700 MCA SCSI adapters.
+  Some PS/2 computers are equipped with IBM Fast SCSI Adapter/A which
+  is identical to the MCS 700 and hence also supported by this driver.
+  This driver also supports the Reply SB16/SCSI card (the SCSI part).
+  It supports multiple adapters in the same system.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called fd_mcs.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Generic NCR5380/53c400 SCSI support
+CONFIG_SCSI_GENERIC_NCR5380
+  This is the generic NCR family of SCSI controllers, not to be
+  confused with the NCR 53c7 or 8xx controllers.  It is explained in
+  section 3.8 of the SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.  If it doesn't work out
+  of the box, you may have to change some settings in
+  <file:drivers/scsi/g_NCR5380.h>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called g_NCR5380.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+Enable NCR53c400 extensions
+CONFIG_SCSI_GENERIC_NCR53C400
+  This enables certain optimizations for the NCR53c400 SCSI cards.
+  You might as well try it out.  Note that this driver will only probe
+  for the Trantor T130B in its default configuration; you might have
+  to pass a command line option to the kernel at boot time if it does
+  not detect your card.  See the file
+  <file:drivers/scsi/README.g_NCR5380> for details.
+
+# Choice: ncr5380
+NCR5380/53c400 mapping method (use Port for T130B)
+CONFIG_SCSI_G_NCR5380_PORT
+  The NCR5380 and NCR53c400 SCSI controllers come in two varieties:
+  port or memory mapped. You should know what you have. The most
+  common card, Trantor T130B, uses port mapped mode.
+
+NCR Dual 700 MCA SCSI support
+CONFIG_SCSI_NCR_D700
+  This is a driver for the MicroChannel Dual 700 card produced by
+  NCR and commonly used in 345x/35xx/4100 class machines.  It always
+  tries to negotiate sync and uses tag command queueing.
+
+  Unless you have an NCR manufactured machine, the chances are that
+  you do not have this SCSI card, so say N.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called NCR_D700.o.
+
+HP LASI SCSI support for 53c700/710
+CONFIG_SCSI_LASI700
+  This is a driver for the lasi baseboard in some parisc machines
+  which is based on the 53c700 chip.  Will also support LASI subsystems
+  based on the 710 chip using 700 emulation mode.
+
+  Unless you know you have a 53c700 or 53c710 based lasi, say N here
+
+NCR53c7,8xx SCSI support
+CONFIG_SCSI_NCR53C7xx
+  This is a driver for the 53c7 and 8xx NCR family of SCSI
+  controllers, not to be confused with the NCR 5380 controllers.  It
+  is explained in section 3.8 of the SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.  If it doesn't work out
+  of the box, you may have to change some settings in
+  <file:drivers/scsi/53c7,8xx.h>.  Please read
+  <file:drivers/scsi/README.ncr53c7xx> for the available boot time
+  command line options.
+
+  Note: there is another driver for the 53c8xx family of controllers
+  ("NCR53C8XX SCSI support" below).  If you want to use them both, you
+  need to say M to both and build them as modules, but only one may be
+  active at a time. If you have a 53c8xx board, it's better to use the
+  other driver.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called 53c7,8xx.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+Always negotiate synchronous transfers
+CONFIG_SCSI_NCR53C7xx_sync
+  In general, this is good; however, it is a bit dangerous since there
+  are some broken SCSI devices out there. Take your chances. Safe bet
+  is N.
+
+Allow FAST-SCSI [10MHz]
+CONFIG_SCSI_NCR53C7xx_FAST
+  This will enable 10MHz FAST-SCSI transfers with your host
+  adapter. Some systems have problems with that speed, so it's safest
+  to say N here.
+
+Allow DISCONNECT
+CONFIG_SCSI_NCR53C7xx_DISCONNECT
+  This enables the disconnect/reconnect feature of the NCR SCSI
+  controller. When you say Y here, a slow SCSI device will not lock
+  the SCSI bus while processing a request, allowing simultaneous use
+  of e.g. a SCSI hard disk and SCSI tape or CD-ROM drive, and
+  providing much better performance when using slow and fast SCSI
+  devices at the same time. Some devices, however, do not operate
+  properly with this option enabled, and will cause your SCSI system
+  to hang, which might cause a system crash. The safe answer
+  therefore is to say N.
+
+SYM53C8XX Version 2 SCSI support
+CONFIG_SCSI_SYM53C8XX_2
+  This driver supports the whole NCR53C8XX/SYM53C8XX family of 
+  PCI-SCSI controllers. It also supports the subset of LSI53C10XX 
+  Ultra-160 controllers that are based on the SYM53C8XX SCRIPTS 
+  language. It does not support LSI53C10XX Ultra-320 PCI-X SCSI 
+  controllers.
+
+  If your system has problems using this new major version of the
+  SYM53C8XX driver, you may switch back to driver version 1.
+
+  Please read <file:drivers/scsi/sym53c8xx_2/Documentation.txt> for more
+  information.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called sym53c8xx.o.
+
+PCI DMA addressing mode
+CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE
+  This option only applies to PCI-SCSI chip that are PCI DAC capable 
+  (875A, 895A, 896, 1010-33, 1010-66, 1000).
+
+  When set to 0, only PCI 32 bit DMA addressing (SAC) will be performed.
+  When set to 1, 40 bit DMA addressing (with upper 24 bits of address 
+  set to zero) is supported. The addressable range is here 1 TB.
+  When set to 2, full 64 bits of address for DMA are supported, but only
+  16 segments of 4 GB can be addressed. The addressable range is so 
+  limited to 64 GB.
+
+  The safest value is 0 (32 bit DMA addressing) that is guessed to still 
+  fit most of real machines.
+
+  The preferred value 1 (40 bit DMA addressing) should make happy 
+  properly engineered PCI DAC capable host bridges. You may configure
+  this option for Intel platforms with more than 4 GB of memory.
+
+  The still experimental value 2 (64 bit DMA addressing with 16 x 4GB 
+  segments limitation) can be used on systems that require PCI address 
+  bits past bit 39 to be set for the addressing of memory using PCI 
+  DAC cycles.
+
+use normal IO
+CONFIG_SCSI_SYM53C8XX_IOMAPPED
+  If you say Y here, the driver will preferently use normal IO rather than 
+  memory mapped IO.
+
+maximum number of queued commands
+CONFIG_SCSI_SYM53C8XX_MAX_TAGS
+  This option allows you to specify the maximum number of commands
+  that can be queued to any device, when tagged command queuing is
+  possible. The driver supports up to 256 queued commands per device.
+  This value is used as a compiled-in hard limit.
+
+default tagged command queue depth
+CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS
+  This is the default value of the command queue depth the driver will 
+  announce to the generic SCSI layer for devices that support tagged 
+  command queueing. This value can be changed from the boot command line.
+  This is a soft limit that cannot exceed CONFIG_SCSI_SYM53C8XX_MAX_TAGS.
+
+NCR53C8XX SCSI support
+CONFIG_SCSI_NCR53C8XX
+  This is the BSD ncr driver adapted to Linux for the NCR53C8XX family
+  of PCI-SCSI controllers.  This driver supports parity checking,
+  tagged command queuing and fast synchronous data transfers up to 80
+  MB/s with wide FAST-40 LVD devices and controllers.
+
+  Recent versions of the 53C8XX chips are better supported by the
+  option "SYM53C8XX SCSI support", below.
+
+  Note: there is yet another driver for the 53c8xx family of
+  controllers ("NCR53c7,8xx SCSI support" above).  If you want to use
+  them both, you need to say M to both and build them as modules, but
+  only one may be active at a time.  If you have a 53c8xx board, you
+  probably do not want to use the "NCR53c7,8xx SCSI support".
+
+  Please read <file:drivers/scsi/README.ncr53c8xx> for more
+  information.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ncr53c8xx.o.
+
+SYM53C8XX Version 1 SCSI support
+CONFIG_SCSI_SYM53C8XX
+  This driver supports all the features of recent 53C8XX chips (used
+  in PCI SCSI controllers), notably the hardware phase mismatch
+  feature of the SYM53C896.
+
+  Older versions of the 53C8XX chips are not supported by this
+  driver.  If your system uses either a 810 rev. < 16, a 815, or a 825
+  rev. < 16 PCI SCSI processor, you must use the generic NCR53C8XX
+  driver ("NCR53C8XX SCSI support" above) or configure both the
+  NCR53C8XX and this SYM53C8XX drivers either as module or linked to
+  the kernel image.
+
+  When both drivers are linked into the kernel, the SYM53C8XX driver
+  is called first at initialization and you can use the 'excl=ioaddr'
+  driver boot option to exclude attachment of adapters by the
+  SYM53C8XX driver.  For example, entering
+  'sym53c8xx=excl:0xb400,excl=0xc000' at the lilo prompt prevents
+  adapters at io address 0xb400 and 0xc000 from being attached by the
+  SYM53C8XX driver, thus allowing the NCR53C8XX driver to attach them.
+  The 'excl' option is also supported by the NCR53C8XX driver.
+
+  Please read <file:drivers/scsi/README.ncr53c8xx> for more
+  information.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called sym53c8xx.o.
+
+Synchronous transfer frequency in MHz
+CONFIG_SCSI_NCR53C8XX_SYNC
+  The SCSI Parallel Interface-2 Standard defines 5 classes of transfer
+  rates: FAST-5, FAST-10, FAST-20, FAST-40 and FAST-80.  The numbers
+  are respectively the maximum data transfer rates in mega-transfers
+  per second for each class.  For example, a FAST-20 Wide 16 device is
+  able to transfer data at 20 million 16 bit packets per second for a
+  total rate of 40 MB/s.
+
+  You may specify 0 if you want to only use asynchronous data
+  transfers. This is the safest and slowest option. Otherwise, specify
+  a value between 5 and 80, depending on the capability of your SCSI
+  controller.  The higher the number, the faster the data transfer.
+  Note that 80 should normally be ok since the driver decreases the
+  value automatically according to the controller's capabilities.
+
+  Your answer to this question is ignored for controllers with NVRAM,
+  since the driver will get this information from the user set-up.  It
+  also can be overridden using a boot setup option, as follows
+  (example): 'ncr53c8xx=sync:12' will allow the driver to negotiate
+  for FAST-20 synchronous data transfer (20 mega-transfers per
+  second).
+
+  The normal answer therefore is not to go with the default but to
+  select the maximum value 80 allowing the driver to use the maximum
+  value supported by each controller. If this causes problems with
+  your SCSI devices, you should come back and decrease the value.
+
+  There is no safe option other than using good cabling, right
+  terminations and SCSI conformant devices.
+
+Use normal IO
+CONFIG_SCSI_NCR53C8XX_IOMAPPED
+  If you say Y here, the driver will use normal IO, as opposed to
+  memory mapped IO. Memory mapped IO has less latency than normal IO
+  and works for most Intel-based hardware. Under Linux/Alpha only
+  normal IO is currently supported by the driver and so, this option
+  has no effect on those systems.
+
+  The normal answer therefore is N; try Y only if you encounter SCSI
+  related problems.
+
+Not allow targets to disconnect
+CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT
+  This option is only provided for safety if you suspect some SCSI
+  device of yours to not support properly the target-disconnect
+  feature. In that case, you would say Y here. In general however, to
+  not allow targets to disconnect is not reasonable if there is more
+  than 1 device on a SCSI bus. The normal answer therefore is N.
+
+Default tagged command queue depth
+CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS
+  "Tagged command queuing" is a feature of SCSI-2 which improves
+  performance: the host adapter can send several SCSI commands to a
+  device's queue even if previous commands haven't finished yet.
+  Because the device is intelligent, it can optimize its operations
+  (like head positioning) based on its own request queue. Some SCSI
+  devices don't implement this properly; if you want to disable this
+  feature, enter 0 or 1 here (it doesn't matter which).
+
+  The default value is 8 and should be supported by most hard disks.
+  This value can be overridden from the boot command line using the
+  'tags' option as follows (example):
+  'ncr53c8xx=tags:4/t2t3q16/t0u2q10' will set default queue depth to
+  4, set queue depth to 16 for target 2 and target 3 on controller 0
+  and set queue depth to 10 for target 0 / lun 2 on controller 1.
+
+  The normal answer therefore is to go with the default 8 and to use
+  a boot command line option for devices that need to use a different
+  command queue depth.
+
+  There is no safe option other than using good SCSI devices.
+
+Maximum number of queued commands
+CONFIG_SCSI_NCR53C8XX_MAX_TAGS
+  This option allows you to specify the maximum number of commands
+  that can be queued to any device, when tagged command queuing is
+  possible. The default value is 32. Minimum is 2, maximum is 64.
+  Modern hard disks are able to support 64 tags and even more, but
+  do not seem to be faster when more than 32 tags are being used.
+
+  So, the normal answer here is to go with the default value 32 unless
+  you are using very large hard disks with large cache (>= 1 MB) that
+  are able to take advantage of more than 32 tagged commands.
+
+  There is no safe option and the default answer is recommended.
+
+Assume boards are SYMBIOS compatible
+CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT
+  This option allows you to enable some features depending on GPIO
+  wiring. These General Purpose Input/Output pins can be used for
+  vendor specific features or implementation of the standard SYMBIOS
+  features. Genuine SYMBIOS controllers use GPIO0 in output for
+  controller LED and GPIO3 bit as a flag indicating
+  singled-ended/differential interface. The Tekram DC-390U/F boards
+  uses a different GPIO wiring.
+
+  Your answer to this question is ignored if all your controllers have
+  NVRAM, since the driver is able to detect the board type from the
+  NVRAM format.
+
+  If all the controllers in your system are genuine SYMBIOS boards or
+  use BIOS and drivers from SYMBIOS, you would want to say Y here,
+  otherwise N. N is the safe answer.
+
+Enable traffic profiling
+CONFIG_SCSI_NCR53C8XX_PROFILE
+  This option allows you to enable profiling information gathering.
+  These statistics are not very accurate due to the low frequency
+  of the kernel clock (100 Hz on i386) and have performance impact
+  on systems that use very fast devices.
+
+  The normal answer therefore is N.
+
+Include support for the NCR PQS/PDS SCSI card
+CONFIG_SCSI_NCR53C8XX_PQS_PDS
+  Say Y here if you have a special SCSI adapter produced by NCR
+  corporation called a PCI Quad SCSI or PCI Dual SCSI. You do not need
+  this if you do not have one of these adapters. However, since this
+  device is detected as a specific PCI device, this option is quite
+  safe.
+
+  The common answer here is N, but answering Y is safe.
+
+Workbit NinjaSCSI-32Bi/UDE support
+CONFIG_SCSI_NSP32
+  This is support for the Workbit NinjaSCSI-32Bi/UDE PCI/Cardbus
+  SCSI host adapter. Please read the SCSI-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called nsp32.o.
+
+IBMMCA SCSI support
+CONFIG_SCSI_IBMMCA
+  This is support for the IBM SCSI adapter found in many of the PS/2
+  series computers.  These machines have an MCA bus, so you need to
+  answer Y to "MCA support" as well and read
+  <file:Documentation/mca.txt>.
+
+  If the adapter isn't found during boot (a common problem for models
+  56, 57, 76, and 77) you'll need to use the 'ibmmcascsi=<pun>' kernel
+  option, where <pun> is the id of the SCSI subsystem (usually 7, but
+  if that doesn't work check your reference diskette).  Owners of
+  model 95 with a LED-matrix-display can in addition activate some
+  activity info like under OS/2, but more informative, by setting
+  'ibmmcascsi=display' as an additional kernel parameter.  Try "man
+  bootparam" or see the documentation of your boot loader about how to
+  pass options to the kernel.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ibmmca.o.
+
+Standard SCSI-order
+CONFIG_IBMMCA_SCSI_ORDER_STANDARD
+  In the PC-world and in most modern SCSI-BIOS-setups, SCSI-hard disks
+  are assigned to the drive letters, starting with the lowest SCSI-id
+  (physical number -- pun) to be drive C:, as seen from DOS and
+  similar operating systems. When looking into papers describing the
+  ANSI-SCSI-standard, this assignment of drives appears to be wrong.
+  The SCSI-standard follows a hardware-hierarchy which says that id 7
+  has the highest priority and id 0 the lowest. Therefore, the host
+  adapters are still today everywhere placed as SCSI-id 7 by default.
+  In the SCSI-standard, the drive letters express the priority of the
+  disk. C: should be the hard disk, or a partition on it, with the
+  highest priority. This must therefore be the disk with the highest
+  SCSI-id (e.g. 6) and not the one with the lowest! IBM-BIOS kept the
+  original definition of the SCSI-standard as also industrial- and
+  process-control-machines, like VME-CPUs running under realtime-OSes
+  (e.g. LynxOS, OS9) do.
+
+  If you like to run Linux on your MCA-machine with the same
+  assignment of hard disks as seen from e.g. DOS or OS/2 on your
+  machine, which is in addition conformant to the SCSI-standard, you
+  must say Y here. This is also necessary for MCA-Linux users who want
+  to keep downward compatibility to older releases of the
+  IBM-MCA-SCSI-driver (older than driver-release 2.00 and older than
+  June 1997).
+
+  If you like to have the lowest SCSI-id assigned as drive C:, as
+  modern SCSI-BIOSes do, which does not conform to the standard, but
+  is widespread and common in the PC-world of today, you must say N
+  here. If unsure, say Y.
+
+Reset SCSI-devices at boot time
+CONFIG_IBMMCA_SCSI_DEV_RESET
+  By default, SCSI-devices are reset when the machine is powered on.
+  However, some devices exist, like special-control-devices,
+  SCSI-CNC-machines, SCSI-printer or scanners of older type, that do
+  not reset when switched on. If you say Y here, each device connected
+  to your SCSI-bus will be issued a reset-command after it has been
+  probed, while the kernel is booting. This may cause problems with
+  more modern devices, like hard disks, which do not appreciate these
+  reset commands, and can cause your system to hang. So say Y only if
+  you know that one of your older devices needs it; N is the safe
+  answer.
+
+NCR MCA 53C9x SCSI support
+CONFIG_SCSI_MCA_53C9X
+  Some MicroChannel machines, notably the NCR 35xx line, use a SCSI
+  controller based on the NCR 53C94.  This driver will allow use of
+  the controller on the 3550, and very possibly others.
+
+  If you want to compile this as a module (= code which can be
+  inserted and removed from the running kernel whenever you want), say
+  M here and read <file:Documentation/modules.txt>.  The module will
+  be called mca_53c9x.o.
+
+Always IN2000 SCSI support
+CONFIG_SCSI_IN2000
+  This is support for an ISA bus SCSI host adapter.  You'll find more
+  information in <file:drivers/scsi/README.in2000>. If it doesn't work
+  out of the box, you may have to change the jumpers for IRQ or
+  address selection.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called in2000.o.
+
+Initio 91XXU(W) SCSI support
+CONFIG_SCSI_INITIO
+  This is support for the Initio 91XXU(W) SCSI host adapter.  Please
+  read the SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called initio.o.
+
+PAS16 SCSI support
+CONFIG_SCSI_PAS16
+  This is support for a SCSI host adapter.  It is explained in section
+  3.10 of the SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.  If it doesn't work out
+  of the box, you may have to change some settings in
+  <file:drivers/scsi/pas16.h>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called pas16.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Initio INI-A100U2W SCSI support
+CONFIG_SCSI_INIA100
+  This is support for the Initio INI-A100U2W SCSI host adapter.
+  Please read the SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called a100u2w.o.
+
+PCI2000 support
+CONFIG_SCSI_PCI2000
+  This is support for the PCI2000I EIDE interface card which acts as a
+  SCSI host adapter.  Please read the SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module called pci2000.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+PCI2220i support
+CONFIG_SCSI_PCI2220I
+  This is support for the PCI2220i EIDE interface card which acts as a
+  SCSI host adapter.  Please read the SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module called pci2220i.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+PSI240i support
+CONFIG_SCSI_PSI240I
+  This is support for the PSI240i EIDE interface card which acts as a
+  SCSI host adapter.  Please read the SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module called psi240i.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Qlogic FAS SCSI support
+CONFIG_SCSI_QLOGIC_FAS
+  This is a driver for the ISA, VLB, and PCMCIA versions of the Qlogic
+  FastSCSI! cards as well as any other card based on the FASXX chip
+  (including the Control Concepts SCSI/IDE/SIO/PIO/FDC cards).
+
+  This driver does NOT support the PCI versions of these cards. The
+  PCI versions are supported by the Qlogic ISP driver ("Qlogic ISP
+  SCSI support"), below.
+
+  Information about this driver is contained in
+  <file:drivers/scsi/README.qlogicfas>.  You should also read the
+  SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called qlogicfas.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+Qlogic ISP SCSI support
+CONFIG_SCSI_QLOGIC_ISP
+  This driver works for all QLogic PCI SCSI host adapters (IQ-PCI,
+  IQ-PCI-10, IQ_PCI-D) except for the PCI-basic card.  (This latter
+  card is supported by the "AM53/79C974 PCI SCSI" driver.)
+
+  If you say Y here, make sure to choose "BIOS" at the question "PCI
+  access mode".
+
+  Please read the file <file:drivers/scsi/README.qlogicisp>.  You
+  should also read the SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called qlogicisp.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+Qlogic ISP FC SCSI support
+CONFIG_SCSI_QLOGIC_FC
+  This is a driver for the QLogic ISP2100 SCSI-FCP host adapter.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called qlogicfc.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+Include loadable firmware in driver
+CONFIG_SCSI_QLOGIC_FC_FIRMWARE
+  Say Y to include ISP2100 Fabric Initiator/Target Firmware, with
+  expanded LUN addressing and FcTape (FCP-2) support, in the
+  Qlogic QLA 1280 driver. This is required on some platforms.
+
+Qlogic QLA 1280 SCSI support
+CONFIG_SCSI_QLOGIC_1280
+  Say Y if you have a QLogic ISP1x80/1x160 SCSI host adapter.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called qla1280.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+Seagate ST-02 and Future Domain TMC-8xx SCSI support
+CONFIG_SCSI_SEAGATE
+  These are 8-bit SCSI controllers; the ST-01 is also supported by
+  this driver.  It is explained in section 3.9 of the SCSI-HOWTO,
+  available from <http://www.tldp.org/docs.html#howto>.  If it
+  doesn't work out of the box, you may have to change some settings in
+  <file:drivers/scsi/seagate.h>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called seagate.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Trantor T128/T128F/T228 SCSI support
+CONFIG_SCSI_T128
+  This is support for a SCSI host adapter. It is explained in section
+  3.11 of the SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.  If it doesn't work out
+  of the box, you may have to change some settings in
+  <file:drivers/scsi/t128.h>.  Note that Trantor was purchased by
+  Adaptec, and some former Trantor products are being sold under the
+  Adaptec name.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called t128.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+UltraStor SCSI support
+CONFIG_SCSI_ULTRASTOR
+  This is support for the UltraStor 14F, 24F and 34F SCSI-2 host
+  adapter family.  This driver is explained in section 3.12 of the
+  SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.  If it doesn't work out
+  of the box, you may have to change some settings in
+  <file:drivers/scsi/ultrastor.h>.
+
+  Note that there is also another driver for the same hardware:
+  "UltraStor 14F/34F support", above.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ultrastor.o.
+
+7000FASST SCSI support
+CONFIG_SCSI_7000FASST
+  This driver supports the Western Digital 7000 SCSI host adapter
+  family.  Some information is in the source:
+  <file:drivers/scsi/wd7000.c>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called wd7000.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+ACARD SCSI support
+CONFIG_SCSI_ACARD
+  This driver supports the ACARD 870U/W SCSI host adapter.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called atp870u.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+EATA ISA/EISA/PCI (DPT and generic EATA/DMA-compliant boards) support
+CONFIG_SCSI_EATA
+  This driver supports all EATA/DMA-compliant SCSI host adapters.  DPT
+  ISA and all EISA I/O addresses are probed looking for the "EATA"
+  signature.  If you chose "BIOS" at the question "PCI access mode",
+  the addresses of all the PCI SCSI controllers reported by the PCI
+  subsystem are probed as well.
+
+  You want to read the start of <file:drivers/scsi/eata.c> and the
+  SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  Note that there is also another driver for the same hardware
+  available: "EATA-DMA [Obsolete] (DPT, NEC, AT&T, SNI, AST, Olivetti,
+  Alphatronix) support". You should say Y to only one of them.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called eata.o.
+
+enable tagged command queueing
+CONFIG_SCSI_EATA_TAGGED_QUEUE
+  This is a feature of SCSI-2 which improves performance: the host
+  adapter can send several SCSI commands to a device's queue even if
+  previous commands haven't finished yet. Most EATA adapters negotiate
+  this feature automatically with the device, even if your answer is
+  N. The safe answer is N.
+
+enable elevator sorting
+CONFIG_SCSI_EATA_LINKED_COMMANDS
+  This option enables elevator sorting for all probed SCSI disks and
+  CD-ROMs. It definitely reduces the average seek distance when doing
+  random seeks, but this does not necessarily result in a noticeable
+  performance improvement: your mileage may vary...
+  The safe answer is N.
+
+maximum number of queued commands
+CONFIG_SCSI_EATA_MAX_TAGS
+  This specifies how many SCSI commands can be maximally queued for
+  each probed SCSI device. You should reduce the default value of 16
+  only if you have disks with buggy or limited tagged command support.
+  Minimum is 2 and maximum is 62. This value is also the window size
+  used by the elevator sorting option above. The effective value used
+  by the driver for each probed SCSI device is reported at boot time.
+
+NCR53c406a SCSI support
+CONFIG_SCSI_NCR53C406A
+  This is support for the NCR53c406a SCSI host adapter.  For user
+  configurable parameters, check out <file:drivers/scsi/NCR53c406a.c>
+  in the kernel source.  Also read the SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called NCR53c406.o.
+
+Symbios 53c416 SCSI support
+CONFIG_SCSI_SYM53C416
+  This is support for the sym53c416 SCSI host adapter, the SCSI
+  adapter that comes with some HP scanners. This driver requires that
+  the sym53c416 is configured first using some sort of PnP
+  configuration program (e.g. isapnp) or by a PnP aware BIOS. If you
+  are using isapnp then you need to compile this driver as a module
+  and then load it using insmod after isapnp has run. The parameters
+  of the configured card(s) should be passed to the driver. The format
+  is:
+
+    insmod sym53c416 sym53c416=<base>,<irq> [sym53c416_1=<base>,<irq>]
+
+  There is support for up to four adapters. If you want to compile
+  this driver as a module ( = code which can be inserted in and
+  removed from the running kernel whenever you want), say M here and
+  read <file:Documentation/modules.txt>. The module will be called
+  sym53c416.o.
+
+Simple 53c710 SCSI support (Compaq, NCR machines)
+CONFIG_SCSI_SIM710
+  This is a simple driver for NCR53c710 based SCSI host adapters.
+
+  More complex drivers for this chip are available ("NCR53c7,8xx SCSI
+  support", above), but they require that the scsi chip be able to do
+  DMA block moves between memory and on-chip registers, which can
+  cause problems under certain conditions.  This driver is designed to
+  avoid these problems and is intended to work with any Intel machines
+  using 53c710 chips, including various Compaq and NCR machines.
+
+  Please read the comments at the top of the file
+  <file:drivers/scsi/sim710.c> for more information.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called sim710.o.
+
+Tekram DC390(T) and Am53/79C974 SCSI support
+CONFIG_SCSI_DC390T
+  This driver supports PCI SCSI host adapters based on the Am53C974A
+  chip, e.g. Tekram DC390(T), DawiControl 2974 and some onboard
+  PCscsi/PCnet (Am53/79C974) solutions.
+
+  Documentation can be found in <file:drivers/scsi/README.tmscsim>.
+
+  Note that this driver does NOT support Tekram DC390W/U/F, which are
+  based on NCR/Symbios chips. Use "NCR53C8XX SCSI support" for those.
+  Also note that there is another generic Am53C974 driver,
+  "AM53/79C974 PCI SCSI support" below.  You can pick either one.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called tmscsim.o.
+
+Omit support for other Am53/79C974 based SCSI adapters
+CONFIG_SCSI_DC390T_NOGENSUPP
+  If you say N here, the DC390(T) SCSI driver relies on the DC390
+  EEPROM to get initial values for its settings, such as speed,
+  termination, etc.  If it can't find this EEPROM, it will use
+  defaults or the user supplied boot/module parameters.  For details
+  on driver configuration see <file:drivers/scsi/README.tmscsim>.
+
+  If you say Y here and if no EEPROM is found, the driver gives up and
+  thus only supports Tekram DC390(T) adapters.  This can be useful if
+  you have a DC390(T) and another Am53C974 based adapter, which, for
+  some reason, you want to drive with the other AM53C974 driver.
+
+  If unsure, say N.
+
+AM53/79C974 PCI SCSI support
+CONFIG_SCSI_AM53C974
+  This is support for the AM53/79C974 SCSI host adapters.  Please read
+  <file:drivers/scsi/README.AM53C974> for details.  Also, the
+  SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>, is for you.
+
+  Note that there is another driver for AM53C974 based adapters:
+  "Tekram DC390(T) and Am53/79C974 (PCscsi) SCSI support", above.  You
+  can pick either one.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called AM53C974.o.
+
+AMI MegaRAID support
+CONFIG_SCSI_MEGARAID
+  This driver supports the AMI MegaRAID 418, 428, 438, 466, 762, 490
+  and 467 SCSI host adapters.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called megaraid.o.
+
+Intel/ICP (former GDT SCSI Disk Array) RAID Controller support
+CONFIG_SCSI_GDTH
+  Formerly called GDT SCSI Disk Array Controller Support.
+  This is a driver for RAID/SCSI Disk Array Controllers (EISA/ISA/PCI) 
+  manufactured by Intel/ICP vortex (an Intel Company). It is documented
+  in the kernel source in <file:drivers/scsi/gdth.c> and
+  <file:drivers/scsi/gdth.h.>
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called gdth.o.
+
+IOMEGA parallel port (ppa - older drives)
+CONFIG_SCSI_PPA
+  This driver supports older versions of IOMEGA's parallel port ZIP
+  drive (a 100 MB removable media device).
+
+  Note that you can say N here if you have the SCSI version of the ZIP
+  drive: it will be supported automatically if you said Y to the
+  generic "SCSI disk support", above.
+
+  If you have the ZIP Plus drive or a more recent parallel port ZIP
+  drive (if the supplied cable with the drive is labeled "AutoDetect")
+  then you should say N here and Y to "IOMEGA parallel port (imm -
+  newer drives)", below.
+
+  For more information about this driver and how to use it you should
+  read the file <file:drivers/scsi/README.ppa>.  You should also read
+  the SCSI-HOWTO, which is available from
+  <http://www.tldp.org/docs.html#howto>.  If you use this driver,
+  you will still be able to use the parallel port for other tasks,
+  such as a printer; it is safe to compile both drivers into the
+  kernel.
+
+  This driver is also available as a module which can be inserted in
+  and removed from the running kernel whenever you want.  To compile
+  this driver as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called ppa.o.
+
+IOMEGA parallel port (imm - newer drives)
+CONFIG_SCSI_IMM
+  This driver supports newer versions of IOMEGA's parallel port ZIP
+  drive (a 100 MB removable media device).
+
+  Note that you can say N here if you have the SCSI version of the ZIP
+  drive: it will be supported automatically if you said Y to the
+  generic "SCSI disk support", above.
+
+  If you have the ZIP Plus drive or a more recent parallel port ZIP
+  drive (if the supplied cable with the drive is labeled "AutoDetect")
+  then you should say Y here; if you have an older ZIP drive, say N
+  here and Y to "IOMEGA Parallel Port (ppa - older drives)", above.
+
+  For more information about this driver and how to use it you should
+  read the file <file:drivers/scsi/README.ppa>.  You should also read
+  the SCSI-HOWTO, which is available from
+  <http://www.tldp.org/docs.html#howto>.  If you use this driver,
+  you will still be able to use the parallel port for other tasks,
+  such as a printer; it is safe to compile both drivers into the
+  kernel.
+
+  This driver is also available as a module which can be inserted in
+  and removed from the running kernel whenever you want.  To compile
+  this driver as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called imm.o.
+
+Force the Iomega ZIP drivers to use EPP-16
+CONFIG_SCSI_IZIP_EPP16
+  EPP (Enhanced Parallel Port) is a standard for parallel ports which
+  allows them to act as expansion buses that can handle up to 64
+  peripheral devices.
+
+  Some parallel port chipsets are slower than their motherboard, and
+  so we have to control the state of the chipset's FIFO queue every
+  now and then to avoid data loss. This will be done if you say Y
+  here.
+
+  Generally, saying Y is the safe option and slows things down a bit.
+
+Assume slow parallel port control register
+CONFIG_SCSI_IZIP_SLOW_CTR
+  Some parallel ports are known to have excessive delays between
+  changing the parallel port control register and good data being
+  available on the parallel port data/status register. This option
+  forces a small delay (1.0 usec to be exact) after changing the
+  control register to let things settle out. Enabling this option may
+  result in a big drop in performance but some very old parallel ports
+  (found in 386 vintage machines) will not work properly.
+
+  Generally, saying N is fine.
+
+SCSI debugging host simulator
+CONFIG_SCSI_DEBUG
+  This is a host adapter simulator that can be programmed to simulate
+  a large number of conditions that could occur on a real bus. The
+  advantage is that many hard to reproduce problems can be tested in a
+  controlled environment where there is reduced risk of losing
+  important data. This is primarily of use to people trying to debug
+  the middle and upper layers of the SCSI subsystem. If unsure, say N.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called scsi_debug.o.
+
+Fibre Channel and FC4 SCSI support
+CONFIG_FC4
+  Fibre Channel is a high speed serial protocol mainly used to
+  connect large storage devices to the computer; it is compatible with
+  and intended to replace SCSI.
+
+  This is an experimental support for storage arrays connected to your
+  computer using optical fibre cables and the "X3.269-199X Fibre
+  Channel Protocol for SCSI" specification. If you want to use this,
+  you need to say Y here and to "SCSI support" as well as to the
+  drivers for the storage array itself and for the interface adapter
+  such as SOC or SOC+. This subsystem could even serve for IP
+  networking, with some code extensions.
+
+  If unsure, say N.
+
+Sun SOC/Sbus
+CONFIG_FC4_SOC
+  Serial Optical Channel is an interface card with one or two Fibre
+  Optic ports, each of which can be connected to a disk array. Note
+  that if you have older firmware in the card, you'll need the
+  microcode from the Solaris driver to make it work.
+
+  This support is also available as a module called soc.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Sun SOC+ (aka SOCAL)
+CONFIG_FC4_SOCAL
+  Serial Optical Channel Plus is an interface card with up to two
+  Fibre Optic ports. This card supports FC Arbitrated Loop (usually
+  A5000 or internal FC disks in E[3-6]000 machines through the
+  Interface Board). You'll probably need the microcode from the
+  Solaris driver to make it work.
+
+  This support is also available as a module called socal.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+SparcSTORAGE Array 100 and 200 series
+CONFIG_SCSI_PLUTO
+  If you never bought a disk array made by Sun, go with N.
+
+  This support is also available as a module called pluto.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Sun Enterprise Network Array (A5000 and EX500)
+CONFIG_SCSI_FCAL
+  This driver drives FC-AL disks connected through a Fibre Channel
+  card using the drivers/fc4 layer (currently only SOCAL). The most
+  common is either A5000 array or internal disks in E[3-6]000
+  machines.
+
+  This support is also available as a module called fcal.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>. If unsure, say N.
+
+Acorn SCSI card (aka30) support
+CONFIG_SCSI_ACORNSCSI_3
+  This enables support for the Acorn SCSI card (aka30). If you have an
+  Acorn system with one of these, say Y. If unsure, say N.
+
+Support SCSI 2 Tagged queueing
+CONFIG_SCSI_ACORNSCSI_TAGGED_QUEUE
+  Say Y here to enable tagged queuing support on the Acorn SCSI card.
+
+  This is a feature of SCSI-2 which improves performance: the host
+  adapter can send several SCSI commands to a device's queue even if
+  previous commands haven't finished yet. Some SCSI devices don't
+  implement this properly, so the safe answer is N.
+
+Support SCSI 2 Synchronous Transfers
+CONFIG_SCSI_ACORNSCSI_SYNC
+  Say Y here to enable synchronous transfer negotiation with all
+  targets on the Acorn SCSI card.
+
+  In general, this improves performance; however some SCSI devices
+  don't implement it properly, so the safe answer is N.
+
+ARXE SCSI support
+CONFIG_SCSI_ARXESCSI
+  Around 1991, Arxe Systems Limited released a high density floppy
+  disc interface for the Acorn Archimedes range, to allow the use of
+  HD discs from the then new A5000 on earlier models. This interface
+  was either sold on its own or with an integral SCSI controller.
+  Technical details on this NCR53c94-based device are available at
+  <http://www.cryton.demon.co.uk/acornbits/scsi_arxe.html>
+  Say Y here to compile in support for the SCSI controller.
+
+Oak SCSI support
+CONFIG_SCSI_OAK1
+  This enables support for the Oak SCSI card. If you have an Acorn
+  system with one of these, say Y. If unsure, say N.
+
+Cumana SCSI I support
+CONFIG_SCSI_CUMANA_1
+  This enables support for the Cumana SCSI I card. If you have an
+  Acorn system with one of these, say Y. If unsure, say N.
+
+Cumana SCSI II support
+CONFIG_SCSI_CUMANA_2
+  This enables support for the Cumana SCSI II card. If you have an
+  Acorn system with one of these, say Y. If unsure, say N.
+
+EcoSCSI support
+CONFIG_SCSI_ECOSCSI
+  This enables support for the EcoSCSI card -- a small card that sits
+  in the Econet socket. If you have an Acorn system with one of these,
+  say Y. If unsure, say N.
+
+EESOX SCSI support
+CONFIG_SCSI_EESOXSCSI
+  This enables support for the EESOX SCSI card. If you have an Acorn
+  system with one of these, say Y, otherwise say N.
+
+PowerTec SCSI support
+CONFIG_SCSI_POWERTECSCSI
+  This enables support for the Powertec SCSI card on Acorn systems. If
+  you have one of these, say Y. If unsure, say N.
+
+IEEE 1394 (FireWire) support
+CONFIG_IEEE1394
+  IEEE 1394 describes a high performance serial bus, which is also
+  known as FireWire(tm) or i.Link(tm) and is used for connecting all
+  sorts of devices (most notably digital video cameras) to your
+  computer.
+
+  If you have FireWire hardware and want to use it, say Y here.  This
+  is the core support only, you will also need to select a driver for
+  your IEEE 1394 adapter.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ieee1394.o.
+
+Texas Instruments PCILynx support
+CONFIG_IEEE1394_PCILYNX
+  Say Y here if you have an IEEE-1394 controller with the Texas
+  Instruments PCILynx chip.  Note: this driver is written for revision
+  2 of this chip and may not work with revision 0.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called pcilynx.o.
+
+Use local RAM on PCILynx board
+CONFIG_IEEE1394_PCILYNX_LOCALRAM
+  This option makes the PCILynx driver use local RAM available on some
+  PCILynx setups for Packet Control Lists. Local RAM is random access
+  memory which resides on the PCILynx board as opposed to on your
+  computer's motherboard. Local RAM may speed up command processing
+  because no PCI transfers are necessary during use of the Packet
+  Control Lists.
+
+  Note that there are no known PCILynx systems providing local RAM
+  except for the evaluation boards by Texas Instruments and that the
+  PCILynx does not reliably report missing RAM. This means that it is
+  dangerous to say Y here if you are not absolutely sure that your
+  board provides 64KB of local RAM.
+
+  If unsure, say N.
+
+Support for non-IEEE1394 local ports
+CONFIG_IEEE1394_PCILYNX_PORTS
+  This option enables driver code to access the RAM, ROM and AUX ports
+  of the PCILynx through character devices in /dev.  If you don't know
+  what this is about then you won't need it.
+
+  If unsure, say N.
+
+#Adaptec AIC-5800 IEEE 1394 support
+#CONFIG_IEEE1394_AIC5800
+#  Say Y here if you have a IEEE 1394 controller using the Adaptec
+#  AIC-5800 chip.  All Adaptec host adapters (89xx series) use this
+#  chip, as well as miro's DV boards.
+#
+#  If you want to compile this as a module ( = code which can be
+#  inserted in and removed from the running kernel whenever you want),
+#  say M here and read <file:Documentation/modules.txt>.  The module
+#  will be called aic5800.o.
+#
+OHCI-1394 (Open Host Controller Interface) support
+CONFIG_IEEE1394_OHCI1394
+  Enable this driver if you have an IEEE 1394 controller based on the
+  OHCI-1394 specification. The current driver is only tested with OHCI
+  chipsets made by Texas Instruments and NEC. Most third-party vendors
+  use one of these chipsets.  It should work with any OHCI-1394
+  compliant card, however.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ohci1394.o.
+
+OHCI-1394 Video support
+CONFIG_IEEE1394_VIDEO1394
+  This option enables video device usage for OHCI-1394 cards.  Enable
+  this option only if you have an IEEE 1394 video device connected to
+  an OHCI-1394 card.
+
+SBP-2 support (Harddisks etc.)
+CONFIG_IEEE1394_SBP2
+  This option enables you to use SBP-2 devices connected to your IEEE
+  1394 bus.  SBP-2 devices include harddrives and DVD devices.
+
+Raw IEEE 1394 I/O support
+CONFIG_IEEE1394_RAWIO
+  Say Y here if you want support for the raw device. This is generally
+  a good idea, so you should say Y here. The raw device enables
+  direct communication of user programs with the IEEE 1394 bus and
+  thus with the attached peripherals.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called raw1394.o.
+
+Excessive debugging output
+CONFIG_IEEE1394_VERBOSEDEBUG
+  If you say Y here, you will get very verbose debugging logs from the
+  subsystem which includes a dump of the header of every sent and
+  received packet.  This can amount to a high amount of data collected
+  in a very short time which is usually also saved to disk by the
+  system logging daemons.
+
+  Say Y if you really want or need the debugging output, everyone else
+  says N.
+
+Network device support
+CONFIG_NETDEVICES
+  You can say N here if you don't intend to connect your Linux box to
+  any other computer at all or if all your connections will be over a
+  telephone line with a modem either via UUCP (UUCP is a protocol to
+  forward mail and news between unix hosts over telephone lines; read
+  the UUCP-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>) or dialing up a shell
+  account or a BBS, even using term (term is a program which gives you
+  almost full Internet connectivity if you have a regular dial up
+  shell account on some Internet connected Unix computer. Read
+  <http://www.bart.nl/~patrickr/term-howto/Term-HOWTO.html>).
+
+  You'll have to say Y if your computer contains a network card that
+  you want to use under Linux (make sure you know its name because you
+  will be asked for it and read the Ethernet-HOWTO (especially if you
+  plan to use more than one network card under Linux)) or if you want
+  to use SLIP (Serial Line Internet Protocol is the protocol used to
+  send Internet traffic over telephone lines or null modem cables) or
+  CSLIP (compressed SLIP) or PPP (Point to Point Protocol, a better
+  and newer replacement for SLIP) or PLIP (Parallel Line Internet
+  Protocol is mainly used to create a mini network by connecting the
+  parallel ports of two local machines) or AX.25/KISS (protocol for
+  sending Internet traffic over amateur radio links).
+
+  Make sure to read the NET-3-HOWTO. Eventually, you will have to read
+  Olaf Kirch's excellent and free book "Network Administrator's
+  Guide", to be found in <http://www.tldp.org/docs.html#guide>. If
+  unsure, say Y.
+
+Dummy net driver support
+CONFIG_DUMMY
+  This is essentially a bit-bucket device (i.e. traffic you send to
+  this device is consigned into oblivion) with a configurable IP
+  address. It is most commonly used in order to make your currently
+  inactive SLIP address seem like a real address for local programs.
+  If you use SLIP or PPP, you might want to say Y here. Since this
+  thing often comes in handy, the default is Y. It won't enlarge your
+  kernel either. What a deal. Read about it in the Network
+  Administrator's Guide, available from
+  <http://www.tldp.org/docs.html#guide>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called dummy.o.  If you want to use more than one dummy
+  device at a time, you need to compile this driver as a module.
+  Instead of 'dummy', the devices will then be called 'dummy0',
+  'dummy1' etc.
+
+Bonding driver support
+CONFIG_BONDING
+  Say 'Y' or 'M' if you wish to be able to 'bond' multiple Ethernet
+  Channels together. This is called 'Etherchannel' by Cisco,
+  'Trunking' by Sun, and 'Bonding' in Linux.
+
+  If you have two Ethernet connections to some other computer, you can
+  make them behave like one double speed connection using this driver.
+  Naturally, this has to be supported at the other end as well, either
+  with a similar Bonding Linux driver, a Cisco 5500 switch or a
+  SunTrunking SunSoft driver.
+
+  This is similar to the EQL driver, but it merges Ethernet segments
+  instead of serial lines.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called bonding.o.
+
+SLIP (serial line) support
+CONFIG_SLIP
+  Say Y if you intend to use SLIP or CSLIP (compressed SLIP) to
+  connect to your Internet service provider or to connect to some
+  other local Unix box or if you want to configure your Linux box as a
+  Slip/CSlip server for other people to dial in. SLIP (Serial Line
+  Internet Protocol) is a protocol used to send Internet traffic over
+  serial connections such as telephone lines or null modem cables;
+  nowadays, the protocol PPP is more commonly used for this same
+  purpose.
+
+  Normally, your access provider has to support SLIP in order for you
+  to be able to use it, but there is now a SLIP emulator called SLiRP
+  around (available from
+  <ftp://ibiblio.org/pub/Linux/system/network/serial/>) which
+  allows you to use SLIP over a regular dial up shell connection. If
+  you plan to use SLiRP, make sure to say Y to CSLIP, below. The
+  NET-3-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>, explains how to
+  configure SLIP. Note that you don't need this option if you just
+  want to run term (term is a program which gives you almost full
+  Internet connectivity if you have a regular dial up shell account on
+  some Internet connected Unix computer. Read
+  <http://www.bart.nl/~patrickr/term-howto/Term-HOWTO.html>). SLIP
+  support will enlarge your kernel by about 4 KB. If unsure, say N.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>. The module will be
+  called slip.o.
+
+CSLIP compressed headers
+CONFIG_SLIP_COMPRESSED
+  This protocol is faster than SLIP because it uses compression on the
+  TCP/IP headers (not on the data itself), but it has to be supported
+  on both ends. Ask your access provider if you are not sure and
+  answer Y, just in case. You will still be able to use plain SLIP. If
+  you plan to use SLiRP, the SLIP emulator (available from
+  <ftp://ibiblio.org/pub/Linux/system/network/serial/>) which
+  allows you to use SLIP over a regular dial up shell connection, you
+  definitely want to say Y here. The NET-3-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>, explains how to configure
+  CSLIP. This won't enlarge your kernel.
+
+Keepalive and linefill
+CONFIG_SLIP_SMART
+  Adds additional capabilities to the SLIP driver to support the
+  RELCOM line fill and keepalive monitoring. Ideal on poor quality
+  analogue lines.
+
+Six bit SLIP encapsulation
+CONFIG_SLIP_MODE_SLIP6
+  Just occasionally you may need to run IP over hostile serial
+  networks that don't pass all control characters or are only seven
+  bit. Saying Y here adds an extra mode you can use with SLIP:
+  "slip6". In this mode, SLIP will only send normal ASCII symbols over
+  the serial device. Naturally, this has to be supported at the other
+  end of the link as well. It's good enough, for example, to run IP
+  over the async ports of a Camtec JNT Pad. If unsure, say N.
+
+PPP (point-to-point protocol) support
+CONFIG_PPP
+  PPP (Point to Point Protocol) is a newer and better SLIP.  It serves
+  the same purpose: sending Internet traffic over telephone (and other
+  serial) lines.  Ask your access provider if they support it, because
+  otherwise you can't use it; most Internet access providers these
+  days support PPP rather than SLIP.
+
+  To use PPP, you need an additional program called pppd as described
+  in the PPP-HOWTO, available at
+  <http://www.tldp.org/docs.html#howto>.  Make sure that you have
+  the version of pppd recommended in <file:Documentation/Changes>.
+  The PPP option enlarges your kernel by about 16 KB.
+
+  There are actually two versions of PPP: the traditional PPP for
+  asynchronous lines, such as regular analog phone lines, and
+  synchronous PPP which can be used over digital ISDN lines for
+  example.  If you want to use PPP over phone lines or other
+  asynchronous serial lines, you need to say Y (or M) here and also to
+  the next option, "PPP support for async serial ports".  For PPP over
+  synchronous lines, you should say Y (or M) here and to "Support
+  synchronous PPP", below.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you said Y to "Version information on all symbols" above, then
+  you cannot compile the PPP driver into the kernel; you can then only
+  compile it as a module.  The module will be called ppp_generic.o.
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.
+
+PPP multilink support
+CONFIG_PPP_MULTILINK
+  PPP multilink is a protocol (defined in RFC 1990) which allows you
+  to combine several (logical or physical) lines into one logical PPP
+  connection, so that you can utilize your full bandwidth.
+
+  This has to be supported at the other end as well and you need a
+  version of the pppd daemon which understands the multilink protocol.
+
+  If unsure, say N.
+
+PPP filtering
+CONFIG_PPP_FILTER
+  Say Y here if you want to be able to filter the packets passing over
+  PPP interfaces.  This allows you to control which packets count as
+  activity (i.e. which packets will reset the idle timer or bring up
+  a demand-dialled link) and which packets are to be dropped entirely.
+  You need to say Y here if you wish to use the pass-filter and
+  active-filter options to pppd.
+
+  If unsure, say N.
+
+PPP support for async serial ports
+CONFIG_PPP_ASYNC
+  Say Y (or M) here if you want to be able to use PPP over standard
+  asynchronous serial ports, such as COM1 or COM2 on a PC.  If you use
+  a modem (not a synchronous or ISDN modem) to contact your ISP, you
+  need this option.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ppp_async.o.
+
+  If unsure, say Y.
+
+PPP support for sync tty ports
+CONFIG_PPP_SYNC_TTY
+  Say Y (or M) here if you want to be able to use PPP over synchronous
+  (HDLC) tty devices, such as the SyncLink adapter. These devices
+  are often used for high-speed leased lines like T1/E1.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ppp_synctty.o.
+
+PPP Deflate compression
+CONFIG_PPP_DEFLATE
+  Support for the Deflate compression method for PPP, which uses the
+  Deflate algorithm (the same algorithm that gzip uses) to compress
+  each PPP packet before it is sent over the wire.  The machine at the
+  other end of the PPP link (usually your ISP) has to support the
+  Deflate compression method as well for this to be useful.  Even if
+  they don't support it, it is safe to say Y here.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ppp_deflate.o.
+
+PPP BSD-Compress compression
+CONFIG_PPP_BSDCOMP
+  Support for the BSD-Compress compression method for PPP, which uses
+  the LZW compression method to compress each PPP packet before it is
+  sent over the wire. The machine at the other end of the PPP link
+  (usually your ISP) has to support the BSD-Compress compression
+  method as well for this to be useful. Even if they don't support it,
+  it is safe to say Y here.
+
+  The PPP Deflate compression method ("PPP Deflate compression",
+  above) is preferable to BSD-Compress, because it compresses better
+  and is patent-free.
+
+  Note that the BSD compression code will always be compiled as a
+  module; it is called bsd_comp.o and will show up in the directory
+  modules once you have said "make modules". If unsure, say N.
+
+PPP over Ethernet
+CONFIG_PPPOE
+  Support for PPP over Ethernet.
+
+  This driver requires the current pppd from the "ppp" CVS repository
+  on cvs.samba.org.  The required support will be present in the next
+  ppp release (2.4.2).
+
+Wireless LAN (non-hamradio)
+CONFIG_NET_RADIO
+  Support for wireless LANs and everything having to do with radio,
+  but not with amateur radio or FM broadcasting.
+
+  Saying Y here also enables the Wireless Extensions (creates
+  /proc/net/wireless and enables ifconfig access). The Wireless
+  Extension is a generic API allowing a driver to expose to the user
+  space configuration and statistics specific to common Wireless LANs.
+  The beauty of it is that a single set of tool can support all the
+  variations of Wireless LANs, regardless of their type (as long as
+  the driver supports Wireless Extension). Another advantage is that
+  these parameters may be changed on the fly without restarting the
+  driver (or Linux). If you wish to use Wireless Extensions with
+  wireless PCMCIA (PC-) cards, you need to say Y here; you can fetch
+  the tools from
+  <http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html>.
+
+  Some user-level drivers for scarab devices which don't require
+  special kernel support are available from
+  <ftp://shadow.cabi.net/pub/Linux/>.
+
+STRIP (Metricom Starmode radio IP)
+CONFIG_STRIP
+  Say Y if you have a Metricom radio and intend to use Starmode Radio
+  IP. STRIP is a radio protocol developed for the MosquitoNet project
+  (on the WWW at <http://mosquitonet.stanford.edu/>) to send Internet
+  traffic using Metricom radios.  Metricom radios are small, battery
+  powered, 100kbit/sec packet radio transceivers, about the size and
+  weight of a cellular telephone. (You may also have heard them called
+  "Metricom modems" but we avoid the term "modem" because it misleads
+  many people into thinking that you can plug a Metricom modem into a
+  phone line and use it as a modem.)
+
+  You can use STRIP on any Linux machine with a serial port, although
+  it is obviously most useful for people with laptop computers. If you
+  think you might get a Metricom radio in the future, there is no harm
+  in saying Y to STRIP now, except that it makes the kernel a bit
+  bigger.
+
+  You can also compile this as a module ( = code which can be inserted
+  in and removed from the running kernel whenever you want), say M
+  here and read <file:Documentation/modules.txt>.  The module will be
+  called strip.o.
+
+AT&T WaveLAN & DEC RoamAbout DS support
+CONFIG_WAVELAN
+  The Lucent WaveLAN (formerly NCR and AT&T; or DEC RoamAbout DS) is
+  a Radio LAN (wireless Ethernet-like Local Area Network) using the
+  radio frequencies 900 MHz and 2.4 GHz.
+
+  This driver support the ISA version of the WaveLAN card.  A separate
+  driver for the PCMCIA (PC-card) hardware is available in David
+  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
+  for location).
+
+  If you want to use an ISA WaveLAN card under Linux, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>. Some more specific
+  information is contained in
+  <file:Documentation/networking/wavelan.txt> and in the source code
+  <file:drivers/net/wavelan.p.h>.
+
+  You will also need the wireless tools package available from
+  <http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html>.
+  Please read the man pages contained therein.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called wavelan.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+Aironet Arlan 655 & IC2200 DS support
+CONFIG_ARLAN
+  Aironet makes Arlan, a class of wireless LAN adapters. These use the
+  www.Telxon.com chip, which is also used on several similar cards.
+  This driver is tested on the 655 and IC2200 series cards. Look at
+  <http://www.ylenurme.ee/~elmer/655/> for the latest information.
+
+  The driver is built as two modules, arlan and arlan-proc. The latter
+  is the /proc interface and is not needed most of time.
+
+  On some computers the card ends up in non-valid state after some
+  time. Use a ping-reset script to clear it.
+
+Aironet 4500/4800 series adapters
+CONFIG_AIRONET4500
+  www.aironet.com (recently bought by Cisco) makes these 802.11 DS
+  adapters.  Driver by Elmer Joandi (elmer@ylenurme.ee).
+
+  Say Y here if you have such an adapter, and then say Y below to
+  the option that applies to your particular type of card (PCI, ISA,
+  or PCMCIA).
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called aironet4500_core.o. If you want to
+  compile it as a module, say M here and read
+  <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.
+
+  quick config parameters:
+       SSID=tsunami - "The Password"
+       adhoc=1         there are no Access Points around
+       master=1        Adhoc master (the one who creates network
+                        sync)
+       slave=1         Adhoc slave (btw, it is still forming own net
+                       sometimes, and has problems with firmware...
+                       change IbssJoinNetTimeout from /proc...)
+       channel=1..?    meaningful in adhoc mode
+
+  If you have problems with screwing up card, both_bap_lock=1 is a
+  conservative value (performance hit 15%).
+
+  All other parameters can be set via the proc interface.
+
+Aironet 4500/4800 ISA/PCI/PNP/365 support
+CONFIG_AIRONET4500_NONCS
+  If you have an ISA, PCI or PCMCIA Aironet 4500/4800 wireless LAN
+  card, say Y here, and then also to the options below that apply
+  to you.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called aironet4500_card.o.  If you want to
+  compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+Aironet 4500/4800 PNP support
+CONFIG_AIRONET4500_PNP
+  If you have an ISA Aironet 4500/4800 card which you want to use in
+  PnP (Plug and Play) mode, say Y here. This is the recommended mode
+  for ISA cards. Remember however to enable the PnP jumper on the
+  board if you say Y here.
+
+Aironet 4500/4800 PCI support
+CONFIG_AIRONET4500_PCI
+  If you have an PCI Aironet 4500/4800 card, say Y here.
+
+Aironet 4500/4800 ISA broken support
+CONFIG_AIRONET4500_ISA
+  If you have an ISA Aironet 4500/4800 card which you want to run in
+  non-PnP mode, say Y here. This is not recommended and does not work
+  correctly at this point. Say N.
+
+Aironet 4500/4800 I365 broken support
+CONFIG_AIRONET4500_I365
+  If you have a PCMCIA Aironet 4500/4800 card which you want to use
+  without the standard PCMCIA cardservices provided by the pcmcia-cs
+  package, say Y here. This is not recommended, so say N.
+
+Aironet 4500/4800 PCMCIA support
+CONFIG_AIRONET4500_CS
+  Say Y here if you have a PCMCIA Aironet 4500/4800 card which you
+  want to use with the standard PCMCIA cardservices provided by the
+  pcmcia-cs package.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called aironet4500_cs.o. If you want to
+  compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+Aironet 4500/4800 PROC interface
+CONFIG_AIRONET4500_PROC
+  If you say Y here (and to the "/proc file system" below), you will
+  be able to configure your Aironet card via the
+  /proc/sys/aironet4500 interface.
+
+  Additional info: look in <file:drivers/net/aironet4500_rid.c>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called aironet4500_proc.o. If you want to
+  compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+  NOTE: the proc interface uses a lot of memory, so it is recommended
+        to compile it as a module and remove the module after
+        configuration.
+
+LAPB over Ethernet driver
+CONFIG_LAPBETHER
+  This is a driver for a pseudo device (typically called /dev/lapb0)
+  which allows you to open an LAPB point-to-point connection to some
+  other computer on your Ethernet network.  In order to do this, you
+  need to say Y or M to the driver for your Ethernet card as well as
+  to "LAPB Data Link Driver".
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called lapbether.o.  If unsure, say N.
+
+X.25 async driver
+CONFIG_X25_ASY
+  This is a driver for sending and receiving X.25 frames over regular
+  asynchronous serial lines such as telephone lines equipped with
+  ordinary modems.  Experts should note that this driver doesn't
+  currently comply with the asynchronous HDLS framing protocols in
+  CCITT recommendation X.25.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called x25_asy.o.  If unsure, say N.
+
+PCMCIA network device support
+CONFIG_NET_PCMCIA
+  Say Y if you would like to include support for any PCMCIA or CardBus
+  network adapters, then say Y to the driver for your particular card
+  below.  PCMCIA- or PC-cards are credit-card size devices often used
+  with laptops computers; CardBus is the newer and faster version of
+  PCMCIA.
+
+  To use your PC-cards, you will need supporting software from David
+  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
+  for location).  You also want to check out the PCMCIA-HOWTO,
+  available from <http://www.tldp.org/docs.html#howto>.
+
+  If unsure, say N.
+
+3Com 3c589 PCMCIA support
+CONFIG_PCMCIA_3C589
+  Say Y here if you intend to attach a 3Com 3c589 or compatible PCMCIA
+  (PC-card) Ethernet card to your computer.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called 3c589_cs.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>. If
+  unsure, say N.
+
+3Com 3c574 PCMCIA support
+CONFIG_PCMCIA_3C574
+  Say Y here if you intend to attach a 3Com 3c574 or compatible PCMCIA
+  (PC-card) Fast Ethernet card to your computer.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called 3c574_cs.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.  If
+  unsure, say N.
+
+Fujitsu FMV-J18x PCMCIA support
+CONFIG_PCMCIA_FMVJ18X
+  Say Y here if you intend to attach a Fujitsu FMV-J18x or compatible
+  PCMCIA (PC-card) Ethernet card to your computer.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called fmvj18x_cs.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+  If unsure, say N.
+
+NE2000 compatible PCMCIA support
+CONFIG_PCMCIA_PCNET
+  Say Y here if you intend to attach an NE2000 compatible PCMCIA
+  (PC-card) Ethernet or Fast Ethernet card to your computer.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called pcnet_cs.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>. If
+  unsure, say N.
+
+Asix AX88190 PCMCIA support
+CONFIG_PCMCIA_AXNET
+  Say Y here if you intend to attach an Asix AX88190-based PCMCIA
+  (PC-card) Fast Ethernet card to your computer.  These cards are
+  nearly NE2000 compatible but need a separate driver due to a few
+  misfeatures.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called axnet_cs.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.  If
+  unsure, say N.
+
+New Media PCMCIA support
+CONFIG_PCMCIA_NMCLAN
+  Say Y here if you intend to attach a New Media Ethernet or LiveWire
+  PCMCIA (PC-card) Ethernet card to your computer.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called nmclan_cs.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.  If
+  unsure, say N.
+
+SMC 91Cxx PCMCIA support
+CONFIG_PCMCIA_SMC91C92
+  Say Y here if you intend to attach an SMC 91Cxx compatible PCMCIA
+  (PC-card) Ethernet or Fast Ethernet card to your computer.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called smc91c92_cs.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+  If unsure, say N.
+
+Xircom 16-bit PCMCIA support
+CONFIG_PCMCIA_XIRC2PS
+  Say Y here if you intend to attach a Xircom 16-bit PCMCIA (PC-card)
+  Ethernet or Fast Ethernet card to your computer.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called xirc2ps_cs.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+  If unsure, say N.
+
+COM20020 ARCnet PCMCIA support
+CONFIG_ARCNET_COM20020_CS
+  Say Y here if you intend to attach this type of ARCnet PCMCIA card
+  to your computer.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called com20020_cs.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+  If unsure, say N.
+
+IBM PCMCIA Token Ring adapter support
+CONFIG_PCMCIA_IBMTR
+  Say Y here if you intend to attach this type of Token Ring PCMCIA
+  card to your computer. You then also need to say Y to "Token Ring
+  driver support".
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ibmtr_cs.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+Xircom Tulip-like CardBus support (old driver)
+CONFIG_PCMCIA_XIRTULIP
+  This driver is for the Digital "Tulip" Ethernet CardBus adapters.
+  It should work with most DEC 21*4*-based chips/ethercards, as well
+  as with work-alike chips from Lite-On (PNIC) and Macronix (MXIC) and
+  ASIX.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called xircom_tulip_cb.o.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>. If unsure, say N.
+
+Xircom CardBus support (new driver)
+CONFIG_PCMCIA_XIRCOM
+  This driver is for the Digital "Tulip" Ethernet CardBus adapters.
+  It should work with most DEC 21*4*-based chips/ethercards, as well
+  as with work-alike chips from Lite-On (PNIC) and Macronix (MXIC) and
+  ASIX.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called xircom_cb.o.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>. If unsure, say N.
+
+PCMCIA Wireless LAN
+CONFIG_NET_PCMCIA_RADIO
+  Say Y here if you would like to use a PCMCIA (PC-card) device to
+  connect to a wireless local area network. Then say Y to the driver
+  for your particular card below.
+
+  To use your PC-cards, you will need supporting software from David
+  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
+  for location). You also want to check out the PCMCIA-HOWTO,
+  available from <http://www.tldp.org/docs.html#howto>.
+
+Hermes chipset 802.11b support (Orinoco/Prism2/Symbol cards)
+CONFIG_HERMES
+  A driver for 802.11b wireless cards based based on the "Hermes" or
+  Intersil HFA384x (Prism 2) MAC controller.  This includes the vast
+  majority of the PCMCIA 802.11b cards (which are nearly all rebadges)
+  - except for the Cisco/Aironet cards.  Cards supported include the
+  Apple Airport (not a PCMCIA card), WavelanIEEE/Orinoco,
+  Cabletron/EnteraSys Roamabout, ELSA AirLancer, MELCO Buffalo, Avaya,
+  IBM High Rate Wireless, Farralon Syyline, Samsung MagicLAN, Netgear
+  MA401, LinkSys WPC-11, D-Link DWL-650, 3Com AirConnect, Intel
+  PRO/Wireless, and Symbol Spectrum24 High Rate amongst others.
+
+  This option includes the guts of the driver, but in order to
+  actually use a card you will also need to enable support for PCMCIA
+  Hermes cards, PLX9052 based PCI adaptors or the Apple Airport below.
+
+  You will also very likely also need the Wireless Tools in order to
+  configure your card and that /etc/pcmcia/wireless.opts works :
+  <http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html>
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called hermes.o.
+
+Hermes 802.11b in PLX9052 based PCI adaptor support
+CONFIG_PLX_HERMES
+  Enable support for PCMCIA cards supported by the "Hermes" (aka
+  orinoco_cs) driver when used in PLX9052 based PCI adaptors.  These
+  adaptors are not a full PCMCIA controller but act as a more limited
+  PCI <-> PCMCIA bridge.  Several vendors sell such adaptors so that
+  802.11b PCMCIA cards can be used in desktop machines.  The Netgear
+  MA301 is such an adaptor.
+
+  Support for these adaptors is so far still incomplete and buggy.
+  You have been warned.
+
+Prism 2.5 PCI 802.11b adaptor support
+CONFIG_PCI_HERMES
+  Enable support for PCI and mini-PCI 802.11b wireless NICs based on
+  the Prism 2.5 chipset.  These are true PCI cards, not the 802.11b
+  PCMCIA cards bundled with PCI<->PCMCIA adaptors which are also
+  common.  Some of the built-in wireless adaptors in laptops are of
+  this variety.
+
+Hermes support (Orinoco/WavelanIEEE/PrismII/Symbol 802.11b cards)
+CONFIG_PCMCIA_HERMES
+  A driver for "Hermes" chipset based PCMCIA wireless adaptors, such
+  as the Lucent WavelanIEEE/Orinoco cards and their OEM (Cabletron/
+  EnteraSys RoamAbout 802.11, ELSA Airlancer, Melco Buffalo and
+  others).  It should also be usable on various Prism II based cards
+  such as the Linksys, D-Link and Farallon Skyline.  It should also
+  work on Symbol cards such as the 3Com AirConnect and Ericsson WLAN.
+
+  To use your PC-cards, you will need supporting software from David
+  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
+  for location).  You also want to check out the PCMCIA-HOWTO,
+  available from <http://www.tldp.org/docs.html#howto>.
+
+  You will also very likely also need the Wireless Tools in order to
+  configure your card and that /etc/pcmcia/wireless.opts works:
+  <http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html>.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called orinoco_cs.o.
+
+Cisco/Aironet 34X/35X/4500/4800 ISA and PCI cards
+CONFIG_AIRO
+  This is the standard Linux driver to support Cisco/Aironet ISA and
+  PCI 802.11 wireless cards.
+  It supports the new 802.11b cards from Cisco (Cisco 34X, Cisco 35X
+  - with or without encryption) as well as card before the Cisco
+  acquisition (Aironet 4500, Aironet 4800, Aironet 4800B).
+
+  This driver support both the standard Linux Wireless Extensions
+  and Cisco proprietary API, so both the Linux Wireless Tools and the
+  Cisco Linux utilities can be used to configure the card.
+
+  The driver can be compiled as a module and will be named "airo.o".
+
+Cisco/Aironet 34X/35X/4500/4800 PCMCIA cards
+CONFIG_AIRO_CS
+  This is the standard Linux driver to support Cisco/Aironet PCMCIA
+  802.11 wireless cards.  This driver is the same as the Aironet
+  driver part of the Linux Pcmcia package.
+  It supports the new 802.11b cards from Cisco (Cisco 34X, Cisco 35X
+  - with or without encryption) as well as card before the Cisco
+  acquisition (Aironet 4500, Aironet 4800, Aironet 4800B). It also
+  supports OEM of Cisco such as the DELL TrueMobile 4800 and Xircom
+  802.11b cards.
+
+  This driver support both the standard Linux Wireless Extensions
+  and Cisco proprietary API, so both the Linux Wireless Tools and the
+  Cisco Linux utilities can be used to configure the card.
+
+  To use your PC-cards, you will need supporting software from David
+  Hinds' pcmcia-cs package (see the file <file:Documentation/Changes>
+  for location).  You also want to check out the PCMCIA-HOWTO,
+  available from <http://www.tldp.org/docs.html#howto>.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called airo_cs.o.
+
+Aviator/Raytheon 2.4MHz wireless support
+CONFIG_PCMCIA_RAYCS
+  Say Y here if you intend to attach an Aviator/Raytheon PCMCIA
+  (PC-card) wireless Ethernet networking card to your computer.
+  Please read the file <file:Documentation/networking/ray_cs.txt> for
+  details.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ray_cs.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.  If
+  unsure, say N.
+
+Apple Airport support (built-in)
+CONFIG_APPLE_AIRPORT
+  Say Y here to support the Airport 802.11b wireless Ethernet hardware
+  built into the Macintosh iBook and other recent PowerPC-based
+  Macintosh machines. This is essentially a Lucent Orinoco card with 
+  a non-standard interface
+
+Xircom Netwave AirSurfer wireless support
+CONFIG_PCMCIA_NETWAVE
+  Say Y here if you intend to attach this type of PCMCIA (PC-card)
+  wireless Ethernet networking card to your computer.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called netwave_cs.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+  If unsure, say N.
+
+AT&T/Lucent Wavelan wireless support
+CONFIG_PCMCIA_WAVELAN
+  Say Y here if you intend to attach an AT&T/Lucent Wavelan PCMCIA
+  (PC-card) wireless Ethernet networking card to your computer.  This
+  driver is for the non-IEEE-802.11 Wavelan cards.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called wavelan_cs.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+  If unsure, say N.
+
+PLIP (parallel port) support
+CONFIG_PLIP
+  PLIP (Parallel Line Internet Protocol) is used to create a
+  reasonably fast mini network consisting of two (or, rarely, more)
+  local machines.  A PLIP link from a Linux box is a popular means to
+  install a Linux distribution on a machine which doesn't have a
+  CD-ROM drive (a minimal system has to be transferred with floppies
+  first). The kernels on both machines need to have this PLIP option
+  enabled for this to work.
+
+  The PLIP driver has two modes, mode 0 and mode 1.  The parallel
+  ports (the connectors at the computers with 25 holes) are connected
+  with "null printer" or "Turbo Laplink" cables which can transmit 4
+  bits at a time (mode 0) or with special PLIP cables, to be used on
+  bidirectional parallel ports only, which can transmit 8 bits at a
+  time (mode 1); you can find the wiring of these cables in
+  <file:Documentation/networking/PLIP.txt>.  The cables can be up to
+  15m long.  Mode 0 works also if one of the machines runs DOS/Windows
+  and has some PLIP software installed, e.g. the Crynwr PLIP packet
+  driver (<http://oak.oakland.edu/simtel.net/msdos/pktdrvr-pre.html>)
+  and winsock or NCSA's telnet.
+
+  If you want to use PLIP, say Y and read the PLIP mini-HOWTO as well
+  as the NET-3-HOWTO, both available from
+  <http://www.tldp.org/docs.html#howto>.  Note that the PLIP
+  protocol has been changed and this PLIP driver won't work together
+  with the PLIP support in Linux versions 1.0.x.  This option enlarges
+  your kernel by about 8 KB.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called plip.o.  If unsure, say Y or M, in case you buy a laptop
+  later.
+
+EQL (serial line load balancing) support
+CONFIG_EQUALIZER
+  If you have two serial connections to some other computer (this
+  usually requires two modems and two telephone lines) and you use
+  SLIP (the protocol for sending Internet traffic over telephone
+  lines) or PPP (a better SLIP) on them, you can make them behave like
+  one double speed connection using this driver.  Naturally, this has
+  to be supported at the other end as well, either with a similar EQL
+  Linux driver or with a Livingston Portmaster 2e.
+
+  Say Y if you want this and read
+  <file:Documentation/networking/eql.txt>.  You may also want to read
+  section 6.2 of the NET-3-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called eql.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.  If
+  unsure, say N.
+
+Universal TUN/TAP device driver support
+CONFIG_TUN
+  TUN/TAP provides packet reception and transmission for user space
+  programs.  It can be viewed as a simple Point-to-Point or Ethernet
+  device, which instead of receiving packets from a physical media,
+  receives them from user space program and instead of sending packets
+  via physical media writes them to the user space program.
+
+  When a program opens /dev/net/tun, driver creates and registers
+  corresponding net device tunX or tapX.  After a program closed above
+  devices, driver will automatically delete tunXX or tapXX device and
+  all routes corresponding to it.
+
+  Please read <file:Documentation/networking/tuntap.txt> for more
+  information.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called tun.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+  If you don't know what to use this for, you don't need it.
+
+Ethertap network tap (OBSOLETE)
+CONFIG_ETHERTAP
+  If you say Y here (and have said Y to "Kernel/User network link
+  driver", above) and create a character special file /dev/tap0 with
+  major number 36 and minor number 16 using mknod ("man mknod"), you
+  will be able to have a user space program read and write raw
+  Ethernet frames from/to that special file.  tap0 can be configured
+  with ifconfig and route like any other Ethernet device but it is not
+  connected to any physical LAN; everything written by the user to
+  /dev/tap0 is treated by the kernel as if it had come in from a LAN
+  to the device tap0; everything the kernel wants to send out over the
+  device tap0 can instead be read by the user from /dev/tap0: the user
+  mode program replaces the LAN that would be attached to an ordinary
+  Ethernet device. Please read the file
+  <file:Documentation/networking/ethertap.txt> for more information.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ethertap.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+  If you don't know what to use this for, you don't need it.
+
+Sealevel Systems 4021 support
+CONFIG_SEALEVEL_4021
+  This is a driver for the Sealevel Systems ACB 56 serial I/O adapter.
+
+  This driver can only be compiled as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to do that, say M here. The module will be called
+  sealevel.o.
+
+TMPTX3912/PR31700 serial port support
+CONFIG_SERIAL_TX3912
+  The TX3912 is a Toshiba RISC processor based o the MIPS 3900 core;
+  see <http://www.toshiba.com/taec/components/Generic/risc/tx3912.htm>.
+  Say Y here to enable kernel support for the on-board serial port.
+
+Console on TMPTX3912/PR31700 serial port
+CONFIG_SERIAL_TX3912_CONSOLE
+  The TX3912 is a Toshiba RISC processor based o the MIPS 3900 core;
+  see <http://www.toshiba.com/taec/components/Generic/risc/tx3912.htm>.
+  Say Y here to direct console I/O to the on-board serial port.
+
+Enable Au1000 serial console
+CONFIG_AU1000_SERIAL_CONSOLE
+  If you have an Alchemy AU1000 processor (MIPS based) and you want
+  to use a console on a serial port, say Y.  Otherwise, say N.
+
+Enable Au1000 UART Support
+CONFIG_AU1000_UART
+  If you have an Alchemy AU1000 processor (MIPS based) and you want
+  to use serial ports, say Y.  Otherwise, say N.
+
+SyncLink HDLC/SYNCPPP support
+CONFIG_SYNCLINK_SYNCPPP
+  Enables HDLC/SYNCPPP support for the SyncLink WAN driver.
+  Normally the SyncLink WAN driver works with the main PPP
+  driver (ppp.c) and pppd program. HDLC/SYNCPPP support allows use
+  of the Cisco HDLC/PPP driver (syncppp.c).
+  The SyncLink WAN driver (in character devices) must also be enabled.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called syncppp.o.
+
+FarSync T-Series X.21 (and V.35/V.24) cards
+CONFIG_FARSYNC
+  This driver supports the FarSync T-Series X.21 (and V.35/V.24) cards
+  from FarSite Communications Ltd.
+  Synchronous communication is supported on all ports at speeds up to
+  8Mb/s (128K on V.24) using synchronous PPP or Cisco HDLC.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want)
+  say M here and read <file:Documentation/modules.txt>.
+  The module will be called farsync.o and if you want the module to be
+  automatically loaded when the interface is referenced then you
+  should add "alias syncX farsync" to /etc/modules.conf for each
+  interface, where X is 0, 1, 2, ...
+
+CONFIG_HDLC_DEBUG_PKT
+  This option is for developers only - do NOT use on production
+  systems.
+
+CONFIG_HDLC_DEBUG_HARD_HEADER
+  This option is for developers only - do NOT use on production
+  systems.
+
+CONFIG_HDLC_DEBUG_ECN
+  This option is for developers only - do NOT use on production
+  systems.
+
+CONFIG_HDLC_DEBUG_RINGS
+  If you answer Y here you will be able to get a diagnostic dump of
+  port's TX and RX packet rings, using "sethdlc hdlcX private"
+  command. It does not affect normal operations.
+
+  If unsure, say Y here.
+
+
+Frame Relay (DLCI) support
+CONFIG_DLCI
+  This is support for the frame relay protocol; frame relay is a fast
+  low-cost way to connect to a remote Internet access provider or to
+  form a private wide area network. The one physical line from your
+  box to the local "switch" (i.e. the entry point to the frame relay
+  network, usually at the phone company) can carry several logical
+  point-to-point connections to other computers connected to the frame
+  relay network. For a general explanation of the protocol, check out
+  <http://www.frforum.com/> on the WWW. To use frame relay, you need
+  supporting hardware (called FRAD) and certain programs from the
+  net-tools package as explained in
+  <file:Documentation/networking/framerelay.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called dlci.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Max open DLCI
+CONFIG_DLCI_COUNT
+  This is the maximal number of logical point-to-point frame relay
+  connections (the identifiers of which are called DCLIs) that
+  the driver can handle. The default is probably fine.
+
+Max DLCI per device
+CONFIG_DLCI_MAX
+  You can specify here how many logical point-to-point frame relay
+  connections (the identifiers of which are called DCLIs) should be
+  handled by each of your hardware frame relay access devices. Go with
+  the default.
+
+SDLA (Sangoma S502/S508) support
+CONFIG_SDLA
+  Say Y here if you need a driver for the Sangoma S502A, S502E, and
+  S508 Frame Relay Access Devices. These are multi-protocol cards, but
+  only frame relay is supported by the driver at this time. Please
+  read <file:Documentation/framerelay.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called sdla.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Acorn Econet/AUN protocols
+CONFIG_ECONET
+  Econet is a fairly old and slow networking protocol mainly used by
+  Acorn computers to access file and print servers. It uses native
+  Econet network cards. AUN is an implementation of the higher level
+  parts of Econet that runs over ordinary Ethernet connections, on
+  top of the UDP packet protocol, which in turn runs on top of the
+  Internet protocol IP.
+
+  If you say Y here, you can choose with the next two options whether
+  to send Econet/AUN traffic over a UDP Ethernet connection or over
+  a native Econet network card.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called econet.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+AUN over UDP
+CONFIG_ECONET_AUNUDP
+  Say Y here if you want to send Econet/AUN traffic over a UDP
+  connection (UDP is a packet based protocol that runs on top of the
+  Internet protocol IP) using an ordinary Ethernet network card.
+
+Native Econet
+CONFIG_ECONET_NATIVE
+  Say Y here if you have a native Econet network card installed in
+  your computer.
+
+WAN router
+CONFIG_WAN_ROUTER
+  Wide Area Networks (WANs), such as X.25, frame relay and leased
+  lines, are used to interconnect Local Area Networks (LANs) over vast
+  distances with data transfer rates significantly higher than those
+  achievable with commonly used asynchronous modem connections.
+  Usually, a quite expensive external device called a `WAN router' is
+  needed to connect to a WAN.
+
+  As an alternative, WAN routing can be built into the Linux kernel.
+  With relatively inexpensive WAN interface cards available on the
+  market, a perfectly usable router can be built for less than half
+  the price of an external router.  If you have one of those cards and
+  wish to use your Linux box as a WAN router, say Y here and also to
+  the WAN driver for your card, below.  You will then need the
+  wan-tools package which is available from <ftp://ftp.sangoma.com/>.
+  Read <file:Documentation/networking/wan-router.txt> for more
+  information.
+
+  The WAN routing support is also available as a module called
+  wanrouter.o ( = code which can be inserted in and removed from the
+  running kernel whenever you want).  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+  If unsure, say N.
+
+Fast switching (read help!)
+CONFIG_NET_FASTROUTE
+  Saying Y here enables direct NIC-to-NIC (NIC = Network Interface
+  Card) data transfers on the local network, which is fast.
+
+  IMPORTANT NOTE: This option is NOT COMPATIBLE with "Network packet
+  filtering" (CONFIG_NETFILTER). Say N here if you say Y there.
+
+  However, it will work with all options in the "Advanced router"
+  section (except for "Use TOS value as routing key" and
+  "Use FWMARK value as routing key").
+
+  At the moment, few devices support fast switching (tulip is one of
+  them, a modified 8390 driver can be found at
+  <ftp://ftp.inr.ac.ru/ip-routing/fastroute/fastroute-8390.tar.gz>).
+
+  If unsure, say N.
+
+Forwarding between high speed interfaces
+CONFIG_NET_HW_FLOWCONTROL
+  This option enables NIC (Network Interface Card) hardware throttling
+  during periods of extremal congestion. At the moment only a couple
+  of device drivers support it (really only one -- tulip, a modified
+  8390 driver can be found at
+  <ftp://ftp.inr.ac.ru/ip-routing/fastroute/fastroute-8390.tar.gz>).
+
+  Really, this option is applicable to any machine attached to a fast
+  enough network, and even a 10 Mb NIC is able to kill a not very slow
+  box, such as a 120MHz Pentium.
+
+  However, do not say Y here if you did not experience any serious
+  problems.
+
+QoS and/or fair queueing
+CONFIG_NET_SCHED
+  When the kernel has several packets to send out over a network
+  device, it has to decide which ones to send first, which ones to
+  delay, and which ones to drop. This is the job of the packet
+  scheduler, and several different algorithms for how to do this
+  "fairly" have been proposed.
+
+  If you say N here, you will get the standard packet scheduler, which
+  is a FIFO (first come, first served). If you say Y here, you will be
+  able to choose from among several alternative algorithms which can
+  then be attached to different network devices. This is useful for
+  example if some of your network devices are real time devices that
+  need a certain minimum data flow rate, or if you need to limit the
+  maximum data flow rate for traffic which matches specified criteria.
+  This code is considered to be experimental.
+
+  To administer these schedulers, you'll need the user-level utilities
+  from the package iproute2+tc at <ftp://ftp.inr.ac.ru/ip-routing/>.
+  That package also contains some documentation; for more, check out
+  <http://snafu.freedom.org/linux2.2/iproute-notes.html>.
+
+  This Quality of Service (QoS) support will enable you to use
+  Differentiated Services (diffserv) and Resource Reservation Protocol
+  (RSVP) on your Linux router if you also say Y to "QoS support",
+  "Packet classifier API" and to some classifiers below. Documentation
+  and software is at <http://icawww1.epfl.ch/linux-diffserv/>.
+
+  If you say Y here and to "/proc file system" below, you will be able
+  to read status information about packet schedulers from the file
+  /proc/net/psched.
+
+  The available schedulers are listed in the following questions; you
+  can say Y to as many as you like. If unsure, say N now.
+
+CBQ packet scheduler
+CONFIG_NET_SCH_CBQ
+  Say Y here if you want to use the Class-Based Queueing (CBQ) packet
+  scheduling algorithm for some of your network devices.  This
+  algorithm classifies the waiting packets into a tree-like hierarchy
+  of classes; the leaves of this tree are in turn scheduled by
+  separate algorithms (called "disciplines" in this context).
+
+  See the top of <file:net/sched/sch_cbq.c> for references about the
+  CBQ algorithm.
+
+  CBQ is a commonly used scheduler, so if you're unsure, you should
+  say Y here. Then say Y to all the queueing algorithms below that you
+  want to use as CBQ disciplines.  Then say Y to "Packet classifier
+  API" and say Y to all the classifiers you want to use; a classifier
+  is a routine that allows you to sort your outgoing traffic into
+  classes based on a certain criterion.
+
+  This code is also available as a module called sch_cbq.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+CONFIG_NET_SCH_HTB
+  Say Y here if you want to use the Hierarchical Token Buckets (HTB)
+  packet scheduling algorithm for some of your network devices. See
+  URL <http://luxik.cdi.cz/~devik/qos/htb/> for complete manual and
+  in-depth articles.
+
+  HTB is very similar to the CBQ regarding its goals however is has 
+  different properties and different algorithm.
+
+  This code is also available as a module called sch_htb.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+CSZ packet scheduler
+CONFIG_NET_SCH_CSZ
+  Say Y here if you want to use the Clark-Shenker-Zhang (CSZ) packet
+  scheduling algorithm for some of your network devices.  At the
+  moment, this is the only algorithm that can guarantee service for
+  real-time applications (see the top of <file:net/sched/sch_csz.c>
+  for details and references about the algorithm).
+
+  Note: this scheduler is currently broken.
+
+  This code is also available as a module called sch_csz.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+ATM pseudo-scheduler
+CONFIG_NET_SCH_ATM
+  Say Y here if you want to use the ATM pseudo-scheduler.  This
+  provides a framework for invoking classifiers (aka "filters"), which
+  in turn select classes of this queuing discipline.  Each class maps
+  the flow(s) it is handling to a given virtual circuit (see the top of
+  <file:net/sched/sch_atm.c>).
+
+  This code is also available as a module called sch_atm.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+The simplest PRIO pseudo-scheduler
+CONFIG_NET_SCH_PRIO
+  Say Y here if you want to use an n-band priority queue packet
+  "scheduler" for some of your network devices or as a leaf discipline
+  for the CBQ scheduling algorithm. If unsure, say Y.
+
+  This code is also available as a module called sch_prio.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Diffserv field marker
+CONFIG_NET_SCH_DSMARK
+  Say Y if you want to schedule packets according to the
+  Differentiated Services architecture proposed in RFC 2475.
+  Technical information on this method, with pointers to associated
+  RFCs, is available at <http://www.gta.ufrj.br/diffserv/>.
+
+  This code is also available as a module called sch_dsmark.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+GRED queue
+CONFIG_NET_SCH_GRED
+  Say Y here if you want to use the Generic Random Early Detection
+  (RED) packet scheduling algorithm for some of your network devices
+  (see the top of <file:net/sched/sch_red.c> for details and
+  references about the algorithm).
+
+  This code is also available as a module called sch_gred.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+RED queue
+CONFIG_NET_SCH_RED
+  Say Y here if you want to use the Random Early Detection (RED)
+  packet scheduling algorithm for some of your network devices (see
+  the top of <file:net/sched/sch_red.c> for details and references
+  about the algorithm).
+
+  This code is also available as a module called sch_red.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+SFQ queue
+CONFIG_NET_SCH_SFQ
+  Say Y here if you want to use the Stochastic Fairness Queueing (SFQ)
+  packet scheduling algorithm for some of your network devices or as a
+  leaf discipline for the CBQ scheduling algorithm (see the top of
+  <file:net/sched/sch_sfq.c> for details and references about the SFQ
+  algorithm).
+
+  This code is also available as a module called sch_sfq.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+TEQL queue
+CONFIG_NET_SCH_TEQL
+  Say Y here if you want to use the True Link Equalizer (TLE) packet
+  scheduling algorithm for some of your network devices or as a leaf
+  discipline for the CBQ scheduling algorithm. This queueing
+  discipline allows the combination of several physical devices into
+  one virtual device. (see the top of <file:net/sched/sch_teql.c> for
+  details).
+
+  This code is also available as a module called sch_teql.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+TBF queue
+CONFIG_NET_SCH_TBF
+  Say Y here if you want to use the Simple Token Bucket Filter (TBF)
+  packet scheduling algorithm for some of your network devices or as a
+  leaf discipline for the CBQ scheduling algorithm (see the top of
+  <file:net/sched/sch_tbf.c> for a description of the TBF algorithm).
+
+  This code is also available as a module called sch_tbf.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Ingress Qdisc
+CONFIG_NET_SCH_INGRESS
+  If you say Y here, you will be able to police incoming bandwidth
+  and drop packets when this bandwidth exceeds your desired rate.
+  If unsure, say Y.
+
+  This code is also available as a module called cls_ingress.o
+  ( = code which can be inserted in and removed from the running
+  kernel whenever you want).  If you want to compile it as a module,
+  say M here and read <file:Documentation/modules.txt>.
+
+QoS support
+CONFIG_NET_QOS
+  Say Y here if you want to include Quality Of Service scheduling
+  features, which means that you will be able to request certain
+  rate-of-flow limits for your network devices.
+
+  This Quality of Service (QoS) support will enable you to use
+  Differentiated Services (diffserv) and Resource Reservation Protocol
+  (RSVP) on your Linux router if you also say Y to "Packet classifier
+  API" and to some classifiers below. Documentation and software is at
+  <http://icawww1.epfl.ch/linux-diffserv/>.
+
+  Note that the answer to this question won't directly affect the
+  kernel: saying N will just cause the configurator to skip all
+  the questions about QoS support.
+
+Rate estimator
+CONFIG_NET_ESTIMATOR
+  In order for Quality of Service scheduling to work, the current
+  rate-of-flow for a network device has to be estimated; if you say Y
+  here, the kernel will do just that.
+
+Packet classifier API
+CONFIG_NET_CLS
+  The CBQ scheduling algorithm requires that network packets which are
+  scheduled to be sent out over a network device be classified
+  according to some criterion. If you say Y here, you will get a
+  choice of several different packet classifiers with the following
+  questions.
+
+  This will enable you to use Differentiated Services (diffserv) and
+  Resource Reservation Protocol (RSVP) on your Linux router.
+  Documentation and software is at
+  <http://icawww1.epfl.ch/linux-diffserv/>.
+
+Traffic policing (needed for in/egress)
+CONFIG_NET_CLS_POLICE
+  Say Y to support traffic policing (bandwidth limits).  Needed for
+  ingress and egress rate limiting.
+
+TC index classifier
+CONFIG_NET_CLS_TCINDEX
+  If you say Y here, you will be able to classify outgoing packets
+  according to the tc_index field of the skb. You will want this
+  feature if you want to implement Differentiated Services using
+  sch_dsmark. If unsure, say Y.
+
+  This code is also available as a module called cls_tcindex.o
+  ( = code which can be inserted in and removed from the running
+  kernel whenever you want). If you want to compile it as a module,
+  say M here and read <file:Documentation/modules.txt>.
+
+Routing tables based classifier
+CONFIG_NET_CLS_ROUTE4
+  If you say Y here, you will be able to classify outgoing packets
+  according to the route table entry they matched. If unsure, say Y.
+
+  This code is also available as a module called cls_route.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Firewall based classifier
+CONFIG_NET_CLS_FW
+  If you say Y here, you will be able to classify outgoing packets
+  according to firewall criteria you specified.
+
+  This code is also available as a module called cls_fw.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+U32 classifier
+CONFIG_NET_CLS_U32
+  If you say Y here, you will be able to classify outgoing packets
+  according to their destination address. If unsure, say Y.
+
+  This code is also available as a module called cls_u32.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Special RSVP classifier
+CONFIG_NET_CLS_RSVP
+  The Resource Reservation Protocol (RSVP) permits end systems to
+  request a minimum and maximum data flow rate for a connection; this
+  is important for real time data such as streaming sound or video.
+
+  Say Y here if you want to be able to classify outgoing packets based
+  on their RSVP requests.
+
+  This code is also available as a module called cls_rsvp.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Special RSVP classifier for IPv6
+CONFIG_NET_CLS_RSVP6
+  The Resource Reservation Protocol (RSVP) permits end systems to
+  request a minimum and maximum data flow rate for a connection; this
+  is important for real time data such as streaming sound or video.
+
+  Say Y here if you want to be able to classify outgoing packets based
+  on their RSVP requests and you are using the new Internet Protocol
+  IPv6 as opposed to the older and more common IPv4.
+
+  This code is also available as a module called cls_rsvp6.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Network code profiler
+CONFIG_NET_PROFILE
+  If you say Y here and to "/proc file system support" below, some
+  obscure and undocumented information about the network code's
+  performance will be written to /proc/net/profile. If you don't know
+  what it is about, you don't need it: say N.
+
+Network packet generator
+CONFIG_NET_PKTGEN
+  This module will inject preconfigured packets, at a configurable
+  rate, out of a given interface.  It is used for network interface
+  stress testing and performance analysis.  If you don't understand
+  what was just said, you don't need it: say N.
+
+  Documentation on how to use the packet generator can be found
+  at <file:Documentation/networking/pktgen.txt>.
+
+  This code is also available as a module called pktgen.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want).  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Wan interfaces support
+CONFIG_WAN
+  Wide Area Networks (WANs), such as X.25, frame relay and leased
+  lines, are used to interconnect Local Area Networks (LANs) over vast
+  distances with data transfer rates significantly higher than those
+  achievable with commonly used asynchronous modem connections.
+  Usually, a quite expensive external device called a `WAN router' is
+  needed to connect to a WAN.
+
+  As an alternative, a relatively inexpensive WAN interface card can
+  allow your Linux box to directly connect to a WAN. If you have one
+  of those cards and wish to use it under Linux, say Y here and also
+  to the WAN driver for your card, below.
+
+  If unsure, say N.
+
+Comtrol Hostess SV-11 support
+CONFIG_HOSTESS_SV11
+  This is a network card for low speed synchronous serial links, at
+  up to 256Kbps. It supports both PPP and Cisco HDLC.
+
+  At this point, the driver can only be compiled as a module.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called hostess_sv11.o.
+
+COSA/SRP sync serial board support
+CONFIG_COSA
+  This is a driver for COSA and SRP synchronous serial boards. These
+  boards allow to connect synchronous serial devices (for example
+  base-band modems, or any other device with the X.21, V.24, V.35 or
+  V.36 interface) to your Linux box. The cards can work as the
+  character device, synchronous PPP network device, or the Cisco HDLC
+  network device.
+
+  To actually use the COSA or SRP board, you will need user-space
+  utilities for downloading the firmware to the cards and to set them
+  up. Look at the <http://www.fi.muni.cz/~kas/cosa/> for more
+  information about the cards (including the pointer to the user-space
+  utilities). You can also read the comment at the top of the
+  <file:drivers/net/wan/cosa.c> for details about the cards and the driver
+  itself.
+
+  The driver will be compiled as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called cosa.o. For general information about
+  modules read <file:Documentation/modules.txt>.
+
+Etinc PCISYNC serial board support
+CONFIG_DSCC4
+  This is a driver for Etinc PCISYNC boards based on the Infineon
+  (ex. Siemens) DSCC4 chipset. It is supposed to work with the four
+  ports card. Take a look at <http://www.cogenit.fr/dscc4/>
+  for further informations about the driver and his configuration.
+
+  The driver will be compiled as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called dscc4.o. For general information about
+  modules read <file:Documentation/modules.txt>.
+
+LanMedia Corp. serial boards (SSI/V.35, T1/E1, HSSI, T3)
+CONFIG_LANMEDIA
+  This is a driver for the following Lan Media family of serial
+  boards.
+
+  LMC 1000 board allows you to connect synchronous serial devices (for
+  example base-band modems, or any other device with the X.21, V.24,
+  V.35 or V.36 interface) to your Linux box.
+
+  LMC 1200 with on board DSU board allows you to connect your Linux
+  box directly to a T1 or E1 circuit.
+
+  LMC 5200 board provides a HSSI interface capable of running up to
+  52 mbits per second.
+
+  LMC 5245 board connects directly to a T3 circuit saving the
+  additional external hardware.
+
+  To change setting such as syncPPP vs cisco HDLC or clock source you
+  will need lmcctl.  It is available at <ftp://ftp.lanmedia.com/>.
+
+  This code is also available as a module called lmc.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Fibre Channel driver support
+CONFIG_NET_FC
+  Fibre Channel is a high speed serial protocol mainly used to connect
+  large storage devices to the computer; it is compatible with and
+  intended to replace SCSI.
+
+  If you intend to use Fibre Channel, you need to have a Fibre channel
+  adaptor card in your computer; say Y here and to the driver for your
+  adaptor below. You also should have said Y to "SCSI support" and
+  "SCSI generic support".
+
+Interphase 5526 Tachyon chipset based adaptor support
+CONFIG_IPHASE5526
+  Say Y here if you have a Fibre Channel adaptor of this kind.
+
+  The driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called iph5526.o. For general information about
+  modules read <file:Documentation/modules.txt>.
+
+Red Creek Hardware VPN
+CONFIG_RCPCI
+  This is a driver for hardware which provides a Virtual Private
+  Network (VPN). Say Y if you have it.
+
+  This code is also available as a module called rcpci.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Granch SBNI12 Leased Line adapter driver
+CONFIG_SBNI
+  This is a driver for ISA SBNI12-xx cards which are low cost
+  alternatives to leased line modems. Say Y if you want to insert
+  the driver into the kernel or say M to compile it as a module (the
+  module will be called sbni.o).
+
+  You can find more information and last versions of drivers and
+  utilities at <http://www.granch.ru/>. If you have any question you
+  can send email to sbni@granch.ru.
+
+  Say N if unsure.
+
+SBNI multiple-line feature support
+CONFIG_SBNI_MULTILINE
+  Schedule traffic for some parallel lines, via SBNI12 adapters.
+  If you have two computers connected with two parallel lines it's
+  possible to increase transfer rate nearly twice. You should have
+  a program named 'sbniconfig' to configure adapters.
+
+  Say N if unsure.
+
+WAN router drivers
+CONFIG_WAN_ROUTER_DRIVERS
+  If you have a WAN interface card and you want your Linux box to act
+  as a WAN router, thereby connecting you Local Area Network to the
+  outside world over the WAN connection, say Y here and then to the
+  driver for your card below. In addition, you need to say Y to "Wan
+  Router".
+
+  You will need the wan-tools package which is available from
+  <ftp://ftp.sangoma.com/>. Read
+  <file:Documentation/networking/wan-router.txt> for more information.
+
+  Note that the answer to this question won't directly affect the
+  kernel: saying N will just cause the configurator to skip all
+  the questions about WAN router drivers. If unsure, say N.
+
+Sangoma WANPIPE(tm) multiprotocol cards
+CONFIG_VENDOR_SANGOMA
+  WANPIPE from Sangoma Technologies Inc. (<http://www.sangoma.com/>)
+  is a family of intelligent multiprotocol WAN adapters with data
+  transfer rates up to 4Mbps. They are also known as Synchronous
+  Data Link Adapters (SDLA) and are designated as S514-PCI or
+  S508-ISA.  These cards support
+
+    - X.25, Frame Relay, PPP, Cisco HDLC protocols.
+
+    - API support for protocols like HDLC (LAPB),
+      HDLC Streaming, X.25, Frame Relay and BiSync.
+
+    - Ethernet Bridging over Frame Relay protocol.
+
+    - MULTILINK PPP
+
+    - Async PPP (Modem Dialup)
+
+  If you have one or more of these cards, say M to this option; you
+  may then also want to read the file
+  <file:Documentation/networking/wanpipe.txt>.  The next questions
+  will ask you about the protocols you want the driver to support.
+
+  The driver will be compiled as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called wanpipe.o.  For general information about
+  modules read <file:Documentation/modules.txt>.
+
+WANPIPE X.25 support
+CONFIG_WANPIPE_X25
+  Say Y to this option if you are planning to connect a WANPIPE card
+  to an X.25 network.  Note, this feature also includes the X.25 API
+  support used to develop custom applications over the X.25 protocol.
+  If you say N, the X.25 support will not be included in the driver.
+  The X.25 option is supported on S514-PCI and S508-ISA cards.
+
+WANPIPE Frame Relay support
+CONFIG_WANPIPE_FR
+  Say Y to this option if you are planning to connect a WANPIPE card
+  to a frame relay network, or use frame relay API to develop
+  custom applications over the Frame  Relay protocol.
+  This feature also contains the Ethernet Bridging over Frame Relay,
+  where a WANPIPE frame relay link can be directly connected to the
+  Linux kernel bridge.  If you say N, the frame relay support will
+  not be included in the driver. The Frame Relay option is
+  supported on S514-PCI and S508-ISA cards.
+
+WANPIPE PPP support
+CONFIG_WANPIPE_PPP
+  Say Y to this option if you are planning to connect a WANPIPE card
+  to a leased line using Point-to-Point protocol (PPP). If you say N,
+  the PPP support will not be included in the driver. The PPP option
+  is supported on S514-PCI/S508-ISA cards.
+
+WANPIPE Multi-Port PPP support
+CONFIG_WANPIPE_MULTPPP
+  Say Y to this option if you are planning to connect a WANPIPE card
+  to a leased line using Point-to-Point protocol (PPP).  Note, the
+  MultiPort PPP uses the Linux Kernel SyncPPP protocol over the
+  Sangoma HDLC Streaming adapter.  In this case each Sangoma adapter
+  port can support an independent PPP connection.  For example, a
+  single Quad-Port PCI adapter can support up to four independent
+  PPP links. If you say N,the PPP support will not be included in the
+  driver.  The PPP option is supported on S514-PCI/S508-ISA cards.
+
+WANPIPE Cisco HDLC support
+CONFIG_WANPIPE_CHDLC
+  Say Y to this option if you are planning to connect a WANPIPE card
+  to a leased line using the Cisco HDLC protocol. This now supports
+  Dual Port Cisco HDLC on the S514-PCI/S508-ISA cards.
+  This support also allows user to build applications using the
+  HDLC streaming API.
+
+  CHDLC Streaming driver also supports MULTILINK PPP
+  support that can bind multiple WANPIPE T1 cards into
+  a single logical channel.
+
+  If you say  N, the Cisco HDLC support and
+  HDLC streaming API and MULTILINK PPP will not be
+  included in the driver.
+
+MultiGate (COMX) synchronous serial board support
+CONFIG_COMX
+  Say Y if you want to use any board from the MultiGate (COMX) family.
+  These boards are synchronous serial adapters for the PC,
+  manufactured by ITConsult-Pro Co, Hungary.
+
+  Read <file:Documentation/networking/comx.txt> for help on
+  configuring and using COMX interfaces.  Further info on these cards
+  can be found at <http://www.itc.hu/> or <info@itc.hu>.
+
+  You must say Y to "/proc file system support" (CONFIG_PROC_FS) to
+  use this driver.
+
+  If you want to compile this as a module, say M and read
+  <file:Documentation/modules.txt>.  The module will be called comx.o.
+
+Support for COMX/CMX/HiCOMX boards
+CONFIG_COMX_HW_COMX
+  Hardware driver for the 'CMX', 'COMX' and 'HiCOMX' boards from the
+  MultiGate family. Say Y if you have one of these.
+
+  You will need additional firmware to use these cards, which are
+  downloadable from <ftp://ftp.itc.hu/>.
+
+  If you want to compile this as a module, say M and read
+  <file:Documentation/modules.txt>.  The module will be called
+  comx-hw-comx.o.
+
+Support for LoCOMX board
+CONFIG_COMX_HW_LOCOMX
+  Hardware driver for the 'LoCOMX' board from the MultiGate family.
+  Say Y if you have a board like this.
+
+  If you want to compile this as a module, say M and read
+  <file:Documentation/modules.txt>.  The module will be called
+  comx-hw-locomx.o.
+
+Support for MixCOM board
+CONFIG_COMX_HW_MIXCOM
+  Hardware driver for the 'MixCOM' board from the MultiGate family.
+  Say Y if you have a board like this.
+
+  If you want to use the watchdog device on this card, you should
+  select it in the Watchdog Cards section of the Character Devices
+  configuration. The ISDN interface of this card is Teles 16.3
+  compatible, you should enable it in the ISDN configuration menu. The
+  driver for the flash ROM of this card is available separately on
+  <ftp://ftp.itc.hu/>.
+
+  If you want to compile this as a module, say M and read
+  <file:Documentation/modules.txt>. The module will be called
+  comx-hw-mixcom.o.
+
+i810 TCO timer/watchdog support
+CONFIG_I810_TCO
+  Hardware driver for the TCO timer built into the Intel i810 and i815
+  chipset family.  The TCO (Total Cost of Ownership) timer is a
+  watchdog timer that will reboot the machine after its second
+  expiration. The expiration time can be configured by command
+  argument "i810_margin=<n>" where <n> is the counter initial value.
+  It is decremented every 0.6 secs, the default is 50 which gives a
+  timeout of 30 seconds and one minute until reset.
+
+  On some motherboards the driver may fail to reset the chipset's
+  NO_REBOOT flag which prevents the watchdog from rebooting the
+  machine. If this is the case you will get a kernel message like
+  "i810tco init: failed to reset NO_REBOOT flag".
+
+  If you want to compile this as a module, say M and read
+  <file:Documentation/modules.txt>.  The module will be called
+  i810-tco.o.
+
+SliceCOM/PciCOM board support
+CONFIG_COMX_HW_MUNICH
+  Hardware driver for the 'SliceCOM' (channelized E1) and 'PciCOM'
+  boards (X21) from the MultiGate family.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called comx-hw-munich.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+  Read linux/Documentation/networking/slicecom.txt for help on
+  configuring and using SliceCOM interfaces. Further info on these cards
+  can be found at <http://www.itc.hu> or <info@itc.hu>.
+
+Support for HDLC and syncPPP protocols on MultiGate boards
+CONFIG_COMX_PROTO_PPP
+  Cisco-HDLC and synchronous PPP protocol driver for all MultiGate
+  boards. Say Y if you want to use either protocol on your MultiGate
+  boards.
+
+  If you want to compile this as a module, say M and read
+  <file:Documentation/modules.txt>.  The module will be called
+  comx-proto-ppp.o.
+
+Support for LAPB protocol on MultiGate boards
+CONFIG_COMX_PROTO_LAPB
+  LAPB protocol driver for all MultiGate boards. Say Y if you
+  want to use this protocol on your MultiGate boards.
+
+  If you want to compile this as a module, say M and read
+  <file:Documentation/modules.txt>.  The module will be called
+  comx-proto-lapb.o.
+
+Support for Frame Relay on MultiGate boards
+CONFIG_COMX_PROTO_FR
+  Frame Relay protocol driver for all MultiGate boards. Say Y if you
+  want to use this protocol on your MultiGate boards.
+
+  If you want to compile this as a module, say M and read
+  <file:Documentation/modules.txt>.  The module will be called
+  comx-proto-fr.o.
+
+Cyclom 2X(tm) multiprotocol cards
+CONFIG_CYCLADES_SYNC
+  Cyclom 2X from Cyclades Corporation (<http://www.cyclades.com/> and
+  <http://www.cyclades.com.br/>) is an intelligent multiprotocol WAN
+  adapter with data transfer rates up to 512 Kbps. These cards support
+  the X.25 and SNA related protocols. If you have one or more of these
+  cards, say Y to this option. The next questions will ask you about
+  the protocols you want the driver to support (for now only X.25 is
+  supported).
+
+  While no documentation is available at this time please grab the
+  wanconfig tarball in
+  <http://www.conectiva.com.br/~acme/cycsyn-devel/> (with minor changes
+  to make it compile with the current wanrouter include files; efforts
+  are being made to use the original package available at
+  <ftp://ftp.sangoma.com/>).
+
+  Feel free to contact me or the cycsyn-devel mailing list at
+  acme@conectiva.com.br and cycsyn-devel@bazar.conectiva.com.br for
+  additional details, I hope to have documentation available as soon
+  as possible. (Cyclades Brazil is writing the Documentation).
+
+  The driver will be compiled as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called cyclomx.o. For general information about
+  modules read <file:Documentation/modules.txt>.
+
+Cyclom 2X X.25 support
+CONFIG_CYCLOMX_X25
+  Say Y to this option if you are planning to connect a Cyclom 2X card
+  to an X.25 network.
+
+  If you say N, the X.25 support will not be included in the driver
+  (saves about 11 KB of kernel memory).
+
+Generic HDLC driver
+CONFIG_HDLC
+  Say Y to this option if your Linux box contains a WAN card supported
+  by this driver and you are planning to connect the box to a WAN
+  ( = Wide Area Network). You will need supporting software from
+  <http://hq.pm.waw.pl/hdlc/>.
+  Generic HDLC driver currently supports raw HDLC, Cisco HDLC, Frame
+  Relay, synchronous Point-to-Point Protocol (PPP) and X.25.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called hdlc.o.
+
+  If unsure, say N here.
+
+Raw HDLC support
+CONFIG_HDLC_RAW
+  Say Y to this option if you want generic HDLC driver to support
+  raw HDLC over WAN (Wide Area Network) connections.
+
+  If unsure, say N here.
+
+Cisco HDLC support
+CONFIG_HDLC_CISCO
+  Say Y to this option if you want generic HDLC driver to support
+  Cisco HDLC over WAN (Wide Area Network) connections.
+
+  If unsure, say N here.
+
+Frame-Relay HDLC support
+CONFIG_HDLC_FR
+  Say Y to this option if you want generic HDLC driver to support
+  Frame-Relay protocol over WAN (Wide Area Network) connections.
+
+  If unsure, say N here.
+
+Frame-Relay bridging support
+CONFIG_HDLC_FR_BRIDGE
+  Say Y to this option if you want generic HDLC driver to support
+  bridging LAN frames over Frame-Relay links.
+
+  If unsure, say N here.
+
+Synchronous Point-to-Point Protocol (PPP) support
+CONFIG_HDLC_PPP
+  Say Y to this option if you want generic HDLC driver to support
+  PPP over WAN (Wide Area Network) connections.
+
+  If unsure, say N here.
+
+CCITT X.25 over HDLC support
+CONFIG_HDLC_X25
+  Say Y to this option if you want generic HDLC driver to support
+  X.25 protocol over WAN (Wide Area Network) connections.
+
+  If unsure, say N here.
+
+SDL RISCom/N2 support
+CONFIG_N2
+  This driver is for RISCom/N2 single or dual channel ISA cards
+  made by SDL Communications Inc.  If you have such a card,
+  say Y here and see <http://hq.pm.waw.pl/pub/hdlc/>.
+
+  Note that N2csu and N2dds cards are not supported by this driver.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called n2.o.
+
+  If unsure, say N here.
+
+Moxa C101 support
+CONFIG_C101
+  This driver is for C101 SuperSync ISA cards made by Moxa
+  Technologies Co., Ltd. If you have such a card,
+  say Y here and see <http://hq.pm.waw.pl/pub/hdlc/>
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called c101.o.
+
+  If unsure, say N here.
+
+Ethernet (10 or 100Mbit)
+CONFIG_NET_ETHERNET
+  Ethernet (also called IEEE 802.3 or ISO 8802-2) is the most common
+  type of Local Area Network (LAN) in universities and companies.
+
+  Common varieties of Ethernet are: 10BASE-2 or Thinnet (10 Mbps over
+  coaxial cable, linking computers in a chain), 10BASE-T or twisted
+  pair (10 Mbps over twisted pair cable, linking computers to central
+  hubs), 10BASE-F (10 Mbps over optical fiber links, using hubs),
+  100BASE-TX (100 Mbps over two twisted pair cables, using hubs),
+  100BASE-T4 (100 Mbps over 4 standard voice-grade twisted pair
+  cables, using hubs), 100BASE-FX (100 Mbps over optical fiber links)
+  [the 100BASE varieties are also known as Fast Ethernet], and Gigabit
+  Ethernet (1 Gbps over optical fiber or short copper links).
+
+  If your Linux machine will be connected to an Ethernet and you have
+  an Ethernet network interface card (NIC) installed in your computer,
+  say Y here and read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>. You will then also have
+  to say Y to the driver for your particular NIC.
+
+  Note that the answer to this question won't directly affect the
+  kernel: saying N will just cause the configurator to skip all
+  the questions about Ethernet network cards. If unsure, say N.
+
+Western Digital/SMC cards
+CONFIG_NET_VENDOR_SMC
+  If you have a network (Ethernet) card belonging to this class, say Y
+  and read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  Note that the answer to this question doesn't directly affect the
+  kernel: saying N will just cause the configurator to skip all
+  the questions about Western Digital cards. If you say Y, you will be
+  asked for your specific card in the following questions.
+
+WD80*3 support
+CONFIG_WD80x3
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called wd.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+SMC Ultra MCA support
+CONFIG_ULTRAMCA
+  If you have a network (Ethernet) card of this type and are running
+  an MCA based system (PS/2), say Y and read the Ethernet-HOWTO,
+  available from <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called smc-mca.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+SMC Ultra support
+CONFIG_ULTRA
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  Important: There have been many reports that, with some motherboards
+  mixing an SMC Ultra and an Adaptec AHA154x SCSI card (or compatible,
+  such as some BusLogic models) causes corruption problems with many
+  operating systems. The Linux smc-ultra driver has a work-around for
+  this but keep it in mind if you have such a SCSI card and have
+  problems.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called smc-ultra.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt> as
+  well as <file:Documentation/networking/net-modules.txt>.
+
+SMC Ultra32 EISA support
+CONFIG_ULTRA32
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called smc-ultra32.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt> as
+  well as <file:Documentation/networking/net-modules.txt>.
+
+SMC 9194 support
+CONFIG_SMC9194
+  This is support for the SMC9xxx based Ethernet cards. Choose this
+  option if you have a DELL laptop with the docking station, or
+  another SMC9192/9194 based chipset.  Say Y if you want it compiled
+  into the kernel, and read the file
+  <file:Documentation/networking/smc9.txt> and the Ethernet-HOWTO,
+  available from <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called smc9194.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+PCI NE2000 and clones support
+CONFIG_NE2K_PCI
+  This driver is for NE2000 compatible PCI cards. It will not work
+  with ISA NE2000 cards (they have their own driver, "NE2000/NE1000
+  support" below). If you have a PCI NE2000 network (Ethernet) card,
+  say Y and read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver also works for the following NE2000 clone cards:
+    RealTek RTL-8029  Winbond 89C940  Compex RL2000  KTI ET32P2
+    NetVin NV5000SC   Via 86C926      SureCom NE34   Winbond
+    Holtek HT80232    Holtek HT80229
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ne2k-pci.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt> as
+  well as <file:Documentation/networking/net-modules.txt>.
+
+Racal-Interlan (Micom) NI cards
+CONFIG_NET_VENDOR_RACAL
+  If you have a network (Ethernet) card belonging to this class, such
+  as the NI5010, NI5210 or NI6210, say Y and read the Ethernet-HOWTO,
+  available from <http://www.tldp.org/docs.html#howto>.
+
+  Note that the answer to this question doesn't directly affect the
+  kernel: saying N will just cause the configurator to skip all
+  the questions about NI cards. If you say Y, you will be asked for
+  your specific card in the following questions.
+
+NI5010 support
+CONFIG_NI5010
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>. Note that this is still
+  experimental code.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ni5010.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+NI5210 support
+CONFIG_NI52
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ni52.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+NI6510 support
+CONFIG_NI65
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ni65.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+RealTek RTL-8139C+ 10/100 PCI Fast Ethernet Adapter support
+CONFIG_8139CP
+  This is a driver for the Fast Ethernet PCI network cards based on
+  the RTL8139C+ chips. If you have one of those, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read Documentation/modules.txt. This is recommended.
+  The module will be called 8139cp.o.
+
+RealTek RTL-8139 PCI Fast Ethernet Adapter support
+CONFIG_8139TOO
+  This is a driver for the Fast Ethernet PCI network cards based on
+  the RTL8139 chips. If you have one of those, say Y and read
+  <file:Documentation/networking/8139too.txt> as well as the
+  Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called 8139too.o.
+
+Use PIO instead of MMIO
+CONFIG_8139TOO_PIO
+  This instructs the driver to use programmed I/O ports (PIO) instead
+  of PCI shared memory (MMIO).  This can possibly solve some problems
+  in case your mainboard has memory consistency issues.  If unsure,
+  say N.
+
+Support for uncommon RTL-8139 rev. K (automatic channel equalization)
+CONFIG_8139TOO_TUNE_TWISTER
+  This implements a function which might come in handy in case you
+  are using low quality on long cabling. It is required for RealTek
+  RTL-8139 revision K boards, and totally unused otherwise.  It tries
+  to match the transceiver to the cable characteristics. This is
+  experimental since hardly documented by the manufacturer.
+  If unsure, say Y.
+
+Support for older RTL-8129/8130 boards
+CONFIG_8139TOO_8129
+  This enables support for the older and uncommon RTL-8129 and
+  RTL-8130 chips, which support MII via an external transceiver,
+  instead of an internal one.  Disabling this option will save some
+  memory by making the code size smaller.  If unsure, say Y.
+
+Use older RX-reset method
+CONFIG_8139_OLD_RX_RESET
+  The 8139too driver was recently updated to contain a more rapid
+  reset sequence, in the face of severe receive errors.  This "new"
+  RX-reset method should be adequate for all boards.  But if you
+  experience problems, you can enable this option to restore the
+  old RX-reset behavior.  If unsure, say N.
+
+SiS 900/7016 PCI Fast Ethernet Adapter support
+CONFIG_SIS900
+  This is a driver for the Fast Ethernet PCI network cards based on
+  the SiS 900 and SiS 7016 chips. The SiS 900 core is also embedded in
+  SiS 630 and SiS 540 chipsets.  If you have one of those, say Y and
+  read the Ethernet-HOWTO, available at
+  <http://www.tldp.org/docs.html#howto>.  Please read
+  <file:Documentation/networking/sis900.txt> and comments at the
+  beginning of <file:drivers/net/sis900.c> for more information.
+
+  This driver also supports AMD 79C901 HomePNA so that you can use
+  your phone line as a network cable.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called sis900.o.
+
+Packet Engines Yellowfin Gigabit-NIC / Symbios 53c885 support
+CONFIG_YELLOWFIN
+  Say Y here if you have a Packet Engines G-NIC PCI Gigabit Ethernet
+  adapter or the SYM53C885 Ethernet controller. The Gigabit adapter is
+  used by the Beowulf Linux cluster project.  See
+  <http://cesdis.gsfc.nasa.gov/linux/drivers/yellowfin.html> for more
+  information about this driver in particular and Beowulf in general.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called yellowfin.o.
+
+Realtek 8169 Gigabit Ethernet support
+CONFIG_R8169
+  Say Y here if you have a Realtek 8169 PCI Gigabit Ethernet adapter.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called r8169.o.
+
+General Instruments Surfboard 1000
+CONFIG_NET_SB1000
+  This is a driver for the General Instrument (also known as
+  NextLevel) SURFboard 1000 internal
+  cable modem. This is an ISA card which is used by a number of cable
+  TV companies to provide cable modem access. It's a one-way
+  downstream-only cable modem, meaning that your upstream net link is
+  provided by your regular phone modem.
+
+  At present this driver only compiles as a module, so say M here if
+  you have this card. The module will be called sb1000.o. Then read
+  <file:Documentation/networking/README.sb1000> for information on how
+  to use this module, as it needs special ppp scripts for establishing
+  a connection. Further documentation and the necessary scripts can be
+  found at:
+
+  <http://www.jacksonville.net/~fventuri/>
+  <http://home.adelphia.net/~siglercm/sb1000.html>
+  <http://linuxpower.cx/~cable/>
+
+  If you don't have this card, of course say N.
+
+Adaptec Starfire support
+CONFIG_ADAPTEC_STARFIRE
+  Say Y here if you have an Adaptec Starfire (or DuraLAN) PCI network
+  adapter. The DuraLAN chip is used on the 64 bit PCI boards from
+  Adaptec e.g. the ANA-6922A. The older 32 bit boards use the tulip
+  driver.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called starfire.o.
+
+Alteon AceNIC/3Com 3C985/NetGear GA620 Gigabit support
+CONFIG_ACENIC
+  Say Y here if you have an Alteon AceNIC, 3Com 3C985(B), NetGear
+  GA620, SGI Gigabit or Farallon PN9000-SX PCI Gigabit Ethernet
+  adapter. The driver allows for using the Jumbo Frame option (9000
+  bytes/frame) however it requires that your switches can handle this
+  as well. To enable Jumbo Frames, add `mtu 9000' to your ifconfig
+  line.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called acenic.o.
+
+Omit support for old Tigon I based AceNICs
+CONFIG_ACENIC_OMIT_TIGON_I
+  Say Y here if you only have Tigon II based AceNICs and want to leave
+  out support for the older Tigon I based cards which are no longer
+  being sold (ie. the original Alteon AceNIC and 3Com 3C985 (non B
+  version)).  This will reduce the size of the driver object by
+  app. 100KB.  If you are not sure whether your card is a Tigon I or a
+  Tigon II, say N here.
+
+  The safe and default value for this is N.
+
+SysKonnect SK-98xx and SK-95xx Gigabit Ethernet Adapter family support
+CONFIG_SK98LIN
+  Say Y here if you have a SysKonnect SK-98xx or SK-95xx Gigabit 
+  Ethernet Server Adapter. The following adapters are supported by 
+  this driver:
+  - SK-9521 10/100/1000Base-T Adapter
+  - SK-9821 Gigabit Ethernet 1000Base-T Server Adapter
+  - SK-9822 Gigabit Ethernet 1000Base-T Dual Port Server Adapter
+  - SK-9841 Gigabit Ethernet 1000Base-LX Server Adapter
+  - SK-9842 Gigabit Ethernet 1000Base-LX Dual Port Server Adapter
+  - SK-9843 Gigabit Ethernet 1000Base-SX Server Adapter
+  - SK-9844 Gigabit Ethernet 1000Base-SX Dual Port Server Adapter
+  - SK-9861 Gigabit Ethernet 1000Base-SX Server Adapter
+  - SK-9862 Gigabit Ethernet 1000Base-SX Dual Port Server Adapter
+  - SK-9871 Gigabit Ethernet 1000Base-ZX Server Adapter
+  - SK-9872 Gigabit Ethernet 1000Base-ZX Dual Port Server Adapter
+  - SK-9821 V2.0 Gigabit Ethernet 10/100/1000Base-T Adapter
+  - SK-9841 V2.0 Gigabit Ethernet 1000Base-LX Adapter
+  - SK-9843 V2.0 Gigabit Ethernet 1000Base-SX Adapter
+  - SK-9851 V2.0 Gigabit Ethernet 1000Base-SX Adapter
+  - SK-9861 V2.0 Gigabit Ethernet 1000Base-SX Adapter
+  - SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter
+
+  The adapters support Jumbo Frames.
+  The dual link adapters support link-failover and dual port features.
+  The V2.0 adapters support the scatter-gather functionality with
+  sendfile(). Read Documentation/networking/sk98lin.txt for information about
+  optional driver parameters.
+  Questions concerning this driver may be addressed to:
+    linux@syskonnect.de
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read Documentation/modules.txt. This is recommended.
+  The module will be called sk98lin.o.
+
+Sun GEM support
+CONFIG_SUNGEM
+  Support for the Sun GEM chip, aka Sun GigabitEthernet/P 2.0.  See also
+  <http://www.sun.com/products-n-solutions/hardware/docs/pdf/806-3985-10.pdf>.
+
+  This chip is also used by Apple under the name GMAC in all their recent
+  machines starting with the first iBook. This includes all AGP capable
+  Apple machines except some early G4s and iMacs that still used a
+  Tulip chip. This driver obsoletes the GMAC driver for these machines.
+  
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called sungem.o.
+
+Broadcom Tigon3 support
+CONFIG_TIGON3
+  This driver supports Broadcom Tigon3 based gigabit Ethernet cards.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called tg3.o.
+
+MyriCOM Gigabit Ethernet support
+CONFIG_MYRI_SBUS
+  This driver supports MyriCOM Sbus gigabit Ethernet cards.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called myri_sbus.o.
+
+D-Link 2000-based Gigabit Ethernet support
+CONFIG_DL2K
+  This driver supports D-Link 2000-based gigabit ethernet cards, which
+  includes
+       D-Link DGE-550T Gigabit Ethernet Adapter.
+       D-Link DL2000-based Gigabit Ethernet Adapter.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called dl2k.o.
+
+EtherExpress Pro/100 support (e100, Alternate Intel driver)
+CONFIG_E100
+  This driver supports Intel(R) PRO/100 family of adapters, which
+  includes:
+
+     Controller  Adapter Name                       Board IDs
+     ----------  ------------                       ---------
+
+     82558       PRO/100+ PCI Adapter               668081-xxx,
+                                                    689661-xxx
+     82558       PRO/100+ Management Adapter        691334-xxx,
+                                                    701738-xxx,
+                                                    721383-xxx
+     82558       PRO/100+ Dual Port Server Adapter  714303-xxx,
+                                                    711269-xxx,
+                                                    A28276-xxx
+     82558       PRO/100+ PCI Server Adapter        710550-xxx
+     82550       PRO/100 S Server Adapter           752438-xxx
+     82559                                          A56831-xxx,
+                                                    A10563-xxx,
+                                                    A12171-xxx,
+                                                    A12321-xxx,
+                                                    A12320-xxx,
+                                                    A12170-xxx
+                                                    748568-xxx
+                                                    748565-xxx
+     82550       PRO/100 S Desktop Adapter          751767-xxx
+     82559                                          748592-xxx,
+                                                    A12167-xxx,
+                                                    A12318-xxx,
+                                                    A12317-xxx,
+                                                    A12165-xxx,
+                                                    748569-xxx
+     82559       PRO/100+ Server Adapter            729757-xxx
+     82559       PRO/100 S Management Adapter       748566-xxx,
+                                                    748564-xxx
+     82550       PRO/100 S Dual Port Server Adapter A56831-xxx
+     82551       PRO/100 M Desktop Adapter          A80897-xxx
+                 PRO/100 S Advanced Management Adapter
+                                                    747842-xxx,
+                                                    745171-xxx
+     CNR         PRO/100 VE Desktop Adapter         A10386-xxx,
+                                                    A10725-xxx,
+                                                    A23801-xxx,
+                                                    A19716-xxx
+                 PRO/100 VM Desktop Adapter         A14323-xxx,
+                                                    A19725-xxx,
+                                                    A23801-xxx,
+                                                    A22220-xxx,
+                                                    A23796-xxx
+
+
+  To verify that your adapter is supported, find the board ID number
+  on the adapter. Look for a label that has a barcode and a number
+  in the format 123456-001 (six digits hyphen three digits). Match
+  this to the list of numbers above.
+
+  For more information on how to identify your adapter, go to the
+  Adapter & Driver ID Guide at:
+
+    http://support.intel.com/support/network/adapter/pro100/21397.htm
+
+  For the latest Intel PRO/100 network driver for Linux, see:
+
+    http://appsr.intel.com/scripts-df/support_intel.asp
+
+  More specific information on configuring the driver is in
+  <file:Documentation/networking/e100.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called e100.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+Intel(R) PRO/1000 Gigabit Ethernet support
+CONFIG_E1000
+  This driver supports Intel(R) PRO/1000 gigabit ethernet family of
+  adapters, which includes:
+
+     Controller  Adapter Name                         Board IDs
+     ----------  ------------                         ---------
+     82542       PRO/1000 Gigabit Server Adapter      700262-xxx,
+                                                      717037-xxx
+     82543       PRO/1000 F Server Adapter            738640-xxx,
+                                                      A38888-xxx
+     82543       PRO/1000 T Server Adapter            A19845-xxx,
+                                                      A33948-xxx
+     82544       PRO/1000 XT Server Adapter           A51580-xxx
+     82544       PRO/1000 XF Server Adapter           A50484-xxx
+     82544       PRO/1000 T Desktop Adapter           A62947-xxx
+     82540       PRO/1000 MT Desktop Adapter          A78408-xxx
+     82541       PRO/1000 MT Desktop Adapter          C91016-xxx
+     82545       PRO/1000 MT Server Adapter           A92165-xxx
+     82546       PRO/1000 MT Dual Port Server Adapter A92111-xxx
+     82545       PRO/1000 MF Server Adapter           A91622-xxx
+     82545       PRO/1000 MF Server Adapter(LX)       A91624-xxx
+     82546       PRO/1000 MF Dual Port Server Adapter A91620-xxx 
+
+  For more information on how to identify your adapter, go to the
+  Adapter & Driver ID Guide at:
+
+   <http://support.intel.com/support/network/adapter/pro100/21397.htm>
+
+  For general information and support, go to the Intel support
+  website at:
+
+   <http://support.intel.com>
+
+  More specific information on configuring the driver is in 
+  <file:Documentation/networking/e1000.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called e1000.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+AMD LANCE and PCnet (AT1500 and NE2100) support
+CONFIG_LANCE
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>. Some LinkSys cards are
+  of this type.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called lance.o.
+
+SGI IOC3 Ethernet
+CONFIG_SGI_IOC3_ETH
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+National Semiconductor DP83902AV support
+CONFIG_STNIC
+  Support for cards based on the National Semiconductor DP83902AV
+  ST-NIC Serial Network Interface Controller for Twisted Pair.  This
+  is a 10Mbit/sec Ethernet controller.  Product overview and specs at
+  <http://www.national.com/pf/DP/DP83902A.html>.
+
+  If unsure, say N.
+
+3COM cards
+CONFIG_NET_VENDOR_3COM
+  If you have a network (Ethernet) card belonging to this class, say Y
+  and read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  Note that the answer to this question doesn't directly affect the
+  kernel: saying N will just cause the configurator to skip all
+  the questions about 3COM cards. If you say Y, you will be asked for
+  your specific card in the following questions.
+
+3c501 "EtherLink" support
+CONFIG_EL1
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.  Also, consider buying a
+  new card, since the 3c501 is slow, broken, and obsolete: you will
+  have problems.  Some people suggest to ping ("man ping") a nearby
+  machine every minute ("man cron") when using this card.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called 3c501.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+3c503 "EtherLink II" support
+CONFIG_EL2
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called 3c503.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+3c505 "EtherLink Plus" support
+CONFIG_ELPLUS
+  Information about this network (Ethernet) card can be found in
+  <file:Documentation/networking/3c505.txt>.  If you have a card of
+  this type, say Y and read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called 3c505.o.
+
+3c507 (EtherLink 16) support
+CONFIG_EL16
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called 3c507.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+3c523 "EtherlinkMC" support
+CONFIG_ELMC
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called 3c523.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+3c527 "EtherLink/MC 32" support
+CONFIG_ELMC_II
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called 3c527.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+3c509/3c529 (MCA)/3c579 "EtherLink III"  support
+CONFIG_EL3
+  If you have a network (Ethernet) card belonging to the 3Com
+  EtherLinkIII series, say Y and read the Ethernet-HOWTO, available
+  from <http://www.tldp.org/docs.html#howto>.
+
+  If your card is not working you may need to use the DOS
+  setup disk to disable Plug & Play mode, and to select the default
+  media type.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called 3c509.o.
+
+3c515 ISA Fast EtherLink
+CONFIG_3C515
+  If you have a 3Com ISA EtherLink XL "Corkscrew" 3c515 Fast Ethernet
+  network card, say Y and read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called 3c515.o.
+
+3c590/3c900 series (592/595/597) "Vortex/Boomerang/Cyclone" support
+CONFIG_VORTEX
+  This option enables driver support for a large number of 10mbps and
+  10/100mbps EISA, PCI and PCMCIA 3Com network cards:
+
+  "Vortex"    (Fast EtherLink 3c590/3c592/3c595/3c597) EISA and PCI
+  "Boomerang" (EtherLink XL 3c900 or 3c905)            PCI
+  "Cyclone"   (3c540/3c900/3c905/3c980/3c575/3c656)    PCI and Cardbus
+  "Tornado"   (3c905)                                  PCI
+  "Hurricane" (3c555/3cSOHO)                           PCI
+
+  If you have such a card, say Y and read the Ethernet-HOWTO,
+  available from <http://www.tldp.org/docs.html#howto>. More
+  specific information is in
+  <file:Documentation/networking/vortex.txt> and in the comments at
+  the beginning of <file:drivers/net/3c59x.c>.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called 3c59x.o.
+
+3cr990 series "Typhoon" support
+CONFIG_TYPHOON
+  This option enables driver support for the 3cr990 series of cards:
+
+  3C990-TX, 3CR990-TX-95, 3CR990-TX-97, 3CR990-FX-95, 3CR990-FX-97,
+  3CR990SVR, 3CR990SVR95, 3CR990SVR97, 3CR990-FX-95 Server,
+  3CR990-FX-97 Server, 3C990B-TX-M, 3C990BSVR
+
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.linuxdoc.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called typhoon.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+Other ISA cards
+CONFIG_NET_ISA
+  If your network (Ethernet) card hasn't been mentioned yet and its
+  bus system (that's the way the cards talks to the other components
+  of your computer) is ISA (as opposed to EISA, VLB or PCI), say Y.
+  Make sure you know the name of your card. Read the Ethernet-HOWTO,
+  available from <http://www.tldp.org/docs.html#howto>.
+
+  If unsure, say Y.
+
+  Note that the answer to this question doesn't directly affect the
+  kernel: saying N will just cause the configurator to skip all
+  the remaining ISA network card questions. If you say Y, you will be
+  asked for your specific card in the following questions.
+
+Generic ARCnet support
+CONFIG_ARCNET
+  If you have a network card of this type, say Y and check out the
+  (arguably) beautiful poetry in
+  <file:Documentation/networking/arcnet.txt>.
+
+  You need both this driver, and the driver for the particular ARCnet
+  chipset of your card. If you don't know, then it's probably a
+  COM90xx type card, so say Y (or M) to "ARCnet COM90xx chipset
+  support" below.
+
+  You might also want to have a look at the Ethernet-HOWTO, available
+  from <http://www.tldp.org/docs.html#howto>(even though ARCnet
+  is not really Ethernet).
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called arcnet.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+Enable old ARCNet packet format (RFC 1051)
+CONFIG_ARCNET_1051
+  This allows you to use RFC1051 with your ARCnet card via the virtual
+  arc0s device. You only need arc0s if you want to talk to ARCnet
+  software complying with the "old" standard, specifically, the DOS
+  arcnet.com packet driver, Amigas running AmiTCP, and some variants
+  of NetBSD. You do not need to say Y here to communicate with
+  industry-standard RFC1201 implementations, like the arcether.com
+  packet driver or most DOS/Windows ODI drivers. RFC1201 is included
+  automatically as the arc0 device. Please read the ARCnet
+  documentation in <file:Documentation/networking/arcnet.txt> for more
+  information about using arc0e and arc0s.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called rfc1051.o.
+
+Enable standard ARCNet packet format (RFC 1201)
+CONFIG_ARCNET_1201
+  This allows you to use RFC1201 with your ARCnet card via the virtual
+  arc0 device.  You need to say Y here to communicate with
+  industry-standard RFC1201 implementations, like the arcether.com
+  packet driver or most DOS/Windows ODI drivers.  Please read the
+  ARCnet documentation in <file:Documentation/networking/arcnet.txt>
+  for more information about using arc0.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called rfc1201.o.
+
+Enable raw mode packet interface
+CONFIG_ARCNET_RAW
+  ARCnet "raw mode" packet encapsulation, no soft headers.  Unlikely
+  to work unless talking to a copy of the same Linux arcnet driver,
+  but perhaps marginally faster in that case.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called arc-rawmode.o.
+
+ARCnet COM90xx (normal) chipset driver
+CONFIG_ARCNET_COM90xx
+  This is the chipset driver for the standard COM90xx cards. If you
+  have always used the old ARCnet driver without knowing what type of
+  card you had, this is probably the one for you.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called com90xx.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+ARCnet COM90xx (IO mapped) chipset driver
+CONFIG_ARCNET_COM90xxIO
+  This is the chipset driver for the COM90xx cards, using them in
+  IO-mapped mode instead of memory-mapped mode. This is slower than
+  the normal driver. Only use it if your card doesn't support shared
+  memory.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called com90io.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+ARCnet COM90xx (RIM I) chipset driver
+CONFIG_ARCNET_RIM_I
+  This is yet another chipset driver for the COM90xx cards, but this
+  time only using memory-mapped mode, and no IO ports at all. This
+  driver is completely untested, so if you have one of these cards,
+  please mail dwmw2@infradead.org, especially if it works!
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you
+  want). The module will be called arc-rimi.o.  If you want to compile
+  it as a module, say M here and read <file:Documentation/modules.txt>
+  as  well as <file:Documentation/networking/net-modules.txt>.
+
+ARCnet COM20020 chipset driver
+CONFIG_ARCNET_COM20020
+  This is the driver for the new COM20020 chipset. It supports such
+  things as promiscuous mode, so packet sniffing is possible, and
+  extra diagnostic information.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called com20020.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt> as
+  well as <file:Documentation/networking/net-modules.txt>.
+
+Cabletron E21xx support
+CONFIG_E2100
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called e2100.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+Broadcom 4400 ethernet support (EXPERIMENTAL)
+CONFIG_B44
+  If you have a network (Ethernet) controller of this type, say Y and
+  read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called b44.
+
+CS89x0 support (Daynaport CS and LC cards)
+CONFIG_CS89x0
+  Support for CS89x0 chipset based Ethernet cards. If you have a
+  network (Ethernet) card of this type, say Y and read the
+  Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto> as well as
+  <file:Documentation/networking/cs89x0.txt>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called cs89x.o.
+
+DEPCA, DE10x, DE200, DE201, DE202, DE422 support
+CONFIG_DEPCA
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto> as well as
+  <file:drivers/net/depca.c>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called
+  depca.o.
+
+EtherWORKS 3 (DE203, DE204, DE205) support
+CONFIG_EWRK3
+  This driver supports the DE203, DE204 and DE205 network (Ethernet)
+  cards. If this is for you, say Y and read
+  <file:Documentation/networking/ewrk3.txt> in the kernel source as
+  well as the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called ewrk3.o.
+
+SEEQ8005 support
+CONFIG_SEEQ8005
+  This is a driver for the SEEQ 8005 network (Ethernet) card.  If this
+  is for you, read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called ewrk3.o.
+
+AT1700/1720 support
+CONFIG_AT1700
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called at1700.o.
+
+FMV-181/182/183/184 support
+CONFIG_FMV18X
+  If you have a Fujitsu FMV-181/182/183/184 network (Ethernet) card,
+  say Y and read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you use an FMV-183 or FMV-184 and it is not working, you may need
+  to disable Plug & Play mode of the card.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called fmv18x.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+EtherExpressPro and EtherExpress 10 (i82595) support
+CONFIG_EEXPRESS_PRO
+  If you have a network (Ethernet) card of this type, say Y. This
+  driver supports intel i82595{FX,TX} based boards. Note however
+  that the EtherExpress PRO/100 Ethernet card has its own separate
+  driver.  Please read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called eepro.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+EtherExpress 16 support
+CONFIG_EEXPRESS
+  If you have an EtherExpress16 network (Ethernet) card, say Y and
+  read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.  Note that the Intel
+  EtherExpress16 card used to be regarded as a very poor choice
+  because the driver was very unreliable. We now have a new driver
+  that should do better.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called eexpress.o.
+
+Packet Engines Hamachi GNIC-II support
+CONFIG_HAMACHI
+  If you have a Gigabit Ethernet card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called hamachi.o.
+
+HP PCLAN+ (27247B and 27252A) support
+CONFIG_HPLAN_PLUS
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called hp-plus.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+HP PCLAN (27245 and other 27xxx series) support
+CONFIG_HPLAN
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called hp.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+HP 10/100VG PCLAN (ISA, EISA, PCI) support
+CONFIG_HP100
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called hp100.o.
+
+NE2000/NE1000 support
+CONFIG_NE2000
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.  Many Ethernet cards
+  without a specific driver are compatible with NE2000.
+
+  If you have a PCI NE2000 card however, say N here and Y to "PCI
+  NE2000 support", above. If you have a NE2000 card and are running on
+  an MCA system (a bus system used on some IBM PS/2 computers and
+  laptops), say N here and Y to "NE/2 (ne2000 MCA version) support",
+  below.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ne.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+National Semiconductor DP8381x series PCI Ethernet support
+CONFIG_NATSEMI
+  This driver is for the National Semiconductor DP83810 series,
+  which is used in cards from PureData, NetGear, Linksys
+  and others, including the 83815 chip.
+  More specific information and updates are available from
+  <http://www.scyld.com/network/natsemi.html>.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called natsemi.o.
+
+NatSemi workaround for high errors
+CONFIG_NATSEMI_CABLE_MAGIC
+  Some systems see lots of errors with NatSemi ethernet controllers
+  on certain cables.  If you are seeing lots of errors, try turning
+  this option on.  Some boards have incorrect values for supporting
+  resistors that can cause this change to break.  If you turn this
+  option on and your network suddenly stops working, turn this
+  option off.
+
+SK_G16 support
+CONFIG_SK_G16
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+NE/2 (ne2000 MCA version) support
+CONFIG_NE2_MCA
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ne2.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+SKnet MCA support
+CONFIG_SKMC
+  These are Micro Channel Ethernet adapters. You need to say Y to "MCA
+  support" in order to use this driver.  Supported cards are the SKnet
+  Junior MC2 and the SKnet MC2(+).  The driver automatically
+  distinguishes between the two cards. Note that using multiple boards
+  of different type hasn't been tested with this driver.  Say Y if you
+  have one of these Ethernet adapters.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called sk_mca.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+IBM LAN Adapter/A support
+CONFIG_IBMLANA
+  This is a Micro Channel Ethernet adapter.  You need to set
+  CONFIG_MCA to use this driver.  It is both available as an in-kernel
+  driver and as a module ( = code which can be inserted in and removed
+  from the running kernel whenever you want).  If you want to compile
+  it as a module, say M here and read <file:Documentation/modules.txt>
+  as well as <file:Documentation/networking/net-modules.txt>. The only
+  currently supported card is the IBM LAN Adapter/A for Ethernet.  It
+  will both support 16K and 32K memory windows, however a 32K window
+  gives a better security against packet losses.  Usage of multiple
+  boards with this driver should be possible, but has not been tested
+  up to now due to lack of hardware.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ibmlana.o.
+
+EISA, VLB, PCI and on board controllers
+CONFIG_NET_PCI
+  This is another class of network cards which attach directly to the
+  bus. If you have one of those, say Y and read the Ethernet-HOWTO,
+  available from <http://www.tldp.org/docs.html#howto>.
+
+  Note that the answer to this question doesn't directly affect the
+  kernel: saying N will just cause the configurator to skip all
+  the questions about this class of network cards. If you say Y, you
+  will be asked for your specific card in the following questions. If
+  you are unsure, say Y.
+
+AMD PCnet32 (VLB and PCI) support
+CONFIG_PCNET32
+  If you have a PCnet32 or PCnetPCI based network (Ethernet) card,
+  answer Y here and read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called pcnet32.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+AMD 8111 (new PCI lance) support
+CONFIG_AMD8111_ETH
+  If you have an AMD 8111-based PCI lance ethernet card,
+  answer Y here and read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called amd8111e.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+Ansel Communications EISA 3200 support
+CONFIG_AC3200
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ac3200.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+Mylex EISA LNE390A/LNE390B support
+CONFIG_LNE390
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called lne390.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+Novell/Eagle/Microdyne NE3210 EISA support
+CONFIG_NE3210
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.  Note that this driver
+  will NOT WORK for NE3200 cards as they are completely different.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ne3210.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+Apricot Xen-II on board Ethernet
+CONFIG_APRICOT
+  If you have a network (Ethernet) controller of this type, say Y and
+  read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  The module will be
+  called apricot.o.
+
+Generic DECchip & DIGITAL EtherWORKS PCI/EISA
+CONFIG_DE4X5
+  This is support for the DIGITAL series of PCI/EISA Ethernet cards.
+  These include the DE425, DE434, DE435, DE450 and DE500 models.  If
+  you have a network card of this type, say Y and read the
+  Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>. More specific
+  information is contained in
+  <file:Documentation/networking/de4x5.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called de4x5.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+DECchip Tulip (dc21x4x) PCI support
+CONFIG_TULIP
+  This driver is developed for the SMC EtherPower series Ethernet
+  cards and also works with cards based on the DECchip 
+  21040/21041/21140 (Tulip series) chips.  Some LinkSys PCI cards are
+  of this type.  (If your card is NOT SMC EtherPower 10/100 PCI
+  (smc9332dst), you can also try the driver for "Generic DECchip"
+  cards, above.  However, most people with a network card of this type
+  will say Y here.) Do read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.  More specific
+  information is contained in 
+  <file:Documentation/networking/tulip.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called tulip.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+Use PCI shared memory for NIC registers
+CONFIG_TULIP_MMIO
+  Use PCI shared memory for the NIC registers, rather than going through 
+  the Tulip's PIO (programmed I/O ports).  Faster, but could produce 
+  obscure bugs if your mainboard has memory controller timing issues.
+  If in doubt, say N.
+
+Digi Intl. RightSwitch SE-X support
+CONFIG_DGRS
+  This is support for the Digi International RightSwitch series of
+  PCI/EISA Ethernet switch cards. These include the SE-4 and the SE-6
+  models.  If you have a network card of this type, say Y and read the
+  Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.  More specific
+  information is contained in <file:Documentation/networking/dgrs.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called dgrs.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+EtherExpress Pro/100 support
+CONFIG_EEPRO100
+  If you have an Intel EtherExpress PRO/100 PCI network (Ethernet)
+  card, say Y and read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called eepro100.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt> as
+  well as <file:Documentation/networking/net-modules.txt>.
+
+Use PIO instead of MMIO
+CONFIG_EEPRO100_PIO
+  This instructs the driver to use programmed I/O ports (PIO) instead
+  of PCI shared memory (MMIO).  This can possibly solve some problems
+  in case your mainboard has memory consistency issues.  If unsure,
+  say N.
+
+Enable Power Management
+CONFIG_EEPRO100_PM
+  Many Intel EtherExpress PRO/100 PCI network cards are capable
+  of providing power management capabilities.  To make use of these
+  capabilities, say Y.
+
+  WARNING:  This option is intended for kernel developers and testers.
+  It is still very experimental, with some people reporting complete
+  lockups.
+
+  It is recommended to say N here.
+
+Myson MTD-8xx PCI Ethernet support
+CONFIG_FEALNX
+  Say Y here to support the Mysom MTD-800 family of PCI-based Ethernet
+  cards. Specifications and data at
+  <http://www.myson.com.hk/mtd/datasheet/>.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called fealnx.o.
+
+LP486E on board Ethernet
+CONFIG_LP486E
+  Say Y here to support the 82596-based on-board Ethernet controller
+  for the Panther motherboard, which is one of the two shipped in the
+  Intel Professional Workstation.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called lp486e.o.
+
+ICL EtherTeam 16i/32 support
+CONFIG_ETH16I
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called eth16i.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+TI ThunderLAN support
+CONFIG_TLAN
+  If you have a PCI Ethernet network card based on the ThunderLAN chip
+  which is supported by this driver, say Y and read the
+  Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  Devices currently supported by this driver are Compaq Netelligent,
+  Compaq NetFlex and Olicom cards.  Please read the file
+  <file:Documentation/networking/tlan.txt> for more details.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called tlan.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+  Please email feedback to  torben.mathiasen@compaq.com.
+
+VIA Rhine support
+CONFIG_VIA_RHINE
+  If you have a VIA "rhine" based network card (Rhine-I (3043) or
+  Rhine-2 (VT86c100A)), say Y here.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called via-rhine.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt> as
+  well as <file:Documentation/networking/net-modules.txt>.
+
+VIA Rhine MMIO support (EXPERIMENTAL)
+CONFIG_VIA_RHINE_MMIO
+  This instructs the driver to use PCI shared memory (MMIO) instead of
+  programmed I/O ports (PIO). Enabling this gives an improvement in
+  processing time in parts of the driver.
+
+  It is not known if this works reliably on all "rhine" based cards,
+  but it has been tested successfully on some DFE-530TX adapters.
+
+  If unsure, say N.
+
+Davicom DM910x/DM980x support
+CONFIG_DM9102
+  This driver is for DM9102(A)/DM9132/DM9801 compatible PCI cards from
+  Davicom (<http://www.davicom.com.tw/>).  If you have such a network
+  (Ethernet) card, say Y.  Some information is contained in the file
+  <file:Documentation/networking/dmfe.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called dmfe.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+Racal-Interlan EISA ES3210 support
+CONFIG_ES3210
+  If you have a network (Ethernet) card of this type, say Y and read
+  the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called es3210.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/networking/net-modules.txt>.
+
+SMC EtherPower II
+CONFIG_EPIC100
+  This driver is for the SMC EtherPower II 9432 PCI Ethernet NIC,
+  which is based on the SMC83c17x (EPIC/100).
+  More specific information and updates are available from
+  <http://www.scyld.com/network/epic100.html>.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called epic100.o.
+
+DEC LANCE Ethernet controller support
+CONFIG_DECLANCE
+  This driver is for the series of Ethernet controllers produced by
+  DEC (now Compaq) based on the AMD Lance chipset, including the
+  DEPCA series.  (This chipset is better known via the NE2100 cards.)
+
+SGI Seeq Ethernet controller support
+CONFIG_SGISEEQ
+  Say Y here if you have an Seeq based Ethernet network card. This is
+  used in many Silicon Graphics machines.
+
+Sundance Alta PCI Ethernet support
+CONFIG_SUNDANCE
+  This driver is for the Sundance "Alta" chip.
+  More specific information and updates are available from
+  <http://www.scyld.com/network/sundance.html>.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called sundance.o.
+
+Sundance Alta memory-mapped I/O support
+CONFIG_SUNDANCE_MMIO
+  Enable memory-mapped I/O for interaction with Sundance NIC registers.
+  Do NOT enable this by default, PIO (enabled when MMIO is disabled)
+  is known to solve bugs on certain chips.
+
+  If unsure, say N.
+
+Sun3/Sun3x on-board LANCE support
+CONFIG_SUN3LANCE
+  Most Sun3 and Sun3x motherboards (including the 3/50, 3/60 and 3/80)
+  featured an AMD Lance 10Mbit Ethernet controller on board; say Y
+  here to compile in the Linux driver for this and enable Ethernet.
+  General Linux information on the Sun 3 and 3x series (now
+  discontinued) is at
+  <http://www.angelfire.com/ca2/tech68k/sun3.html>.
+
+  If you're not building a kernel for a Sun 3, say N.
+
+Sun3 on-board Intel 82586 support
+CONFIG_SUN3_82586
+  This driver enables support for the on-board Intel 82586 based
+  Ethernet adapter found on Sun 3/1xx and 3/2xx motherboards.  Note
+  that this driver does not support 82586-based adapters on additional
+  VME boards.
+
+Winbond W89c840 PCI Ethernet support
+CONFIG_WINBOND_840
+  This driver is for the Winbond W89c840 chip.  It also works with
+  the TX9882 chip on the Compex RL100-ATX board.
+  More specific information and updates are available from
+  <http://www.scyld.com/network/drivers.html>.
+
+Zenith Z-Note support
+CONFIG_ZNET
+  The Zenith Z-Note notebook computer has a built-in network
+  (Ethernet) card, and this is the Linux driver for it. Note that the
+  IBM Thinkpad 300 is compatible with the Z-Note and is also supported
+  by this driver. Read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+Philips SAA9730 Ethernet support
+CONFIG_LAN_SAA9730
+  The SAA9730 is a combined multimedia and peripheral controller used
+  in thin clients, Internet access terminals, and diskless
+  workstations.
+  See <http://www.semiconductors.philips.com/pip/SAA9730_flyer_1>.
+
+Pocket and portable adapters
+CONFIG_NET_POCKET
+  Cute little network (Ethernet) devices which attach to the parallel
+  port ("pocket adapters"), commonly used with laptops. If you have
+  one of those, say Y and read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you want to plug a network (or some other) card into the PCMCIA
+  (or PC-card) slot of your laptop instead (PCMCIA is the standard for
+  credit card size extension cards used by all modern laptops), you
+  need the pcmcia-cs package (location contained in the file
+  <file:Documentation/Changes>) and you can say N here.
+
+  Laptop users should read the Linux Laptop home page at
+  <http://www.cs.utexas.edu/users/kharker/linux-laptop/>.
+
+  Note that the answer to this question doesn't directly affect the
+  kernel: saying N will just cause the configurator to skip all
+  the questions about this class of network devices. If you say Y, you
+  will be asked for your specific device in the following questions.
+
+AT-LAN-TEC/RealTek pocket adapter support
+CONFIG_ATP
+  This is a network (Ethernet) device which attaches to your parallel
+  port. Read <file:drivers/net/atp.c> as well as the Ethernet-HOWTO,
+  available from <http://www.tldp.org/docs.html#howto>, if you
+  want to use this.  If you intend to use this driver, you should have
+  said N to the "Parallel printer support", because the two drivers
+  don't like each other.
+
+  If you want to compile this driver as a module however ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want), say M here and read
+  <file:Documentation/modules.txt>.  The module will be called atp.o.
+
+D-Link DE600 pocket adapter support
+CONFIG_DE600
+  This is a network (Ethernet) device which attaches to your parallel
+  port. Read <file:Documentation/networking/DLINK.txt> as well as the
+  Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>, if you want to use
+  this. It is possible to have several devices share a single parallel
+  port and it is safe to compile the corresponding drivers into the
+  kernel.
+
+  If you want to compile this driver as a module however ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want), say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called de600.o.
+
+D-Link DE620 pocket adapter support
+CONFIG_DE620
+  This is a network (Ethernet) device which attaches to your parallel
+  port. Read <file:Documentation/networking/DLINK.txt> as well as the
+  Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>, if you want to use
+  this. It is possible to have several devices share a single parallel
+  port and it is safe to compile the corresponding drivers into the
+  kernel.
+
+  If you want to compile this driver as a module however ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want), say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called de620.o.
+
+Token Ring driver support
+CONFIG_TR
+  Token Ring is IBM's way of communication on a local network; the
+  rest of the world uses Ethernet. To participate on a Token Ring
+  network, you need a special Token ring network card. If you are
+  connected to such a Token Ring network and want to use your Token
+  Ring card under Linux, say Y here and to the driver for your
+  particular card below and read the Token-Ring mini-HOWTO, available
+  from <http://www.tldp.org/docs.html#howto>. Most people can
+  say N here.
+
+IBM Tropic chipset based adapter support
+CONFIG_IBMTR
+  This is support for all IBM Token Ring cards that don't use DMA. If
+  you have such a beast, say Y and read the Token-Ring mini-HOWTO,
+  available from <http://www.tldp.org/docs.html#howto>.
+
+  Warning: this driver will almost definitely fail if more than one
+  active Token Ring card is present.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ibmtr.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+IBM Olympic chipset PCI adapter support
+CONFIG_IBMOL
+  This is support for all non-Lanstreamer IBM PCI Token Ring Cards.
+  Specifically this is all IBM PCI, PCI Wake On Lan, PCI II, PCI II
+  Wake On Lan, and PCI 100/16/4 adapters.
+
+  If you have such an adapter, say Y and read the Token-Ring
+  mini-HOWTO, available from <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called olympic.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+  Also read <file:Documentation/networking/olympic.txt> or check the
+  Linux Token Ring Project site for the latest information at
+  <http://www.linuxtr.net/>.
+
+IBM Lanstreamer chipset PCI adapter support
+CONFIG_IBMLS
+  This is support for IBM Lanstreamer PCI Token Ring Cards.
+
+  If you have such an adapter, say Y and read the Token-Ring
+  mini-HOWTO, available from <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a modules ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The modules will be called lanstreamer.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+Generic TMS380 Token Ring ISA/PCI/MCA/EISA adapter support
+CONFIG_TMS380TR
+  This driver provides generic support for token ring adapters
+  based on the Texas Instruments TMS380 series chipsets.  This
+  includes the SysKonnect TR4/16(+) ISA (SK-4190), SysKonnect
+  TR4/16(+) PCI (SK-4590), SysKonnect TR4/16 PCI (SK-4591),
+  Compaq 4/16 PCI, Thomas-Conrad TC4048 4/16 PCI, and several
+  Madge adapters.  If you say Y here, you will be asked to select
+  which cards to support below.  If you're using modules, each
+  class of card will be supported by a separate module.
+
+  If you have such an adapter and would like to use it, say Y and
+  read the Token-Ring mini-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  Also read the file <file:Documentation/networking/tms380tr.txt> or
+  check <http://www.auk.cx/tms380tr/>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called tms380tr.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+Generic TMS380 PCI support
+CONFIG_TMSPCI
+  This tms380 module supports generic TMS380-based PCI cards.
+
+  These cards are known to work:
+     - Compaq 4/16 TR PCI
+     - SysKonnect TR4/16 PCI (SK-4590/SK-4591)
+     - Thomas-Conrad TC4048 PCI 4/16
+     - 3Com Token Link Velocity
+
+  This driver is available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called tmspci.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+Generic TMS380 ISA support
+CONFIG_TMSISA
+  This tms380 module supports generic TMS380-based ISA cards.
+
+  These cards are known to work:
+     - SysKonnect TR4/16 ISA (SK-4190)
+
+  This driver is available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called tmsisa.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+Madge Smart 16/4 PCI Mk2 support
+CONFIG_ABYSS
+  This tms380 module supports the Madge Smart 16/4 PCI Mk2
+  cards (51-02).
+
+  This driver is available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called abyss.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+Madge Smart 16/4 Ringnode MicroChannel
+CONFIG_MADGEMC
+  This tms380 module supports the Madge Smart 16/4 MC16 and MC32
+  MicroChannel adapters.
+
+  This driver is available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called madgemc.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+SMC ISA/MCA Token Ring adapter support
+CONFIG_SMCTR
+  This is support for the ISA and MCA SMC Token Ring cards,
+  specifically SMC TokenCard Elite (8115T) and SMC TokenCard Elite/A
+  (8115T/A) adapters.
+
+  If you have such an adapter and would like to use it, say Y or M and
+  read the Token-Ring mini-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto> and the file
+  <file:Documentation/networking/smctr.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called smctr.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+3COM 3C359 Token Link Velocity XL PCI adapter support
+CONFIG_3C359
+  This is support for the 3Com PCI Velocity XL cards, specifically
+  the 3Com 3C359, please note this is not for the 3C339 cards, you
+  should use the tms380 driver instead.
+
+  If you have such an adapter, say Y and read the Token-Ring
+  mini-HOWTO, available from <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will will be called 3c359.o. If you want to compile it
+  as a module, say M here and read Documentation/modules.txt.
+
+  Also read the file <file:Documentation/networking/3c359.txt> or check the 
+  Linux Token Ring Project site for the latest information at
+  <http://www.linuxtr.net>
+
+Sun Happy Meal 10/100baseT support
+CONFIG_HAPPYMEAL
+  This driver supports the "hme" interface present on most Ultra
+  systems and as an option on older Sbus systems. This driver supports
+  both PCI and Sbus devices. This driver also supports the "qfe" quad
+  100baseT device available in both PCI and Sbus configurations.
+
+  This support is also available as a module called sunhme.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Sun Lance support
+CONFIG_SUNLANCE
+  This driver supports the "le" interface present on all 32-bit Sparc
+  systems, on some older Ultra systems and as an Sbus option.  These
+  cards are based on the AMD Lance chipset, which is better known
+  via the NE2100 cards.
+
+  This support is also available as a module called sunlance.o ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Sun BigMAC 10/100baseT support
+CONFIG_SUNBMAC
+  This driver supports the "be" interface available as an Sbus option.
+  This is Sun's older 100baseT Ethernet device.
+
+  This support is also available as a module called sunbmac.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Sun QuadEthernet support
+CONFIG_SUNQE
+  This driver supports the "qe" 10baseT Ethernet device, available as
+  an Sbus option. Note that this is not the same as Quad FastEthernet
+  "qfe" which is supported by the Happy Meal driver instead.
+
+  This support is also available as a module called sunqe.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Traffic Shaper
+CONFIG_SHAPER
+  The traffic shaper is a virtual network device that allows you to
+  limit the rate of outgoing data flow over some other network device.
+  The traffic that you want to slow down can then be routed through
+  these virtual devices. See
+  <file:Documentation/networking/shaper.txt> for more information.
+
+  An alternative to this traffic shaper is the experimental
+  Class-Based Queueing (CBQ) scheduling support which you get if you
+  say Y to "QoS and/or fair queueing" above.
+
+  To set up and configure shaper devices, you need the shapecfg
+  program, available from <ftp://shadow.cabi.net/pub/Linux/> in the
+  shaper package.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called shaper.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.  If
+  unsure, say N.
+
+FDDI driver support
+CONFIG_FDDI
+  Fiber Distributed Data Interface is a high speed local area network
+  design; essentially a replacement for high speed Ethernet. FDDI can
+  run over copper or fiber. If you are connected to such a network and
+  want a driver for the FDDI card in your computer, say Y here (and
+  then also Y to the driver for your FDDI card, below). Most people
+  will say N.
+
+Digital DEFEA and DEFPA adapter support
+CONFIG_DEFXX
+  This is support for the DIGITAL series of EISA (DEFEA) and PCI
+  (DEFPA) controllers which can connect you to a local FDDI network.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called defxx.o.
+
+SysKonnect FDDI PCI support
+CONFIG_SKFP
+  Say Y here if you have a SysKonnect FDDI PCI adapter.
+  The following adapters are supported by this driver:
+  - SK-5521 (SK-NET FDDI-UP)
+  - SK-5522 (SK-NET FDDI-UP DAS)
+  - SK-5541 (SK-NET FDDI-FP)
+  - SK-5543 (SK-NET FDDI-LP)
+  - SK-5544 (SK-NET FDDI-LP DAS)
+  - SK-5821 (SK-NET FDDI-UP64)
+  - SK-5822 (SK-NET FDDI-UP64 DAS)
+  - SK-5841 (SK-NET FDDI-FP64)
+  - SK-5843 (SK-NET FDDI-LP64)
+  - SK-5844 (SK-NET FDDI-LP64 DAS)
+  - Netelligent 100 FDDI DAS Fibre SC
+  - Netelligent 100 FDDI SAS Fibre SC
+  - Netelligent 100 FDDI DAS UTP
+  - Netelligent 100 FDDI SAS UTP
+  - Netelligent 100 FDDI SAS Fibre MIC
+
+  Read <file:Documentation/networking/skfp.txt> for information about
+  the driver.
+
+  Questions concerning this driver can be addressed to:
+    linux@syskonnect.de
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  This is
+  recommended.  The module will be called skfp.o.
+
+HIgh Performance Parallel Interface (HIPPI) support
+CONFIG_HIPPI
+  HIgh Performance Parallel Interface (HIPPI) is a 800Mbit/sec and
+  1600Mbit/sec dual-simplex switched or point-to-point network. HIPPI
+  can run over copper (25m) or fiber (300m on multi-mode or 10km on
+  single-mode). HIPPI networks are commonly used for clusters and to
+  connect to super computers. If you are connected to a HIPPI network
+  and have a HIPPI network card in your computer that you want to use
+  under Linux, say Y here (you must also remember to enable the driver
+  for your HIPPI card below). Most people will say N here.
+
+Essential RoadRunner HIPPI PCI adapter support
+CONFIG_ROADRUNNER
+  Say Y here if this is your PCI HIPPI network card.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called rrunner.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.  If
+  unsure, say N.
+
+Use large TX/RX rings
+CONFIG_ROADRUNNER_LARGE_RINGS
+  If you say Y here, the RoadRunner driver will preallocate up to 2 MB
+  of additional memory to allow for fastest operation, both for
+  transmitting and receiving. This memory cannot be used by any other
+  kernel code or by user space programs. Say Y here only if you have
+  the memory.
+
+Acorn Ether1 support
+CONFIG_ARM_ETHER1
+  If you have an Acorn system with one of these (AKA25) network cards,
+  you should say Y to this option if you wish to use it with Linux.
+
+Acorn/ANT Ether3 support
+CONFIG_ARM_ETHER3
+  If you have an Acorn system with one of these network cards, you
+  should say Y to this option if you wish to use it with Linux.
+
+I-Cubed EtherH support
+CONFIG_ARM_ETHERH
+  If you have an Acorn system with one of these network cards, you
+  should say Y to this option if you wish to use it with Linux.
+
+EBSA-110 Ethernet interface (AM79C961A)
+CONFIG_ARM_AM79C961A
+  If you wish to compile a kernel for the EBSA-110, then you should
+  always answer Y to this.
+
+Support Thumb instructions
+CONFIG_ARM_THUMB
+  Say Y if you want to have kernel support for ARM Thumb instructions,
+  fault handlers, and system calls.
+
+  The Thumb instruction set is a compressed form of the standard ARM
+  instruction set resulting in smaller binaries at the expense of
+  slightly less efficient code.
+
+  If you don't know what this all is, saying Y is a safe choice.
+
+Support CD-ROM drives that are not SCSI or IDE/ATAPI
+CONFIG_CD_NO_IDESCSI
+  If you have a CD-ROM drive that is neither SCSI nor IDE/ATAPI, say Y
+  here, otherwise N. Read the CD-ROM-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  Note that the answer to this question doesn't directly affect the
+  kernel: saying N will just cause the configurator to skip all
+  the questions about these CD-ROM drives. If you are unsure what you
+  have, say Y and find out whether you have one of the following
+  drives.
+
+  For each of these drivers, a file Documentation/cdrom/{driver_name}
+  exists. Especially in cases where you do not know exactly which kind
+  of drive you have you should read there. Most of these drivers use a
+  file drivers/cdrom/{driver_name}.h where you can define your
+  interface parameters and switch some internal goodies.
+
+  All these CD-ROM drivers are also usable as a module ( = code which
+  can be inserted in and removed from the running kernel whenever you
+  want). If you want to compile them as module, say M instead of Y and
+  read <file:Documentation/modules.txt>.
+
+  If you want to use any of these CD-ROM drivers, you also have to
+  answer Y or M to "ISO 9660 CD-ROM file system support" below (this
+  answer will get "defaulted" for you if you enable any of the Linux
+  CD-ROM drivers).
+
+Sony CDU31A/CDU33A CD-ROM support
+CONFIG_CDU31A
+  These CD-ROM drives have a spring-pop-out caddyless drawer, and a
+  rectangular green LED centered beneath it.  NOTE: these CD-ROM
+  drives will not be auto detected by the kernel at boot time; you
+  have to provide the interface address as an option to the kernel at
+  boot time as described in <file:Documentation/cdrom/cdu31a> or fill
+  in your parameters into <file:drivers/cdrom/cdu31a.c>.  Try "man
+  bootparam" or see the documentation of your boot loader (lilo or
+  loadlin) about how to pass options to the kernel.
+
+  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
+  file system support" below, because that's the file system used on
+  CD-ROMs.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called cdu31a.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Standard Mitsumi [no XA/Multisession] CD-ROM support
+CONFIG_MCD
+  This is the older of the two drivers for the older Mitsumi models
+  LU-005, FX-001 and FX-001D. This is not the right driver for the
+  FX-001DE and the triple or quad speed models (all these are
+  IDE/ATAPI models). Please also the file
+  <file:Documentation/cdrom/mcd>.
+
+  With the old LU-005 model, the whole drive chassis slides out for cd
+  insertion. The FX-xxx models use a motorized tray type mechanism.
+  Note that this driver does not support XA or MultiSession CDs
+  (PhotoCDs). There is a new driver (next question) which can do
+  this. If you want that one, say N here.
+
+  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
+  file system support" below, because that's the file system used on
+  CD-ROMs.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called mcd.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+IRQ channel for Mitsumi CD-ROM
+CONFIG_MCD_IRQ
+  This allows you to specify the default value of the IRQ used by the
+  driver. This setting can be overridden by passing the "mcd="
+  parameter to the kernel at boot time (or at module load time if you
+  said M to "Standard Mitsumi CD-ROM support").
+
+I/O base address for Mitsumi CD-ROM
+CONFIG_MCD_BASE
+  This allows you to specify the default value of the I/O base address
+  used by the driver. This setting can be overridden by passing the
+  "mcd=" parameter to the kernel at boot time (or at module load time
+  if you said M to "Standard Mitsumi CD-ROM support").
+
+Mitsumi [XA/MultiSession] CD-ROM support
+CONFIG_MCDX
+  Use this driver if you want to be able to read XA or MultiSession
+  CDs (PhotoCDs) as well as ordinary CDs with your Mitsumi LU-005,
+  FX-001 or FX-001D CD-ROM drive. In addition, this driver uses much
+  less kernel memory than the old one, if that is a concern. This
+  driver is able to support more than one drive, but each drive needs
+  a separate interface card. Please read the file
+  <file:Documentation/cdrom/mcdx>.
+
+  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
+  file system support" below, because that's the file system used on
+  CD-ROMs.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called mcdx.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Matsushita/Panasonic/Creative, Longshine, TEAC CD-ROM support
+CONFIG_SBPCD
+  This driver supports most of the drives which use the Panasonic or
+  Sound Blaster interface.  Please read the file
+  <file:Documentation/cdrom/sbpcd>.
+
+  The Matsushita CR-521, CR-522, CR-523, CR-562, CR-563 drives
+  (sometimes labeled "Creative"), the Creative Labs CD200, the
+  Longshine LCS-7260, the "IBM External ISA CD-ROM" (in fact a CR-56x
+  model), the TEAC CD-55A fall under this category.  Some other
+  "electrically compatible" drives (Vertos, Genoa, some Funai models)
+  are currently not supported; for the Sanyo H94A drive currently a
+  separate driver (asked later) is responsible.  Most drives have a
+  uniquely shaped faceplate, with a caddyless motorized drawer, but
+  without external brand markings.  The older CR-52x drives have a
+  caddy and manual loading/eject, but still no external markings.  The
+  driver is able to do an extended auto-probing for interface
+  addresses and drive types; this can help to find facts in cases you
+  are not sure, but can consume some time during the boot process if
+  none of the supported drives gets found.  Once your drive got found,
+  you should enter the reported parameters into
+  <file:drivers/cdrom/sbpcd.h> and set "DISTRIBUTION 0" there.
+
+  This driver can support up to four CD-ROM controller cards, and each
+  card can support up to four CD-ROM drives; if you say Y here, you
+  will be asked how many controller cards you have.  If compiled as a
+  module, only one controller card (but with up to four drives) is
+  usable.
+
+  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
+  file system support" below, because that's the file system used on
+  CD-ROMs.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called sbpcd.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Matsushita/Panasonic, ... second CD-ROM controller support
+CONFIG_SBPCD2
+  Say Y here only if you have two CD-ROM controller cards of this type
+  (usually only if you have more than four drives).  You should enter
+  the parameters for the second, third and fourth interface card into
+  <file:drivers/cdrom/sbpcd.h> before compiling the new kernel.  Read
+  the file <file:Documentation/cdrom/sbpcd>.
+
+Matsushita/Panasonic, ... third CD-ROM controller support
+CONFIG_SBPCD3
+  Say Y here only if you have three CD-ROM controller cards of this
+  type (usually only if you have more than six drives).  You should
+  enter the parameters for the second, third and fourth interface card
+  into <file:include/linux/sbpcd.h> before compiling the new kernel.
+  Read the file <file:Documentation/cdrom/sbpcd>.
+
+Matsushita/Panasonic, ... fourth CD-ROM controller support
+CONFIG_SBPCD4
+  Say Y here only if you have four CD-ROM controller cards of this
+  type (usually only if you have more than eight drives).  You should
+  enter the parameters for the second, third and fourth interface card
+  into <file:include/linux/sbpcd.h> before compiling the new kernel.
+  Read the file <file:Documentation/cdrom/sbpcd>.
+
+Aztech/Orchid/Okano/Wearnes/TXC/CyDROM CD-ROM support
+CONFIG_AZTCD
+  This is your driver if you have an Aztech CDA268-01A, Orchid
+  CD-3110, Okano or Wearnes CDD110, Conrad TXC, or CyCD-ROM CR520 or
+  CR540 CD-ROM drive.  This driver -- just like all these CD-ROM
+  drivers -- is NOT for CD-ROM drives with IDE/ATAPI interfaces, such
+  as Aztech CDA269-031SE. Please read the file
+  <file:Documentation/cdrom/aztcd>.
+
+  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
+  file system support" below, because that's the file system used on
+  CD-ROMs.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called aztcd.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Sony CDU535 CD-ROM support
+CONFIG_CDU535
+  This is the driver for the older Sony CDU-535 and CDU-531 CD-ROM
+  drives. Please read the file <file:Documentation/cdrom/sonycd535>.
+
+  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
+  file system support" below, because that's the file system used on
+  CD-ROMs.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called sonycd535.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+Goldstar R420 CD-ROM support
+CONFIG_GSCD
+  If this is your CD-ROM drive, say Y here.  As described in the file
+  <file:Documentation/cdrom/gscd>, you might have to change a setting
+  in the file <file:drivers/cdrom/gscd.h> before compiling the
+  kernel.  Please read the file <file:Documentation/cdrom/gscd>.
+
+  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
+  file system support" below, because that's the file system used on
+  CD-ROMs.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called gscd.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Philips/LMS CM206 CD-ROM support
+CONFIG_CM206
+  If you have a Philips/LMS CD-ROM drive cm206 in combination with a
+  cm260 host adapter card, say Y here. Please also read the file
+  <file:Documentation/cdrom/cm206>.
+
+  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
+  file system support" below, because that's the file system used on
+  CD-ROMs.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called cm206.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Optics Storage DOLPHIN 8000AT CD-ROM support
+CONFIG_OPTCD
+  This is the driver for the 'DOLPHIN' drive with a 34-pin Sony
+  compatible interface. It also works with the Lasermate CR328A. If
+  you have one of those, say Y. This driver does not work for the
+  Optics Storage 8001 drive; use the IDE-ATAPI CD-ROM driver for that
+  one. Please read the file <file:Documentation/cdrom/optcd>.
+
+  If you say Y here, you should also say Y or M to "ISO 9660 CD-ROM
+  file system support" below, because that's the file system used on
+  CD-ROMs.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called optcd.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Sanyo CDR-H94A CD-ROM support
+CONFIG_SJCD
+  If this is your CD-ROM drive, say Y here and read the file
+  <file:Documentation/cdrom/sjcd>. You should then also say Y or M to
+  "ISO 9660 CD-ROM file system support" below, because that's the
+  file system used on CD-ROMs.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called sjcd.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+ISP16/MAD16/Mozart soft configurable cdrom interface support
+CONFIG_ISP16_CDI
+  These are sound cards with built-in cdrom interfaces using the OPTi
+  82C928 or 82C929 chips. Say Y here to have them detected and
+  possibly configured at boot time. In addition, You'll have to say Y
+  to a driver for the particular cdrom drive you have attached to the
+  card. Read <file:Documentation/cdrom/isp16> for details.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called isp16.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+iSeries Virtual I/O CD Support
+CONFIG_VIOCD
+  If you are running Linux on an IBM iSeries system and you want to
+  read a CD drive owned by OS/400, say Y here.
+
+Quota support
+CONFIG_QUOTA
+  If you say Y here, you will be able to set per user limits for disk
+  usage (also called disk quotas). Currently, it works only for the
+  ext2 file system. You need additional software in order to use quota
+  support (you can download sources from
+  <http://www.sf.net/projects/linuxquota/>). For further details, read
+  the Quota mini-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>. Probably the quota
+  support is only useful for multi user systems. If unsure, say N.
+
+VFS v0 quota format support
+CONFIG_QFMT_V2
+  This quota format allows using quotas with 32-bit UIDs/GIDs. If you
+  need this functionality say Y here. Note that you will need latest
+  quota utilities for new quota format with this kernel.
+
+Memory Technology Device (MTD) support
+CONFIG_MTD
+  Memory Technology Devices are flash, RAM and similar chips, often
+  used for solid state file systems on embedded devices. This option
+  will provide the generic support for MTD drivers to register
+  themselves with the kernel and for potential users of MTD devices
+  to enumerate the devices which are present and obtain a handle on
+  them. It will also allow you to select individual drivers for 
+  particular hardware and users of MTD devices. If unsure, say N.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  mtdcore.o
+
+MTD debugging support
+CONFIG_MTD_DEBUG
+  This turns on low-level debugging for the entire MTD sub-system.
+  Normally, you should say 'N'.
+
+MTD partitioning support
+CONFIG_MTD_PARTITIONS
+  If you have a device which needs to divide its flash chip(s) up
+  into multiple 'partitions', each of which appears to the user as
+  a separate MTD device, you require this option to be enabled. If
+  unsure, say 'Y'.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  mtdpart.o
+
+  Note, however, that you don't need this option for the DiskOnChip
+  devices. Partitioning on NFTL 'devices' is a different - that's the
+  'normal' form of partitioning used on a block device.
+
+RedBoot partition table parsing
+CONFIG_MTD_REDBOOT_PARTS
+  RedBoot is a ROM monitor and bootloader which deals with multiple
+  'images' in flash devices by putting a table in the last erase block
+  of the device, similar to a partition table, which gives the
+  offsets, lengths and names of all the images stored in the flash.
+
+  If you need code which can detect and parse this table, and register
+  MTD 'partitions' corresponding to each image in the table, enable
+  this option.
+
+  You will still need the parsing functions to be called by the driver
+  for your particular device. It won't happen automatically. The
+  SA1100 map driver (CONFIG_MTD_SA1100) has an option for this, for
+  example.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  redboot.o
+
+CONFIG_MTD_CMDLINE_PARTS
+  Allow generic configuration of the MTD paritition tables via the kernel
+  command line. Multiple flash resources are supported for hardware where
+  different kinds of flash memory are available. 
+
+  You will still need the parsing functions to be called by the driver
+  for your particular device. It won't happen automatically. The 
+  SA1100 map driver (CONFIG_MTD_SA1100) has an option for this, for 
+  example.
+
+  The format for the command line is as follows:
+
+  mtdparts=<mtddef>[;<mtddef]
+  <mtddef>  := <mtd-id>:<partdef>[,<partdef>]
+  <partdef> := <size>[@offset][<name>][ro]
+  <mtd-id>  := unique id used in mapping driver/device
+  <size>    := standard linux memsize OR "-" to denote all 
+  remaining space
+  <name>    := (NAME)
+
+  Due to the way Linux handles the command line, no spaces are 
+  allowed in the partition definition, including mtd id's and partition 
+  names.
+
+  Examples:
+
+  1 flash resource (mtd-id "sa1100"), with 1 single writable partition:
+  mtdparts=sa1100:-
+
+  Same flash, but 2 named partitions, the first one being read-only:
+  mtdparts=sa1100:256k(ARMboot)ro,-(root)
+
+  If unsure, say 'N'.
+
+ARM Firmware Suite flash layout / partition parsing
+CONFIG_MTD_AFS_PARTS
+  The ARM Firmware Suite allows the user to divide flash devices into
+  multiple 'images'. Each such image has a header containing its name
+  and offset/size etc.
+
+  If you need code which can detect and parse these tables, and
+  register MTD 'partitions' corresponding to each image detected,
+  enable this option.
+
+  You will still need the parsing functions to be called by the driver
+  for your particular device.  It won't happen automatically.  The 
+  'armflash' map driver (CONFIG_MTD_ARMFLASH) does this, for example.
+
+MTD debugging verbosity (0 = quiet, 3 = noisy)
+CONFIG_MTD_DEBUG_VERBOSE
+  Determines the verbosity level of the MTD debugging messages.
+
+Direct chardevice access to MTD devices
+CONFIG_MTD_CHAR
+  This provides a character device for each MTD device present in
+  the system, allowing the user to read and write directly to the
+  memory chips, and also use ioctl() to obtain information about
+  the device, or to erase parts of it.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  mtdchar.o
+
+Caching block device access to MTD devices
+CONFIG_MTD_BLOCK
+  Although most flash chips have an erase size too large to be useful
+  as block devices, it is possible to use MTD devices which are based
+  on RAM chips in this manner. This block device is a user of MTD
+  devices performing that function.
+
+  At the moment, it is also required for the Journalling Flash File
+  System(s) to obtain a handle on the MTD device when it's mounted
+  (although JFFS and JFFS2 don't actually use any of the functionality
+  of the mtdblock device).
+
+  Later, it may be extended to perform read/erase/modify/write cycles
+  on flash chips to emulate a smaller block size. Needless to say,
+  this is very unsafe, but could be useful for file systems which are
+  almost never written to.
+
+  You do not need this option for use with the DiskOnChip devices. For
+  those, enable NFTL support (CONFIG_NFTL) instead.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  mtdblock.o
+
+Readonly block device access to MTD devices
+CONFIG_MTD_BLOCK_RO
+  This allows you to mount read-only file systems (such as cramfs)
+  from an MTD device, without the overhead (and danger) of the caching
+  driver.
+
+  You do not need this option for use with the DiskOnChip devices. For
+  those, enable NFTL support (CONFIG_NFTL) instead.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  mtdblock_ro.o
+
+FTL (Flash Translation Layer) support
+CONFIG_FTL
+  This provides support for the original Flash Translation Layer which
+  is part of the PCMCIA specification. It uses a kind of pseudo-
+  file system on a flash device to emulate a block device with
+  512-byte sectors, on top of which you put a 'normal' file system.
+
+  You may find that the algorithms used in this code are patented
+  unless you live in the Free World where software patents aren't
+  legal - in the USA you are only permitted to use this on PCMCIA
+  hardware, although under the terms of the GPL you're obviously
+  permitted to copy, modify and distribute the code as you wish. Just
+  not use it.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  ftl.o
+
+NFTL (NAND Flash Translation Layer) support
+CONFIG_NFTL
+  This provides support for the NAND Flash Translation Layer which is
+  used on M-Systems' DiskOnChip devices. It uses a kind of pseudo-
+  file system on a flash device to emulate a block device with
+  512-byte sectors, on top of which you put a 'normal' file system.
+
+  You may find that the algorithms used in this code are patented
+  unless you live in the Free World where software patents aren't
+  legal - in the USA you are only permitted to use this on DiskOnChip
+  hardware, although under the terms of the GPL you're obviously
+  permitted to copy, modify and distribute the code as you wish. Just
+  not use it.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  nftl.o
+
+Write support for NFTL (EXPERIMENTAL)
+CONFIG_NFTL_RW
+  If you're lucky, this will actually work. Don't whinge if it
+  doesn't.  Send mail to the MTD mailing list
+  <linux-mtd@lists.infradead.org> if you want to help to make it more
+  reliable.
+
+Detect flash chips by Common Flash Interface (CFI) probe
+CONFIG_MTD_CFI
+  The Common Flash Interface specification was developed by Intel,
+  AMD and other flash manufactures that provides a universal method
+  for probing the capabilities of flash devices. If you wish to
+  support any device that is CFI-compliant, you need to enable this
+  option. Visit <http://www.amd.com/products/nvd/overview/cfi.html>
+  for more information on CFI.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  cfi_probe.o
+
+CFI Advanced configuration options
+CONFIG_MTD_CFI_ADV_OPTIONS
+  If you need to specify a specific endianness for access to flash
+  chips, or if you wish to reduce the size of the kernel by including
+  support for only specific arrangements of flash chips, say 'Y'. This
+  option does not directly affect the code, but will enable other 
+  configuration options which allow you to do so.
+
+  If unsure, say 'N'.
+
+Specific CFI Flash geometry selection
+CONFIG_MTD_CFI_GEOMETRY
+  This option does not affect the code directly, but will enable 
+  some other configuration options which would allow you to reduce
+  the size of the kernel by including support for only certain 
+  arrangements of CFI chips. If unsure, say 'N' and all options 
+  which are supported by the current code will be enabled.
+
+Support 8-bit buswidth
+CONFIG_MTD_CFI_B1
+  If you wish to support CFI devices on a physical bus which is
+  8 bits wide, say 'Y'.
+
+Support 16-bit buswidth
+CONFIG_MTD_CFI_B2
+  If you wish to support CFI devices on a physical bus which is
+  16 bits wide, say 'Y'.
+
+Support 32-bit buswidth
+CONFIG_MTD_CFI_B4
+  If you wish to support CFI devices on a physical bus which is
+  32 bits wide, say 'Y'.
+
+CONFIG_MTD_CFI_B8
+  If you wish to support CFI devices on a physical bus which is
+  64 bits wide, say 'Y'.
+
+Support 1-chip flash interleave
+CONFIG_MTD_CFI_I1
+  If your flash chips are not interleaved - i.e. you only have one
+  flash chip addressed by each bus cycle, then say 'Y'.
+
+Support 2-chip flash interleave
+CONFIG_MTD_CFI_I2
+  If your flash chips are interleaved in pairs - i.e. you have two
+  flash chips addressed by each bus cycle, then say 'Y'.
+
+Support 4-chip flash interleave
+CONFIG_MTD_CFI_I4
+  If your flash chips are interleaved in fours - i.e. you have four
+  flash chips addressed by each bus cycle, then say 'Y'.
+
+CONFIG_MTD_CFI_I8
+  If your flash chips are interleaved in eights - i.e. you have eight
+  flash chips addressed by each bus cycle, then say 'Y'.
+
+# Choice: mtd_data_swap
+Flash cmd/query data swapping
+CONFIG_MTD_CFI_NOSWAP
+  This option defines the way in which the CPU attempts to arrange
+  data bits when writing the 'magic' commands to the chips. Saying
+  'NO', which is the default when CONFIG_MTD_CFI_ADV_OPTIONS isn't
+  enabled, means that the CPU will not do any swapping; the chips
+  are expected to be wired to the CPU in 'host-endian' form. 
+  Specific arrangements are possible with the BIG_ENDIAN_BYTE and
+  LITTLE_ENDIAN_BYTE, if the bytes are reversed.
+
+  If you have a LART, on which the data (and address) lines were
+  connected in a fashion which ensured that the nets were as short
+  as possible, resulting in a bit-shuffling which seems utterly
+  random to the untrained eye, you need the LART_ENDIAN_BYTE option.
+
+  Yes, there really exists something sicker than PDP-endian :)
+
+CFI support for Intel/Sharp Extended Command Set chips
+CONFIG_MTD_CFI_INTELEXT
+  The Common Flash Interface defines a number of different command
+  sets which a CFI-compliant chip may claim to implement. This code
+  provides support for one of those command sets, used on Intel
+  StrataFlash and other parts.
+
+CFI support for AMD/Fujitsu Standard Command Set chips
+CONFIG_MTD_CFI_AMDSTD
+  The Common Flash Interface defines a number of different command
+  sets which a CFI-compliant chip may claim to implement. This code
+  provides support for one of those command sets, used on chips 
+  chips including the AMD Am29LV320.
+
+CFI support for Intel/Sharp Standard Commands
+CONFIG_MTD_CFI_INTELSTD
+  The Common Flash Interface defines a number of different command
+  sets which a CFI-compliant chip may claim to implement. This code
+  provides support for one of those command sets.
+
+pre-CFI Sharp chip support
+CONFIG_MTD_SHARP
+  This option enables support for flash chips using Sharp-compatible
+  commands, including some which are not CFI-compatible and hence 
+  cannot be used with the CONFIG_MTD_CFI_INTELxxx options.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  sharp.o
+
+AMD compatible flash chip support (non-CFI)
+CONFIG_MTD_AMDSTD
+  This option enables support for flash chips using AMD-compatible
+  commands, including some which are not CFI-compatible and hence 
+  cannot be used with the CONFIG_MTD_CFI_AMDSTD option.
+
+  It also works on AMD compatible chips that do conform to CFI.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  amd_flash.o
+
+CONFIG_MTD_CFI_STAA
+  The Common Flash Interface defines a number of different command
+  sets which a CFI-compliant chip may claim to implement. This code
+  provides support for one of those command sets.
+
+Support for RAM chips in bus mapping
+CONFIG_MTD_RAM
+  This option enables basic support for RAM chips accessed through 
+  a bus mapping driver.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  map_ram.o
+
+Support for ROM chips in bus mapping
+CONFIG_MTD_ROM
+  This option enables basic support for ROM chips accessed through 
+  a bus mapping driver.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  map_rom.o
+
+JEDEC device support
+CONFIG_MTD_JEDEC
+  Enable older older JEDEC flash interface devices for self
+  programming flash.  It is commonly used in older AMD chips.  It is
+  only called JEDEC because the JEDEC association
+  <http://www.jedec.org/> distributes the identification codes for the
+  chips. WARNING!!!! This code does not compile and is incomplete as
+  are the specific JEDEC devices drivers.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  jedec.o
+
+CFI Flash device mapped on StrongARM SA11x0
+CONFIG_MTD_SA1100
+  This enables access to the flash chips on most platforms based on
+  the SA1100 and SA1110, including the Assabet and the Compaq iPAQ.
+  If you have such a board, say 'Y'.
+
+Support for Compaq bootldr partition tables on SA11x0
+CONFIG_MTD_SA1100_REDBOOT_PARTITIONS
+  Enabling this option will cause the kernel to look for a RedBoot 
+  FIS (Flash Image System) table in the last erase block of the flash
+  chips detected. If you are using RedBoot on your SA11x0-based board
+  and want Linux to present 'partitions' matching the images which
+  RedBoot has listed, say 'Y'.
+
+Support for Compaq bootldr partition tables on SA11x0
+CONFIG_MTD_SA1100_BOOTLDR_PARTITIONS
+  Enabling this option will cause the kernel to look for a Compaq
+  bootldr partition table on the flash chips detected.  If you are
+  using the Compaq bootldr on your SA11x0-based board and want Linux 
+  to present 'partitions' matching the images which the bootldr has
+  listed, say 'Y'.
+
+Flash chip mapping in physical memory
+CONFIG_MTD_PHYSMAP
+  This provides a 'mapping' driver which allows the CFI probe and
+  command set driver code to communicate with flash chips which
+  are mapped physically into the CPU's memory. You will need to
+  configure the physical address and size of the flash chips on
+  your particular board as well as the bus width.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  physmap.o
+
+Physical start location of flash chip mapping
+CONFIG_MTD_PHYSMAP_START
+  This is the physical memory location at which the flash chips
+  are mapped on your particular target board. Refer to the
+  memory map which should hopefully be in the documentation for
+  your board.
+
+Physical length of flash chip mapping
+CONFIG_MTD_PHYSMAP_LEN
+  This is the total length of the mapping of the flash chips on
+  your particular board. If there is space, or aliases, in the
+  physical memory map between the chips, this could be larger
+  than the total amount of flash present. Refer to the memory
+  map which should hopefully be in the documentation for your
+  board.
+
+Buswidth of flash in bytes
+CONFIG_MTD_PHYSMAP_BUSWIDTH
+  This is the total width of the data bus of the flash devices
+  in octets. For example, if you have a data bus width of 32
+  bits, you would set the bus width octet value to 4. This is
+  used internally by the CFI drivers.
+
+Flash chip mapping on Sun Microsystems boardsets
+CONFIG_MTD_SUN_UFLASH
+  This provides a 'mapping' driver which supports the way in 
+  which user-programmable flash chips are connected on various 
+  Sun Microsystems boardsets.  This driver will require CFI support 
+  in the kernel, so if you did not enable CFI previously, do that now.
+
+Flash chip mapping on Nora
+CONFIG_MTD_NORA
+  If you had to ask, you don't have one. Say 'N'.
+
+Flash chip mapping on Photron PNC-2000
+CONFIG_MTD_PNC2000
+  PNC-2000 is the name of Network Camera product from PHOTRON
+  Ltd. in Japan. It uses CFI-compliant flash.
+
+Flash chip mapping on RPXlite or CLLF PPC board
+CONFIG_MTD_RPXLITE
+  The RPXLite PowerPC board has CFI-compliant chips mapped in
+  a strange sparse mapping. This 'mapping' driver supports that
+  arrangement, allowing the CFI probe and command set driver code
+  to communicate with the chips on the RPXLite board. More at
+  <http://www.embeddedplanet.com/rpx_lite_specification_sheet.htm>.
+
+Flash chip mapping on AMD SC520 CDP board
+CONFIG_MTD_SC520CDP
+  The SC520 CDP board has two banks of CFI-compliant chips and one
+  Dual-in-line JEDEC chip. This 'mapping' driver supports that
+  arrangement, implementing three MTD devices.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  sc520cdp.o
+
+Flash chip mapping on Arcom Control Systems SBC-MediaGX
+CONFIG_MTD_SBC_GXX
+  This provides a driver for the on-board flash of Arcom Control
+  Systems' SBC-GXn family of boards, formerly known as SBC-MediaGX.
+  By default the flash is split into 3 partitions which are accessed
+  as separate MTD devices.  This board utilizes Intel StrataFlash.
+  More info at
+  <http://www.arcomcontrols.com/products/icp/pc104/processors/>.
+
+CFI Flash device mapped on D-Box2
+CONFIG_MTD_DBOX2
+  This enables access routines for the flash chips on the Nokia/Sagem
+  D-Box 2 board. If you have one of these boards and would like to use
+  the flash chips on it, say 'Y'.
+
+CFI Flash device mapped on the XScale IQ80310 board
+CONFIG_MTD_IQ80310
+  This enables access routines for the flash chips on the Intel XScale
+  IQ80310 evaluation board. If you have one of these boards and would 
+  like to use the flash chips on it, say 'Y'.
+
+CFI Flash device mapped on AMD NetSc520
+CONFIG_MTD_NETSC520
+  This enables access routines for the flash chips on the AMD NetSc520
+  demonstration board. If you have one of these boards and would like 
+  to use the flash chips on it, say 'Y'.
+
+Flash chip mapping on Arcom Control Systems ELAN-104NC
+CONFIG_MTD_ELAN_104NC
+  This provides a driver for the on-board flash of the Arcom Control
+  System's ELAN-104NC development board. By default the flash
+  is split into 3 partitions which are accessed as separate MTD
+  devices. This board utilizes Intel StrataFlash. More info at
+  <http://www.arcomcontrols.com/products/icp/pc104/processors/>.
+
+Flash chip mapping on Compaq iPAQ/Bitsy
+CONFIG_MTD_BITSY
+  This provides a driver for the on-board flash found in Compaq's
+  iPAQ Palm PC and their research prototype the Itsy. iPAQ info at
+  <http://www5.compaq.com/products/handhelds/pocketpc/> and the
+  Itsy <http://www.research.digital.com/wrl/projects/Itsy/index.html>.
+Flash chip mapping on Compaq iPAQ/Bitsy
+CONFIG_MTD_DC21285
+  This provides a driver for the flash accessed using Intel's
+  21285 bridge used with Intel's StrongARM processors. More info at
+  <http://developer.intel.com/design/bridge/quicklist/dsc-21285.htm>.
+
+Flash chip mapping on ITE QED-4N-S01B, Globespan IVR or custom board
+CONFIG_MTD_CSTM_MIPS_IXX
+  This provides a mapping driver for the Integrated Tecnology Express,
+  Inc (ITE) QED-4N-S01B eval board and the Globespan IVR Reference
+  Board.  It provides the necessary addressing, length, buswidth, vpp
+  code and addition setup of the flash device for these boards.  In
+  addition, this mapping driver can be used for other boards via
+  setting of the CONFIG_MTD_CSTM_MIPS_IXX_START/LEN/BUSWIDTH
+  parameters.  This mapping will provide one mtd device using one
+  partition.  The start address can be offset from the beginning of
+  flash and the len can be less than the total flash device size to
+  allow a window into the flash.  Both CFI and JEDEC probes are
+  called.
+
+Physical start location of flash chip mapping
+CONFIG_MTD_CSTM_MIPS_IXX_START
+  This is the physical memory location that the MTD driver will
+  use for the flash chips on your particular target board. 
+  Refer to the memory map which should hopefully be in the 
+  documentation for your board.
+
+Physical length of flash chip mapping
+CONFIG_MTD_CSTM_MIPS_IXX_LEN
+  This is the total length that the MTD driver will use for the 
+  flash chips on your particular board.  Refer to the memory
+  map which should hopefully be in the documentation for your
+  board.
+
+Physical bus width of flash mapping in bytes
+CONFIG_MTD_CSTM_MIPS_IXX_BUSWIDTH
+  This is the total bus width of the mapping of the flash chips
+  on your particular board.
+
+JEDEC Flash device mapped on Mixcom piggyback card
+CONFIG_MTD_MIXMEM
+  This supports the paging arrangement for access to flash chips
+  on the MixCOM piggyback card, allowing the flash chip drivers
+  to get on with their job of driving the flash chips without
+  having to know about the paging. If you have one of these boards,
+  you probably want to enable this mapping driver. More info is at
+  <http://www.itc.hu/>.
+
+JEDEC Flash device mapped on Octagon 5066 SBC
+CONFIG_MTD_OCTAGON
+  This provides a 'mapping' driver which supports the way in which
+  the flash chips are connected in the Octagon-5066 Single Board
+  Computer. More information on the board is available at
+  <http://www.octagonsystems.com/Products/5066/5066.html>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  octagon-5066.o
+
+JEDEC Flash device mapped on Tempustech VMAX SBC301
+CONFIG_MTD_VMAX
+  This provides a 'mapping' driver which supports the way in which
+  the flash chips are connected in the Tempustech VMAX SBC301 Single
+  Board Computer. More information on the board is available at
+  <http://www.tempustech.com/tt301.htm>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  vmax301.o
+
+Support for NAND flash devices
+CONFIG_MTD_NAND
+  This enables support for accessing all type of NAND flash
+  devices.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  nand.o
+
+Support for software ECC algorithm
+CONFIG_MTD_NAND_ECC
+  This enables software-based ECC for use with NAND flash chips. It
+  can detect and correct 1 bit errors per 256 byte blocks. This
+  should be used to increase the reliability of the data stored and
+  read on the device.
+
+Support for verify read after write
+CONFIG_MTD_NAND_VERIFY_WRITE
+  This adds an extra check when data is written to the flash. The
+  NAND flash device internally checks only bits transitioning
+  from 1 to 0. There is a rare possibility that even though the
+  device thinks the write was successful, a bit could have been
+  flipped accidentally due to device wear, gamma rays, whatever.
+  Enable this if you are really paranoid.
+
+Support for the SPIA board
+CONFIG_MTD_NAND_SPIA
+  If you had to ask, you don't have one. Say 'N'.
+
+M-Systems Disk-On-Chip 1000 support
+CONFIG_MTD_DOC1000
+  This provides an MTD device driver for the M-Systems DiskOnChip
+  1000 devices, which are obsolete so you probably want to say 'N'.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  doc1000.o
+
+M-Systems Disk-On-Chip 2000 and Millennium support
+CONFIG_MTD_DOC2000
+  This provides an MTD device driver for the M-Systems DiskOnChip
+  2000 and Millennium devices.  Originally designed for the DiskOnChip
+  2000, it also now includes support for the DiskOnChip Millennium.
+  If you have problems with this driver and the DiskOnChip Millennium,
+  you may wish to try the alternative Millennium driver below. To use
+  the alternative driver, you will need to undefine DOC_SINGLE_DRIVER
+  in the <file:drivers/mtd/devices/docprobe.c> source code.
+
+  If you use this device, you probably also want to enable the NFTL
+  'NAND Flash Translation Layer' option below, which is used to
+  emulate a block device by using a kind of file system on the flash
+  chips.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  doc2000.o
+
+Alternative Disk-On-Chip Millennium support
+CONFIG_MTD_DOC2001
+  This provides an alternative MTD device driver for the M-Systems 
+  DiskOnChip Millennium devices.  Use this if you have problems with
+  the combined DiskOnChip 2000 and Millennium driver above.  To get
+  the DiskOnChip probe code to load and use this driver instead of
+  the other one, you will need to undefine DOC_SINGLE_DRIVER near
+  the beginning of <file:drivers/mtd/devices/docprobe.c>.
+
+  If you use this device, you probably also want to enable the NFTL
+  'NAND Flash Translation Layer' option below, which is used to
+  emulate a block device by using a kind of file system on the flash
+  chips.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  doc2001.o
+
+Probe for DiskOnChip devices
+CONFIG_MTD_DOCPROBE
+  This isn't a real config option, it's derived.
+
+Advanced detection options for DiskOnChip
+CONFIG_MTD_DOCPROBE_ADVANCED
+  This option allows you to specify nonstandard address at which to
+  probe for a DiskOnChip, or to change the detection options.  You
+  are unlikely to need any of this unless you are using LinuxBIOS.
+  Say 'N'.
+
+Probe for 0x55 0xAA BIOS Extension Signature
+CONFIG_MTD_DOCPROBE_55AA
+  Check for the 0x55 0xAA signature of a DiskOnChip, and do not
+  continue with probing if it is absent.  The signature will always be
+  present for a DiskOnChip 2000 or a normal DiskOnChip Millennium.
+  Only if you have overwritten the first block of a DiskOnChip
+  Millennium will it be  absent.  Enable this option if you are using
+  LinuxBIOS or if you need to recover a DiskOnChip Millennium on which
+  you have managed to wipe the first block.
+
+Physical address of DiskOnChip
+CONFIG_MTD_DOCPROBE_ADDRESS
+  By default, the probe for DiskOnChip devices will look for a
+  DiskOnChip at every multiple of 0x2000 between 0xC8000 and 0xEE000.
+  This option allows you to specify a single address at which to probe
+  for the device, which is useful if you have other devices in that
+  range which get upset when they are probed.
+
+  (Note that on PowerPC, the normal probe will only check at
+  0xE4000000.)
+
+  Normally, you should leave this set to zero, to allow the probe at
+  the normal addresses.
+
+Probe high addresses
+CONFIG_MTD_DOCPROBE_HIGH
+  By default, the probe for DiskOnChip devices will look for a
+  DiskOnChip at every multiple of 0x2000 between 0xC8000 and 0xEE000.
+  This option changes to make it probe between 0xFFFC8000 and
+  0xFFFEE000.  Unless you are using LinuxBIOS, this is unlikely to be
+  useful to you.  Say 'N'.
+
+Ramix PMC551 PCI Mezzanine ram card support
+CONFIG_MTD_PMC551
+  This provides a MTD device driver for the Ramix PMC551 RAM PCI card
+  from Ramix Inc. <http://www.ramix.com/products/memory/pmc551.html>.
+  These devices come in memory configurations from 32M - 1G.  If you
+  have one, you probably want to enable this.
+
+  If this driver is compiled as a module you get the ability to select
+  the size of the aperture window pointing into the devices memory.
+  What this means is that if you have a 1G card, normally the kernel
+  will use a 1G memory map as its view of the device.  As a module,
+  you can select a 1M window into the memory and the driver will
+  "slide" the window around the PMC551's memory.  This was
+  particularly useful on the 2.2 kernels on PPC architectures as there
+  was limited kernel space to deal with.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  pmc551.o
+
+PMC551 256M DRAM Bugfix
+CONFIG_MTD_PMC551_BUGFIX
+  Some of Ramix's PMC551 boards with 256M configurations have invalid
+  column and row mux values.  This option will fix them, but will
+  break other memory configurations.  If unsure say N.
+
+PMC551 Debugging
+CONFIG_MTD_PMC551_DEBUG
+  This option makes the PMC551 more verbose during its operation and
+  is only really useful if you are developing on this driver or
+  suspect a possible hardware or driver bug.  If unsure say N.
+
+Use extra onboard system memory as MTD device
+CONFIG_MTD_SLRAM
+  If your CPU cannot cache all of the physical memory in your machine,
+  you can still use it for storage or swap by using this driver to
+  present it to the system as a Memory Technology Device.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  slram.o
+
+DEC MS02-NV NVRAM module support
+CONFIG_MTD_MS02NV
+  This is a MTD driver for the DEC's MS02-NV (54-20948-01) battery
+  backed-up NVRAM module.  The module was originally meant as an NFS
+  accelerator.  Say Y here if you have a DECstation 5000/2x0 or a
+  DECsystem 5900 equipped with such a module.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module will
+  be called ms02-nv.o.
+
+Debugging RAM test driver
+CONFIG_MTD_MTDRAM
+  This enables a test MTD device driver which uses vmalloc() to
+  provide storage.  You probably want to say 'N' unless you're
+  testing stuff.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  mtdram.o
+
+MTDRAM erase block size in KB
+CONFIG_MTDRAM_ERASE_SIZE
+  This allows you to configure the size of the erase blocks in the
+  device emulated by the MTDRAM driver.  If the MTDRAM driver is built
+  as a module, it is also possible to specify this as a parameter when
+  loading the module.
+
+MTDRAM device size in KB
+CONFIG_MTDRAM_TOTAL_SIZE
+  This allows you to configure the total size of the MTD device
+  emulated by the MTDRAM driver.  If the MTDRAM driver is built
+  as a module, it is also possible to specify this as a parameter when
+  loading the module.
+
+SRAM Hexadecimal Absolute position or 0
+CONFIG_MTDRAM_ABS_POS
+  If you have system RAM accessible by the CPU but not used by Linux
+  in normal operation, you can give the physical address at which the
+  available RAM starts, and the MTDRAM driver will use it instead of
+  allocating space from Linux's available memory. Otherwise, leave 
+  this set to zero. Most people will want to leave this as zero.
+
+CFI Flash device mapping on the Flaga Digital Module
+CONFIG_MTD_CFI_FLAGADM
+  Mapping for the Flaga digital module.  If you don´t have one, ignore
+  this setting.
+
+Momenco Ocelot boot flash device
+CONFIG_MTD_OCELOT
+  This enables access routines for the boot flash device and for the
+  NVRAM on the Momenco Ocelot board.  If you have one of these boards
+  and would like access to either of these, say 'Y'.
+
+Support for absent chips in bus mapping
+CONFIG_MTD_ABSENT
+  This option enables support for a dummy probing driver used to
+  allocated placeholder MTD devices on systems that have socketed
+  or removable media.  Use of this driver as a fallback chip probe
+  preserves the expected registration order of MTD device nodes on
+  the system regardless of media presence.  Device nodes created
+  with this driver will return -ENODEV upon access.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  map_absent.o
+
+MTD emulation using block device
+CONFIG_MTD_BLKMTD
+  This driver allows a block device to appear as an MTD. It would
+  generally be used in the following cases:
+
+    Using Compact Flash as an MTD, these usually present themselves to
+    the system as an ATA drive.
+    Testing MTD users (eg JFFS2) on large media and media that might
+    be removed during a write (using the floppy drive).
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  blkmtd.o
+
+Cirrus CDB89712 evaluation board mappings
+CONFIG_MTD_CDB89712
+  This enables access to the flash or ROM chips on the CDB89712 board.
+  (This board has 8 MB of Intel Strataflash, a 128 byte boot ROM, and 48 KB of
+  internal SRAM.  This driver provides MTD devices for all three components.)
+  If you have such a board, say 'Y'.
+
+Detect non-CFI AMD/JEDEC-compatible flash chips
+CONFIG_MTD_JEDECPROBE
+  This option enables JEDEC-style probing of flash chips which are not
+  compatible with the Common Flash Interface, but will use the common
+  CFI-targetted flash drivers for any chips which are identified which
+  are in fact compatible in all but the probe method. This actually
+  covers most AMD/Fujitsu-compatible chips, and will shortly cover also
+  non-CFI Intel chips (that code is in MTD CVS and should shortly be sent
+  for inclusion in Linus' tree)
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  jedec_probe.o
+
+BIOS flash chip on Intel L440GX boards
+CONFIG_MTD_L440GX
+  Support for treating the BIOS flash chip on Intel L440GX motherboards
+  as an MTD device - with this you can reprogram your BIOS.
+
+  BE VERY CAREFUL.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  l440gx.o
+
+28F160xx flash driver for LART
+CONFIG_MTD_LART
+  This enables the flash driver for LART. Please note that you do
+  not need any mapping/chip driver for LART. This one does it all
+  for you, so go disable all of those if you enabled some of them (:
+
+Older (theoretically obsoleted now) drivers for non-CFI chips
+CONFIG_MTD_OBSOLETE_CHIPS
+  This option does not enable any code directly, but will allow you to
+  select some other chip drivers which are now considered obsolete,
+  because the generic CONFIG_JEDEC_PROBE code above should now detect
+  the chips which are supported by these drivers, and allow the generic
+  CFI-compatible drivers to drive the chips. Say 'N' here unless you have
+  already tried the CONFIG_JEDEC_PROBE method and reported its failure
+  to the MTD mailing list at <linux-mtd@lists.infradead.org>
+
+CFI Flash device mapped on Hitachi SolutionEngine
+CONFIG_MTD_SOLUTIONENGINE
+  This enables access to the flash chips on the Hitachi SolutionEngine and
+  similar boards. Say 'Y' if you are building a kernel for such a board.
+
+CFI Flash device mapped on TQM8XXL PPC board
+CONFIG_MTD_TQM8XXL
+  The TQM8xxL PowerPC board has up to two banks of CFI-compliant
+  chips, currently uses AMD one. This 'mapping' driver supports
+  that arrangement, allowing the CFI probe and command set driver
+  code to communicate with the chips on the TQM8xxL board. More at
+  <http://www.denx.de/embedded-ppc-en.html>.
+
+Darkness
+CONFIG_MEMORY_SET
+  This is an option about which you will never be asked a question.
+  Therefore, I conclude that you do not exist - go away.
+
+  There is a grue here.
+
+Physical memory size
+CONFIG_MEMORY_SIZE
+  This sets the default memory size assumed by your SH kernel. It can
+  be overridden as normal by the 'mem=' argument on the kernel command
+  line. If unsure, consult your board specifications or just leave it
+  as 0x00400000 which was the default value before this became
+  configurable.
+
+Cache and PCI noncoherent
+CONFIG_SH_PCIDMA_NONCOHERENT
+  Enable this option if your platform does not have a CPU cache which
+  remains coherent with PCI DMA. It is safest to say 'Y', although you
+  will see better performance if you can say 'N', because the PCI DMA
+  code will not have to flush the CPU's caches. If you have a PCI host
+  bridge integrated with your SH CPU, refer carefully to the chip specs
+  to see if you can say 'N' here. Otherwise, leave it as 'Y'.
+
+USB (Universal Serial Bus) support
+CONFIG_USB
+  Universal Serial Bus (USB) is a specification for a serial bus
+  subsystem which offers higher speeds and more features than the
+  traditional PC serial port.  The bus supplies power to peripherals
+  and allows for hot swapping.  Up to 127 USB peripherals can be
+  connected to a single USB port in a tree structure.  The USB port is
+  the root of the tree, the peripherals are the leaves and the inner
+  nodes are special USB devices called hubs.  Many newer PC's have USB
+  ports and newer peripherals such as scanners, keyboards, mice,
+  modems, and printers support the USB protocol and can be connected
+  to the PC via those ports.
+
+  Say Y here if your computer has a USB port and you want to use USB
+  devices.  You then need to say Y to at least one of "UHCI support"
+  or "OHCI support" below (the type of interface that the USB hardware
+  in your computer provides to the operating system) and then choose
+  from among the drivers for USB peripherals.  You may want to check
+  out the information provided in <file:Documentation/usb/> and
+  especially the links given in <file:Documentation/usb/usb-help.txt>.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called usbcore.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB verbose debug messages
+CONFIG_USB_DEBUG
+  Say Y here if you want the USB core & hub drivers to produce a bunch
+  of debug messages to the system log. Select this if you are having a
+  problem with USB support and want to see more of what is going on.
+
+USB long timeout for slow-responding devices (some MGE Ellipse UPSes)
+CONFIG_USB_LONG_TIMEOUT
+  This option makes the standard time out a bit longer.  Basically,
+  some devices are just slow to respond, so this makes usb more
+  patient.  There should be no harm in selecting this, but it is
+  needed for some MGE Ellipse UPSes.
+
+  If you have an MGE Ellipse UPS, or you see timeouts in HID
+  transactions, say Y; otherwise say N.
+
+EHCI (USB 2.0) support
+CONFIG_USB_EHCI_HCD
+  The Enhanced Host Controller Interface (EHCI) is standard for USB 2.0
+  "high speed" (480 Mbit/sec, 60 Mbyte/sec) host controller hardware.
+  If your USB host controller supports USB 2.0, you will likely want to
+  configure this Host Controller Driver.  At this writing, the primary
+  implementation of EHCI is a chip from NEC, widely available in add-on
+  PCI cards, but implementations are in the works from other vendors
+  including Intel and Philips.  Motherboard support is appearing.
+
+  EHCI controllers are packaged with "companion" host controllers (OHCI
+  or UHCI) to handle USB 1.1 devices connected to root hub ports.  Ports
+  will connect to EHCI if it the device is high speed, otherwise they
+  connect to a companion controller.  If you configure EHCI, you should
+  probably configure the OHCI (for NEC and some other vendors) USB Host
+  Controller Driver too.
+
+  You may want to read <file:Documentation/usb/ehci.txt>.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ehci-hcd.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+UHCI (Intel PIIX4, VIA, ...) support
+CONFIG_USB_UHCI
+  The Universal Host Controller Interface is a standard by Intel for
+  accessing the USB hardware in the PC (which is also called the USB
+  host controller). If your USB host controller conforms to this
+  standard, you may want to say Y, but see below. All recent boards
+  with Intel PCI chipsets (like intel 430TX, 440FX, 440LX, 440BX,
+  i810, i820) conform to this standard. Also all VIA PCI chipsets
+  (like VIA VP2, VP3, MVP3, Apollo Pro, Apollo Pro II or Apollo Pro
+  133).
+
+  Currently there exist two drivers for UHCI host controllers: this
+  one and the so-called JE driver, which you can get from
+  "UHCI alternate (JE) support", below. You need only one.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called usb-uhci.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+UHCI (Intel PIIX4, VIA, ...) alternate (JE) support
+CONFIG_USB_UHCI_ALT
+  The Universal Host Controller Interface is a standard by Intel for
+  accessing the USB hardware in the PC (which is also called the USB
+  host controller). If your USB host controller conforms to this
+  standard, you may want to say Y, but see below. All recent boards
+  with Intel PCI chipsets (like intel 430TX, 440FX, 440LX, 440BX,
+  i810, i820) conform to this standard. Also all VIA PCI chipsets
+  (like VIA VP2, VP3, MVP3, Apollo Pro, Apollo Pro II or Apollo Pro
+  133). If unsure, say Y.
+
+  Currently there exist two drivers for UHCI host controllers: this
+  so-called JE driver, and the one you get from "UHCI support", above.
+  You need only one.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called uhci.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+OHCI (Compaq, iMacs, OPTi, SiS, ALi, ...) support
+CONFIG_USB_OHCI
+  The Open Host Controller Interface is a standard by
+  Compaq/Microsoft/National for accessing the USB PC hardware (also
+  called USB host controller). If your USB host controller conforms to
+  this standard, say Y. The USB host controllers on most non-Intel
+  architectures and on several x86 compatibles with non-Intel chipsets
+  -- like SiS (aktual 610, 610 and so on) or ALi (ALi IV, ALi V,
+  Aladdin Pro..) -- conform to this standard.
+
+  You may want to read <file:Documentation/usb/ohci.txt>.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called usb-ohci.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+USB Human Interface Device (full HID) support
+CONFIG_USB_HID
+  Say Y here if you want full HID support to connect keyboards,
+  mice, joysticks, graphic tablets, or any other HID based devices
+  to your computer via USB. You also need to select HID Input layer
+  support (below) if you want to use keyboards, mice, joysticks and
+  the like.
+
+  You can't use this driver and the HIDBP (Boot Protocol) keyboard
+  and mouse drivers at the same time. More information is available:
+  <file:Documentation/input/input.txt>.
+
+  If unsure, say Y.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called hid.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB HID Input layer support
+CONFIG_USB_HIDINPUT
+  Say Y here if you want to use a USB keyboard, mouse or joystick,
+  or any other HID input device. You also need Input layer support, 
+  (CONFIG_INPUT) which you select under "Input core support".
+
+  If unsure, say Y.
+
+/dev/usb/hiddev raw HID device support
+CONFIG_USB_HIDDEV
+  Say Y here if you want to support HID devices (from the USB
+  specification standpoint) that aren't strictly user interface
+  devices, like monitor controls and Uninterruptable Power Supplies.
+
+  This module supports these devices separately using a separate
+  event interface on /dev/usb/hiddevX (char 180:96 to 180:111).
+  This driver requires CONFIG_USB_HID.
+
+  If unsure, say Y.
+
+USB HIDBP Keyboard (basic) support
+CONFIG_USB_KBD
+  Say Y here only if you are absolutely sure that you don't want
+  to use the generic HID driver for your USB keyboard and prefer
+  to use the keyboard in its limited Boot Protocol mode instead.
+
+  This is almost certainly not what you want.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called usbkbd.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+  If even remotely unsure, say N.
+
+USB HIDBP Mouse (basic) support
+CONFIG_USB_MOUSE
+  Say Y here only if you are absolutely sure that you don't want
+  to use the generic HID driver for your USB keyboard and prefer
+  to use the keyboard in its limited Boot Protocol mode instead.
+
+  This is almost certainly not what you want.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called usbmouse.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+  If even remotely unsure, say N.
+
+Wacom Intuos/Graphire tablet support
+CONFIG_USB_WACOM
+  Say Y here if you want to use the USB version of the Wacom Intuos
+  or Graphire tablet.  Make sure to say Y to "Mouse support"
+  (CONFIG_INPUT_MOUSEDEV) and/or "Event interface support"
+  (CONFIG_INPUT_EVDEV) as well.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called wacom.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Griffin Technology PowerMate support
+CONFIG_USB_POWERMATE
+  Say Y here if you want to use the Griffin Technology, Inc. USB
+  PowerMate device. This device is an aluminum dial which can
+  measure clockwise and anticlockwise rotation. The dial also
+  acts as a pushbutton. The base contains an LED which can be
+  instructed to pulse or to switch to a particular intensity.
+
+  You can download userspace tools from http://sowerbutts.com/powermate/
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called powermate.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Aiptek HyperPen tablet support
+CONFIG_USB_AIPTEK
+  Say Y here if you want to use the USB version of the Aiptek HyperPen
+  Digital Tablet (models 4000U, 5000U, 6000U, 8000U, and 12000U.)
+  Make sure to say Y to "Mouse support" (CONFIG_INPUT_MOUSEDEV) and/or
+  "Event interface support" (CONFIG_INPUT_EVDEV) as well.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called aiptek.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Use input layer for ADB devices
+CONFIG_INPUT_ADBHID
+  Say Y here if you want to have ADB (Apple Desktop Bus) HID devices
+  such as keyboards, mice, joysticks, or graphic tablets handled by
+  the input layer.  If you say Y here, make sure to say Y to the
+  corresponding drivers "Keyboard support" (CONFIG_INPUT_KEYBDEV),
+  "Mouse Support" (CONFIG_INPUT_MOUSEDEV) and "Event interface
+  support" (CONFIG_INPUT_EVDEV) as well.
+
+  If you say N here, you still have the option of using the old ADB
+  keyboard and mouse drivers.
+
+  If unsure, say Y.
+
+Input core support
+CONFIG_INPUT
+  Say Y here if you want to enable any of the following options for
+  USB Human Interface Device (HID) support.
+
+  Say Y here if you want to enable any of the USB HID options in the
+  USB support section which require Input core support.
+
+  Otherwise, say N.
+
+Keyboard support
+CONFIG_INPUT_KEYBDEV
+  Say Y here if you want your USB HID keyboard (or an ADB keyboard
+  handled by the input layer) to be able to serve as a system
+  keyboard.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called keybdev.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Mouse support
+CONFIG_INPUT_MOUSEDEV
+  Say Y here if you want your USB HID mouse (or ADB mouse handled by
+  the input layer) to be accessible as char devices 13:32+ -
+  /dev/input/mouseX and 13:63 - /dev/input/mice as an emulated ImPS/2
+  mouse.  That way, all user space programs will be able to use your
+  mouse.
+
+  If unsure, say Y.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called mousedev.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+Horizontal screen resolution
+CONFIG_INPUT_MOUSEDEV_SCREEN_X
+  If you're using a digitizer, or a graphic tablet, and want to use
+  it as a mouse then the mousedev driver needs to know the X window
+  screen resolution you are using to correctly scale the data. If
+  you're not using a digitizer, this value is ignored.
+
+Vertical screen resolution
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y
+  If you're using a digitizer, or a graphic tablet, and want to use
+  it as a mouse then the mousedev driver needs to know the X window
+  screen resolution you are using to correctly scale the data. If
+  you're not using a digitizer, this value is ignored.
+
+Joystick support
+CONFIG_INPUT_JOYDEV
+  Say Y here if you want your USB HID joystick or gamepad to be
+  accessible as char device 13:0+ - /dev/input/jsX device.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called joydev.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Event interface support
+CONFIG_INPUT_EVDEV
+  Say Y here if you want your USB or ADB HID device events be
+  accessible under char device 13:64+ - /dev/input/eventX in a generic
+  way.  This is the future ...
+
+USB Scanner support
+CONFIG_USB_SCANNER
+  Say Y here if you want to connect a USB scanner to your computer's
+  USB port. Please read <file:Documentation/usb/scanner.txt> for more
+  information.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called scanner.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+HP 5300C scanner support 
+CONFIG_USB_HP5300
+  Say Y here if you want to connect a HP5300C scanner to your
+  computer's USB port.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called hp5300.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+USB Audio support
+CONFIG_USB_AUDIO
+  Say Y here if you want to connect USB audio equipment such as
+  speakers to your computer's USB port.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called audio.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+EMI 2|6 USB Audio interface support
+CONFIG_USB_EMI26
+  This driver loads firmware to Emagic EMI 2|6 low latency USB
+  Audio interface.
+
+  After firmware load the device is handled with standard linux
+  USB Audio driver.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called audio.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB Modem (CDC ACM) support
+CONFIG_USB_ACM
+  This driver supports USB modems and ISDN adapters which support the
+  Communication Device Class Abstract Control Model interface.
+  Please read <file:Documentation/usb/acm.txt> for details.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called acm.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB serial converter support
+CONFIG_USB_SERIAL
+  Say Y here if you have a USB device that provides normal serial
+  ports, or acts like a serial device, and you want to connect it to
+  your USB bus.
+
+  Please read <file:Documentation/usb/usb-serial.txt> for more
+  information on the specifics of the different devices that are
+  supported, and on how to use them.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called usbserial.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+USB Generic Serial Driver
+CONFIG_USB_SERIAL_GENERIC
+  Say Y here if you want to use the generic USB serial driver.  Please
+  read <file:Documentation/usb/usb-serial.txt> for more information on
+  using this driver.  It is recommended that the "USB Serial converter
+  support" be compiled as a module for this driver to be used
+  properly.
+
+USB ConnectTech WhiteHEAT Serial Driver
+CONFIG_USB_SERIAL_WHITEHEAT
+  Say Y here if you want to use a ConnectTech WhiteHEAT 4 port
+  USB to serial converter device.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called whiteheat.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+USB Handspring Visor Driver
+CONFIG_USB_SERIAL_VISOR
+  Say Y here if you want to connect to your HandSpring Visor, Palm
+  m500 or m505 through its USB docking station. See
+  <http://usbvisor.sourceforge.net/> for more information on using this
+  driver.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called visor.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB PocketPC PDA Driver
+CONFIG_USB_SERIAL_IPAQ
+  Say Y here if you want to connect to your Compaq iPAQ, HP Jornada,
+  or any other PDA running Windows CE 3.0 or PocketPC 2002 using a USB
+  cradle/cable. For information on using the driver,
+  read <file:Documentation/usb/usb-serial.txt>.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ipaq.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB IR Dongle Serial Driver
+CONFIG_USB_SERIAL_IR
+  Say Y here if you want to enable simple serial support for USB IrDA
+  devices.  This is useful if you do not want to use the full IrDA
+  stack.
+  
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ir-usb.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB Belkin and Paracom Single Port Serial Driver
+CONFIG_USB_SERIAL_BELKIN
+  Say Y here if you want to use a Belkin USB Serial single port
+  adaptor (F5U103 is one of the model numbers) or the Peracom single
+  port USB to serial adapter.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called belkin_sa.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+USB FTDI Single Port Serial Driver
+CONFIG_USB_SERIAL_FTDI_SIO
+  Say Y here if you want to use a FTDI SIO single port USB to serial
+  converter device. The implementation I have is called the USC-1000.
+  This driver has also be tested with the 245 and 232 devices.
+
+  See <http://ftdi-usb-sio.sourceforge.net/> for more
+  information on this driver and the device.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ftdi_sio.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+USB Keyspan PDA Single Port Serial Driver
+CONFIG_USB_SERIAL_KEYSPAN_PDA
+  Say Y here if you want to use a Keyspan PDA single port USB to
+  serial converter device.  This driver makes use of firmware
+  developed from scratch by Brian Warner.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called keyspan_pda.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+USB Xircom / Entregra Single Port Serial Driver
+CONFIG_USB_SERIAL_XIRCOM
+  Say Y here if you want to use a Xircom or Entregra single port USB to
+  serial converter device.  This driver makes use of firmware
+  developed from scratch by Brian Warner.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called keyspan_pda.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+USB Keyspan USA-xxx Serial Driver
+CONFIG_USB_SERIAL_KEYSPAN
+  Say Y here if you want to use Keyspan USB to serial converter
+  devices.  This driver makes use of Keyspan's official firmware
+  and was developed with their support.  You must also include
+  firmware to support your particular device(s).
+
+  See <http://misc.nu/hugh/keyspan.html> for more information.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called keyspan.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB Keyspan USA-28 Firmware
+CONFIG_USB_SERIAL_KEYSPAN_USA28
+  Say Y here to include firmware for the USA-28 converter.
+
+USB Keyspan USA-28X Firmware
+CONFIG_USB_SERIAL_KEYSPAN_USA28X
+  Say Y here to include firmware for the USA-28X converter.
+  Be sure you have a USA-28X, there are also 28XA and 28XB
+  models, the label underneath has the actual part number.
+
+USB Keyspan USA-28XA Firmware
+CONFIG_USB_SERIAL_KEYSPAN_USA28XA
+  Say Y here to include firmware for the USA-28XA converter.
+  Be sure you have a USA-28XA, there are also 28X and 28XB
+  models, the label underneath has the actual part number.
+
+USB Keyspan USA-28XB Firmware
+CONFIG_USB_SERIAL_KEYSPAN_USA28XB
+  Say Y here to include firmware for the USA-28XB converter.
+  Be sure you have a USA-28XB, there are also 28X and 28XA
+  models, the label underneath has the actual part number.
+
+USB Keyspan USA-19 Firmware
+CONFIG_USB_SERIAL_KEYSPAN_USA19
+  Say Y here to include firmware for the USA-19 converter.
+
+USB Keyspan USA-18X Firmware
+CONFIG_USB_SERIAL_KEYSPAN_USA18X
+  Say Y here to include firmware for the USA-18X converter.
+
+USB Keyspan USA-19W Firmware
+CONFIG_USB_SERIAL_KEYSPAN_USA19W
+  Say Y here to include firmware for the USA-19W converter.
+
+USB Keyspan USA-19QW Firmware
+CONFIG_USB_SERIAL_KEYSPAN_USA19QW
+  Say Y here to include firmware for the USA-19QW converter.
+
+USB Keyspan USA-19QI Firmware
+CONFIG_USB_SERIAL_KEYSPAN_USA19QI
+  Say Y here to include firmware for the USA-19QI converter.
+
+USB Keyspan USA-49W Firmware
+CONFIG_USB_SERIAL_KEYSPAN_USA49W
+  Say Y here to include firmware for the USA-49W converter.
+
+USB ZyXEL omni.net LCD Plus Driver
+CONFIG_USB_SERIAL_OMNINET
+  Say Y here if you want to use a ZyXEL omni.net LCD ISDN TA.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called omninet.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB Digi International AccelePort USB Serial Driver
+CONFIG_USB_SERIAL_DIGI_ACCELEPORT
+  Say Y here if you want to use Digi AccelePort USB 2 or 4 devices,
+  2 port (plus parallel port) and 4 port USB serial converters.  The
+  parallel port on the USB 2 appears as a third serial port on Linux.
+  The Digi Acceleport USB 8 is not yet supported by this driver.
+
+  This driver works under SMP with the usb-uhci driver.  It does not
+  work under SMP with the uhci driver.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called digi_acceleport.o.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+USB Empeg empeg-car Mark I/II Driver
+CONFIG_USB_SERIAL_EMPEG
+  Say Y here if you want to connect to your Empeg empeg-car Mark I/II
+  mp3 player via USB.  The driver uses a single ttyUSB{0,1,2,...}
+  device node.  See <file:Documentation/usb/usb-serial.txt> for more
+  tidbits of information.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called empeg.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB MCT Single Port Serial Driver
+CONFIG_USB_SERIAL_MCT_U232
+  Say Y here if you want to use a USB Serial single port adapter from
+  Magic Control Technology Corp. (U232 is one of the model numbers).
+
+  This driver also works with Sitecom U232-P25 and D-Link DU-H3SP USB
+  BAY devices.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called mct_u232.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+USB Prolific 2303 Single Port Serial Driver
+CONFIG_USB_SERIAL_PL2303
+  Say Y here if you want to use the PL2303 USB Serial single port
+  adapter from Prolific.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called pl2303.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+USB KOBIL chipcard reader
+CONFIG_USB_SERIAL_KOBIL_SCT
+  Say Y here if you want to use one of the following KOBIL USB chipcard 
+  readers: TWIN, KAAN Standard Plus, SecOVID Reader Plus, B1 PRO, KAAN PRO
+
+  Note that you need a current CT-API.
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called kobil_sct.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+USB REINER SCT cyberJack pinpad/e-com chipcard reader
+CONFIG_USB_SERIAL_CYBERJACK
+  Say Y here if you want to use a cyberJack pinpad/e-com USB chipcard
+  reader. This is an interface to ISO 7816 compatible contactbased
+  chipcards, e.g. GSM SIMs.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called cyberjack.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+  If unsure, say N.
+
+USB Edgeport Serial Driver
+CONFIG_USB_SERIAL_EDGEPORT
+  Say Y here if you want to use any of the following devices from
+  Inside Out Networks (Digi):
+       Edgeport/4
+       Rapidport/4
+       Edgeport/4t
+       Edgeport/2
+       Edgeport/4i
+       Edgeport/2i
+       Edgeport/421
+       Edgeport/21
+       Edgeport/8
+       Edgeport/8 Dual
+       Edgeport/2D8
+       Edgeport/4D8
+       Edgeport/8i
+       Edgeport/2 DIN
+       Edgeport/4 DIN
+       Edgeport/16 Dual
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called io_edgeport.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+USB PalmConnect (and other KL5KUSB105-based) Single Port Serial Driver
+CONFIG_USB_SERIAL_KLSI
+  Say Y here if you want to use a KL5KUSB105 - based single port
+  serial adapter. The most widely known -- and currently the only
+  tested -- device in this category is the PalmConnect USB Serial
+  adapter sold by Palm Inc. for use with their Palm III and Palm V
+  series PDAs.
+
+  Please read <file:Documentation/usb/usb-serial.txt> for more
+  information.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called kl5kusb105.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+USB Serial Converter verbose debug
+CONFIG_USB_SERIAL_DEBUG
+  Say Y here if you want verbose debug messages from the USB Serial
+  Drivers sent to the kernel debug log.
+
+USB Printer support
+CONFIG_USB_PRINTER
+  Say Y here if you want to connect a USB printer to your computer's
+  USB port.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called printer.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB IBM (Xirlink) C-It Camera support
+CONFIG_USB_IBMCAM
+  Say Y here if you want to connect a IBM "C-It" camera, also known as
+  "Xirlink PC Camera" to your computer's USB port.  For more
+  information, read <file:Documentation/usb/ibmcam.txt>.
+
+  This driver uses the Video For Linux API.  You must enable
+  (Y or M in config) Video For Linux (under Character Devices)
+  to use this driver.  Information on this API and pointers to
+  "v4l" programs may be found on the WWW at
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ibmcam.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>. This
+  camera has several configuration options which can be specified when
+  you load the module.  Read <file:Documentation/usb/ibmcam.txt> to
+  learn more.
+
+CONFIG_USB_KONICAWC
+  Say Y here if you want support for webcams based on a Konica
+  chipset. This is known to work with the Intel YC76 webcam.
+
+  This driver uses the Video For Linux API.  You must enable
+  (Y or M in config) Video For Linux (under Character Devices)
+  to use this driver.  Information on this API and pointers to
+  "v4l" programs may be found on the WWW at
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called konicawc.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+USB OV511 Camera support
+CONFIG_USB_OV511
+  Say Y here if you want to connect this type of camera to your
+  computer's USB port. See <file:Documentation/usb/ov511.txt> for more
+  information and for a list of supported cameras.
+
+  This driver uses the Video For Linux API. You must say Y or M to
+  "Video For Linux" (under Character Devices) to use this driver.
+  Information on this API and pointers to "v4l" programs may be found
+  on the WWW at <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ov511.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB Communication Class Ethernet device support
+CONFIG_USB_CDCETHER
+  This driver supports devices conforming to the Communication Device
+  Class Ethernet Control Model.  This is used in some cable modems.
+  For more details on the specification, get the Communication Device
+  Class specification from <http://www.usb.org/>.
+
+  This driver should work with the following devices:
+        * Ericsson PipeRider (all variants)
+        * Motorola (DM100 and SB4100)
+        * Broadcom Cable Modem (reference design)
+        * Toshiba PCX1100U and possibly other cable modems
+        * Sharp Zaurus SL-5000D
+
+  The device creates a network device (ethX, where X depends on what
+  other networking devices you have in use), as for a normal PCI
+  or ISA based ethernet network card.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called CDCEther.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+NetChip 1080-based USB Host-to-Host Link
+CONFIG_USB_NET1080
+  The NetChip 1080 is a USB 1.1 host controller.  NetChip has a web
+  site with technical information at <http://www.netchip.com/>.
+
+Philips webcam support
+CONFIG_USB_PWC
+  Say Y or M here if you want to use one of these Philips USB webcams:
+  PCA645, PCA646, PCVC675, PCVC680, PCVC690, PCVC730, PCVC740, or
+  the Askey VC010. The PCA635, PCVC665 and PCVC720 are not supported
+  by this driver and never will be.
+
+  This driver has an optional plugin, which is distributed as a binary
+  module only.  It contains code that allow you to use higher
+  resolutions and framerates but may not be distributed as source.
+  But even without this plugin you can these cams for most
+  applications.
+
+  See <file:Documentation/usb/philips.txt> for more information and
+  installation instructions.
+
+  The built-in microphone is enabled by selecting USB Audio support.
+
+  This driver uses the Video For Linux API. You must say Y or M to
+  "Video For Linux" (under Character Devices) to use this driver.
+  Information on this API and pointers to "v4l" programs may be found
+  on the WWW at <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called pwc.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB SE401 Camera support
+CONFIG_USB_SE401
+  Say Y here if you want to connect this type of camera to your
+  computer's USB port. See <file:Documentation/usb/se401.txt> for more
+  information and for a list of supported cameras.
+
+  This driver uses the Video For Linux API. You must say Y or M to
+  "Video For Linux" (under Multimedia Devices) to use this driver.
+  Information on this API and pointers to "v4l" programs may be found
+  on the WWW at <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called se401.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB STV680 (Pencam) Camera support
+CONFIG_USB_STV680
+  Say Y here if you want to connect this type of camera to your
+  computer's USB port. This includes the Pencam line of cameras.
+  See <file:Documentation/usb/stv680.txt> for more information and for
+  a list of supported cameras.
+
+  This driver uses the Video For Linux API. You must say Y or M to
+  "Video For Linux" (under Multimedia Devices) to use this driver.
+  Information on this API and pointers to "v4l" programs may be found
+  on the WWW at <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called stv680.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Vicam
+CONFIG_USB_VICAM
+  Say Y here if you have 3com homeconnect camera (vicam).
+
+  This driver uses the Video For Linux API. You must say Y or M to
+  "Video For Linux" (under Multimedia Devices) to use this driver.
+  Information on this API and pointers to "v4l" programs may be found
+  on the WWW at <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called vicam.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+
+Pegasus/Pegasus II based USB-Ethernet device support
+CONFIG_USB_PEGASUS
+  Say Y here if you know you have Pegasus or Pegasus-II based adapter.
+  If in doubt then look at linux/drivers/usb/pegasus.h for the complete
+  list of supported devices.
+  If your particular adapter is not in the list and you are _sure_ it
+  is Pegasus or Pegasus-II based then send me (petkan@users.sourceforge.net)
+  vendor and device IDs.
+  
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called pegasus.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Realtek RTL8150 based USB-Ethernet device support
+CONFIG_USB_RTL8150
+  Say Y here if you have RTL8150 based usb-ethernet adapter.
+  Send me (petkan@users.sourceforge.net) any comments you may have.
+  You can also check for updates at <http://pegasus2.sourceforge.net/>
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called rtl8150.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB KLSI KL5USB101-based Ethernet device support
+CONFIG_USB_KAWETH
+  Say Y here if you want to use one of the following 10Mbps only
+  USB Ethernet adapters based on the KLSI KL5KUSB101B chipset:
+       3Com 3C19250
+       ADS USB-10BT
+       ATEN USB Ethernet
+       ASANTE USB To Ethernet Adapter
+       AOX Endpoints USB Ethernet
+       Correga K.K.
+       D-Link DSB-650C and DU-E10
+       Entrega / Portgear E45
+       I-O DATA USB-ET/T
+       Jaton USB Ethernet Device Adapter
+       Kingston Technology USB Ethernet Adapter
+       Linksys USB10T
+       Mobility USB-Ethernet Adapter
+       NetGear EA-101
+       Peracom Enet and Enet2
+       Portsmith Express Ethernet Adapter
+       Shark Pocket Adapter
+       SMC 2202USB
+       Sony Vaio port extender
+
+  This driver is likely to work with most 10Mbps only USB Ethernet
+  adapters, including some "no brand" devices. It does NOT work on
+  SmartBridges smartNIC or on Belkin F5U111 devices - you should use
+  the CATC NetMate driver for those. If you are not sure which one
+  you need, select both, and the correct one should be selected for
+  you.
+
+  This driver makes the adapter appear as a normal Ethernet interface,
+  typically on eth0, if it is the only ethernet device, or perhaps on
+  eth1, if you have a PCI or ISA ethernet card installed.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called kaweth.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB CATC NetMate-based Ethernet device support
+CONFIG_USB_CATC
+  Say Y if you want to use one of the following 10Mbps USB Ethernet
+  device based on the EL1210A chip. Supported devices are:
+    Belkin F5U011
+    Belkin F5U111
+    CATC NetMate
+    CATC NetMate II
+    smartBridges smartNIC
+
+  This driver makes the adapter appear as a normal Ethernet interface,
+  typically on eth0, if it is the only ethernet device, or perhaps on
+  eth1, if you have a PCI or ISA ethernet card installed.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called catc.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB ASIX AX88172 based ethernet device support
+CONFIG_USB_AX8817X
+  Say Y if you want to use one of the following 10/100 USB2 Ethernet
+  devices based on the ASIX AX88172 chip.  Supported devices are:
+    Linksys USB200M
+    Netgear FA120
+    D-Link DUB-E100
+    Hawking UF200
+
+  This driver makes the adapter appear as a normal Ethernet interface,
+  typically on eth0, if it is the only ethernet device, or perhaps on
+  eth1, if you have a PCI or ISA ethernet card installed.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ax8817x.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB Kodak DC-2xx Camera support
+CONFIG_USB_DC2XX
+  Say Y here if you want to connect this type of still camera to your
+  computer's USB port.  See <file:Documentation/usb/dc2xx.txt> for
+  more information; some non-Kodak cameras may also work with this
+  driver, given application support (such as <http://www.gphoto.org/>).
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called dc2xx.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB Mustek MDC800 Digital Camera support
+CONFIG_USB_MDC800
+  Say Y here if you want to connect this type of still camera to
+  your computer's USB port. This driver can be used with gphoto 0.4.3
+  and higher (look at <http://www.gphoto.org/>).
+  To use it create a device node with "mknod /dev/mustek c 180 32" and
+  configure it in your software.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called mdc800.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB Mass Storage support
+CONFIG_USB_STORAGE
+  Say Y here if you want to connect USB mass storage devices to your
+  computer's USB port.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called usb-storage.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+USB Mass Storage verbose debug
+CONFIG_USB_STORAGE_DEBUG
+  Say Y here in order to have the USB Mass Storage code generate
+  verbose debugging messages.
+
+ISD-200 USB/ATA Bridge support
+CONFIG_USB_STORAGE_ISD200
+  Say Y here if you want to use USB Mass Store devices based
+  on the In-Systems Design ISD-200 USB/ATA bridge.
+
+  Some of the products that use this chip are:
+
+    - Archos Jukebox 6000
+    - ISD SmartCable for Storage
+    - Taiwan Skymaster CD530U/DEL-0241 IDE bridge
+    - Sony CRX10U CD-R/RW drive
+    - CyQ've CQ8060A CDRW drive
+    - Planex eXtreme Drive RX-25HU USB-IDE cable (not model RX-25U)
+
+USS720 parport driver
+CONFIG_USB_USS720
+  This driver is for USB parallel port adapters that use the Lucent
+  Technologies USS-720 chip. These cables are plugged into your USB
+  port and provide USB compatibility to peripherals designed with
+  parallel port interfaces.
+
+  The chip has two modes: automatic mode and manual mode. In automatic
+  mode, it looks to the computer like a standard USB printer. Only
+  printers may be connected to the USS-720 in this mode. The generic
+  USB printer driver ("USB Printer support", above) may be used in
+  that mode, and you can say N here if you want to use the chip only
+  in this mode.
+
+  Manual mode is not limited to printers, any parallel port
+  device should work. This driver utilizes manual mode.
+  Note however that some operations are three orders of magnitude
+  slower than on a PCI/ISA Parallel Port, so timing critical
+  applications might not work.
+
+  Say Y here if you own an USS-720 USB->Parport cable and intend to
+  connect anything other than a printer to it.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called uss720.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+USB device file system
+CONFIG_USB_DEVICEFS
+  If you say Y here (and to "/proc file system support" in the "File
+  systems section, above), you will get a file /proc/bus/usb/devices
+  which lists the devices currently connected to your USB bus or
+  busses, a file /proc/bus/usb/drivers which lists the USB kernel
+  client drivers currently loaded, and for every connected device a
+  file named  "/proc/bus/usb/xxx/yyy", where xxx is the bus number and
+  yyy the device number; the latter files can be used by user space
+  programs to talk directly to the device. These files are "virtual",
+  meaning they are generated on the fly and not stored on the hard
+  drive.
+
+  You may need to mount the usbdevfs file system to see the files, use
+   mount -t usbdevfs none /proc/bus/usb
+
+  For the format of the various /proc/bus/usb/ files, please read
+  <file:Documentation/usb/proc_usb_info.txt>.
+
+  Please note that this code is completely unrelated to devfs, the
+  "/dev file system support".
+
+  Most users want to say Y here.
+
+Enforce USB bandwidth allocation
+CONFIG_USB_BANDWIDTH
+  If you say Y here, the USB subsystem enforces USB bandwidth
+  allocation and will prevent some device opens from succeeding
+  if they would cause USB bandwidth usage to go above 90% of
+  the bus bandwidth.
+
+  If you say N here, these conditions will cause warning messages
+  about USB bandwidth usage to be logged and some devices or
+  drivers may not work correctly.
+
+DABUSB driver
+CONFIG_USB_DABUSB
+  A Digital Audio Broadcasting (DAB) Receiver for USB and Linux
+  brought to you by the DAB-Team (<http://dab.in.tum.de/>).  This
+  driver can be taken as an example for URB-based bulk, control, and
+  isochronous transactions. URB's are explained in
+  <file:Documentation/usb/URB.txt>.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called dabusb.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Host-to-Host USB networking
+CONFIG_USB_USBNET
+  This driver supports network links over USB with USB "Network"
+  or "data transfer" cables, often used to network laptops to PCs.
+  Such cables have chips from suppliers such as Belkin/eTEK, GeneSys
+  (GeneLink), NetChip and Prolific. Intelligent USB devices could also
+  use this approach to provide Internet access, using standard USB
+  cabling. You can find these chips also on some motherboards with
+  USB PC2PC support.
+
+  These links will have names like "usb0", "usb1", etc.  They act
+  like two-node Ethernets, so you can use 802.1d Ethernet Bridging
+  (CONFIG_BRIDGE) to simplify your network routing.
+
+  This code is also available as a kernel module (code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called usbnet.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Freecom USB/ATAPI Bridge support
+CONFIG_USB_STORAGE_FREECOM
+  Support for the Freecom USB to IDE/ATAPI adaptor.
+  Freecom has a web page at <http://www.freecom.de/>.
+
+Microtech CompactFlash/SmartMedia reader
+CONFIG_USB_STORAGE_DPCM
+  Say Y here to support the Microtech ZiO! CompactFlash/SmartMedia
+  reader, details at <http://www.microtechint.com/zio/index.html>.
+  This driver treats the flash card as a removable storage device.
+
+SanDisk SDDR-09 (and other SmartMedia) support
+CONFIG_USB_STORAGE_SDDR09
+  Say Y here to include additional code to support the Sandisk SDDR-09
+  SmartMedia reader in the USB Mass Storage driver.
+
+SanDisk SDDR-55 SmartMedia support
+CONFIG_USB_STORAGE_SDDR55
+  Say Y here to include additional code to support the Sandisk SDDR-55
+  SmartMedia reader in the USB Mass Storage driver.
+
+USB Diamond Rio500 support
+CONFIG_USB_RIO500
+  Say Y here if you want to connect a USB Rio500 mp3 player to your
+  computer's USB port. Please read <file:Documentation/usb/rio.txt>
+  for more information.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called rio500.o. If you want to compile it as
+  a module, say M here and read <file:Documenatation/modules.txt>.
+
+Auerswald device support
+CONFIG_USB_AUERSWALD
+  Say Y here if you want to connect an Auerswald USB ISDN Device
+  to your computer's USB port.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called auerswald.o. If you want to compile it as
+  a module, say M here and read <file:Documenatation/modules.txt>
+
+USB Auerswald ISDN modem support
+CONFIG_USB_AUERISDN
+  Say Y here if you want to enable the ISDN modem option
+  of your Auerswald ISDN devices. 
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called auerswald.o. If you want to compile it as
+  a module, say M here and read <file:Documenatation/modules.txt>
+
+CONFIG_USB_TIGL
+  If you own a Texas Instruments graphing calculator and use a
+  TI-GRAPH LINK USB cable (aka SilverLink), then you might be 
+  interested in this driver.
+
+  If you enable this driver, you will be able to communicate with
+  your calculator through a set of device nodes under /dev.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called tiglusb.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt.
+
+  If you don't know what the SilverLink cable is or what a Texas
+  Instruments graphing calculator is, then you probably don't need this
+  driver.
+
+  If unsure, say N.
+
+Texas Instruments parallel link cable support
+CONFIG_TIPAR
+  If you own a Texas Instruments graphing calculator and use a
+  parallel link cable, then you might be interested in this driver.
+
+  If you enable this driver, you will be able to communicate with
+  your calculator through a set of device nodes under /dev. The
+  main advantage of this driver is that you don't have to be root
+  to use this precise link cable (depending on the permissions on
+  the device nodes, though).
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called tipar.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>
+
+  If you don't know what a parallel link cable is or what a Texas
+  Instruments graphing calculator is, then you probably don't need this
+  driver.
+
+  If unsure, say N.
+
+Tieman Voyager USB Braille display support
+CONFIG_USB_BRLVOYAGER
+  Say Y here if you want to use the Voyager USB Braille display from
+  Tieman. See <file:Documentation/usb/brlvger.txt> for more
+  information.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called brlvger.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+USBLCD support
+CONFIG_USB_LCD
+  Say Y here if you want to connect an USBLCD to your computer's
+  USB port. The USBLCD is a small USB interface board for
+  alphanumeric LCD modules. See <http://www.usblcd.de> for more
+  information.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called usblcd.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+D-Link DSB-R100 FM radio support
+CONFIG_USB_DSBR
+  Say Y here if you want to connect this type of radio to your
+  computer's USB port. Note that the audio is not digital, and
+  you must connect the line out connector to a sound card or a
+  set of speakers.
+
+  This driver uses the Video For Linux API.  You must enable
+  (Y or M in config) Video For Linux (under Character Devices)
+  to use this driver.  Information on this API and pointers to
+  "v4l" programs may be found on the WWW at
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called dsbr100.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Alcatel Speedtouch USB support
+CONFIG_USB_SPEEDTOUCH
+  Say Y here if you have an Alcatel SpeedTouch USB or SpeedTouch 330
+  modem.  In order to use your modem you will need to install some user
+  space tools, see <http://www.linux-usb.org/SpeedTouch/> for details.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called speedtch.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+Always do synchronous disk IO for UBD
+CONFIG_BLK_DEV_UBD_SYNC
+  The User-Mode Linux port includes a driver called UBD which will let
+  you access arbitrary files on the host computer as block devices.
+  Writes to such a block device are not immediately written to the
+  host's disk; this may cause problems if, for example, the User-Mode
+  Linux 'Virtual Machine' uses a journalling file system and the host
+  computer crashes.
+
+  Synchronous operation (i.e. always writing data to the host's disk
+  immediately) is configurable on a per-UBD basis by using a special
+  kernel command line option.  Alternatively, you can say Y here to
+  turn on synchronous operation by default for all block.
+
+  If you're running a journalling file system (like reiserfs, for
+  example) in your virtual machine, you will want to say Y here.  If
+  you care for the safety of the data in your virtual machine, Y is a
+  wise choice too.  In all other cases (for example, if you're just
+  playing around with User-Mode Linux) you can choose N.
+
+Enable ptrace proxy
+CONFIG_PT_PROXY
+  This option enables a debugging interface which allows gdb to debug
+  the kernel without needing to actually attach to kernel threads.
+  If you want to do kernel debugging, say Y here; otherwise say N.
+
+Management console
+CONFIG_MCONSOLE
+  The user mode linux management console is a low-level interface to
+  the kernel, somewhat like the i386 SysRq interface.  Since there is
+  a full-blown operating system running under every user mode linux
+  instance, there is much greater flexibility possible than with the
+  SysRq mechanism.
+
+  If you answer 'Y' to this option, to use this feature, you need the
+  mconsole client (called uml_mconsole) which is present in CVS in
+  2.4.5-9um and later (path /tools/mconsole), and is also in the
+  distribution RPM package in 2.4.6 and later.
+
+  It is safe to say 'Y' here.
+
+Enable kernel debugging symbols
+CONFIG_DEBUGSYM
+  When this is enabled, the User-Mode Linux binary will include
+  debugging symbols.  This enlarges the binary by a few megabytes,
+  but aids in tracking down kernel problems in UML.  It is required
+  if you intend to do any kernel development.
+
+  If you're truly short on disk space or don't expect to report any
+  bugs back to the UML developers, say N, otherwise say Y.
+
+Enable gcov support
+CONFIG_GCOV
+  This option allows developers to retrieve coverage data from a UML
+  session.
+
+  See <http://user-mode-linux.sourceforge.net/gcov.html> for more
+  details.
+
+  If you're involved in UML kernel development and want to use gcov,
+  say Y.  If you're unsure, say N.
+
+Enable gprof support
+CONFIG_GPROF
+  This allows profiling of a User-Mode Linux kernel with the gprof
+  utility.
+
+  See <http://user-mode-linux.sourceforge.net/gprof.html> for more
+  details.
+
+  If you're involved in UML kernel development and want to use gprof,
+  say Y.  If you're unsure, say N.
+
+Host filesystem
+CONFIG_HOSTFS
+  While the User-Mode Linux port uses its own root file system for
+  booting and normal file access, this module lets the UML user
+  access files stored on the host.  It does not require any
+  network connection between the Host and UML.  An example use of
+  this might be:
+
+  mount none /tmp/fromhost -t hostfs -o /tmp/umlshare
+
+  where /tmp/fromhost is an empty directory inside UML and
+  /tmp/umlshare is a directory on the host with files the UML user
+  wishes to access.
+
+  For more information, see
+  <http://user-mode-linux.sourceforge.net/hostfs.html>.
+
+  If you'd like to be able to work with files stored on the host, 
+  say Y or M here; otherwise say N.
+
+Example IO Memory driver
+CONFIG_MMAPPER
+  The User-Mode Linux port can provide support for IO Memory
+  emulation with this option.  This allows a host file to be
+  specified as an I/O region on the kernel command line. That file
+  will be mapped into UML's kernel address space where a driver can
+  locate it and do whatever it wants with the memory, including
+  providing an interface to it for UML processes to use.
+
+  For more information, see
+  <http://user-mode-linux.sourceforge.net/iomem.html>.
+
+  If you'd like to be able to provide a simulated IO port space for
+  User-Mode Linux processes, say Y.  If unsure, say N.
+
+Virtual Serial Line
+CONFIG_SSL
+  The User-Mode Linux environment allows you to create virtual serial
+  lines on the UML that are usually made to show up on the host as
+  ttys or ptys.
+
+  See <http://user-mode-linux.sourceforge.net/input.html> for more
+  information and command line examples of how to use this facility.
+
+  Unless you have a specific reason for disabling this, say Y.
+
+Virtual network device
+CONFIG_UML_NET
+  While the User-Mode port cannot directly talk to any physical
+  hardware devices, this choice and the following transport options
+  provide one or more virtual network devices through which the UML
+  kernels can talk to each other, the host, and with the host's help,
+  machines on the outside world.
+
+  For more information, including explanations of the networking and
+  sample configurations, see
+  <http://user-mode-linux.sourceforge.net/networking.html>.
+
+  If you'd like to be able to enable networking in the User-Mode
+  linux environment, say Y; otherwise say N.  Note that you must
+  enable at least one of the following transport options to actually
+  make use of UML networking.
+
+Daemon transport
+CONFIG_UML_NET_DAEMON
+  This User-Mode Linux network transport allows one or more running
+  UMLs on a single host to communicate with each other, but not to
+  the host.
+
+  To use this form of networking, you'll need to run the UML
+  networking daemon on the host.
+
+  For more information, see
+  <http://user-mode-linux.sourceforge.net/networking.html>  That site
+  has examples of the UML command line to use to enable Daemon
+  networking.
+
+  If you'd like to set up a network with other UMLs on a single host,
+  say Y.  If you need a network between UMLs on multiple physical
+  hosts, choose the Multicast Transport.  To set up a network with
+  the host and/or other IP machines, say Y to the Ethertap or Slip
+  transports.  You'll need at least one of them, but may choose
+  more than one without conflict.  If you don't need UML networking,
+  say N.
+
+Ethertap transport
+CONFIG_UML_NET_ETHERTAP
+  The Ethertap User-Mode Linux network transport allows a single
+  running UML to exchange packets with its host over one of the
+  host's Ethertap devices, such as /dev/tap0.  Additional running
+  UMLs can use additional Ethertap devices, one per running UML.
+  While the UML believes it's on a (multi-device, broadcast) virtual
+  Ethernet network, it's in fact communicating over a point-to-point
+  link with the host.
+
+  To use this, your host kernel must have support for Ethertap
+  devices.  Also, if your host kernel is 2.4.x, it must have 
+  CONFIG_NETLINK_DEV configured as Y or M.
+
+  For more information, see
+  <http://user-mode-linux.sourceforge.net/networking.html>  That site
+  has examples of the UML command line to use to enable Ethertap
+  networking.
+
+  If you'd like to set up an IP network with the host and/or the
+  outside world, say Y to this, the Daemon Transport and/or the 
+  Slip Transport.  You'll need at least one of them, but may choose
+  more than one without conflict.  If you don't need UML networking,
+  say N.
+
+TUN/TAP transport
+CONFIG_UML_NET_TUNTAP
+  The UML TUN/TAP network transport allows a UML instance to exchange
+  packets with the host over a TUN/TAP device.  This option will only
+  work with a 2.4 host, unless you've applied the TUN/TAP patch to
+  your 2.2 host kernel.
+
+  To use this transport, your host kernel must have support for TUN/TAP
+  devices, either built-in or as a module.
+
+Multicast transport
+CONFIG_UML_NET_MCAST
+  This Multicast User-Mode Linux network transport allows multiple
+  UMLs (even ones running on different host machines!) to talk to
+  each other over a virtual ethernet network.  However, it requires
+  at least one UML with one of the other transports to act as a
+  bridge if any of them need to be able to talk to their hosts or any
+  other IP machines.
+
+  To use this, your host kernel(s) must support IP Multicasting.
+
+  For more information, see
+  <http://user-mode-linux.sourceforge.net/networking.html>  That site
+  has examples of the UML command line to use to enable Multicast
+  networking, and notes about the security of this approach.
+
+  If you need UMLs on multiple physical hosts to communicate as if
+  they shared an Ethernet network, say Y.  If you need to communicate
+  with other IP machines, make sure you select one of the other
+  transports (possibly in addition to Multicast; they're not
+  exclusive).  If you don't need to network UMLs say N to each of
+  the transports.
+
+SLIP transport
+CONFIG_UML_NET_SLIP
+  The Slip User-Mode Linux network transport allows a running UML to
+  network with its host over a point-to-point link.  Unlike Ethertap,
+  which can carry any Ethernet frame (and hence even non-IP packets),
+  the Slip transport can only carry IP packets.
+
+  To use this, your host must support Slip devices.
+
+  For more information, see
+  <http://user-mode-linux.sourceforge.net/networking.html>.  That site
+  has examples of the UML command line to use to enable Slip
+  networking, and details of a few quirks with it.
+
+  The Ethertap Transport is preferred over Slip because of its
+  limitation.  If you prefer Slip, however, say Y here.  Otherwise
+  choose the Multicast transport (to network multiple UMLs on 
+  multiple hosts), Ethertap (to network with the host and the
+  outside world), and/or the Daemon transport (to network multiple
+  UMLs on a single host).  You may choose more than one without
+  conflict.  If you don't need UML networking, say N.
+
+Microtek USB scanner support
+CONFIG_USB_MICROTEK
+  Say Y here if you want support for the Microtek X6USB and
+  possibly the Phantom 336CX, Phantom C6 and ScanMaker V6U(S)L.
+  Support for anything but the X6 is experimental.
+  Please report failures and successes.
+  The scanner will appear as a scsi generic device to the rest
+  of the system. Scsi support is required for this driver to compile
+  and work. SANE 1.0.4 or newer is needed to make use of your scanner.
+  This driver can be compiled as a module.
+
+HP53xx and Minolta Dual Scanner support
+CONFIG_USB_HPUSBSCSI
+  Say Y here if you want support for the HP 53xx series of scanners
+  and the Minolta Scan Dual. This driver is experimental.
+  The scanner will be accessible as a SCSI device.
+
+USB Bluetooth support
+CONFIG_USB_BLUETOOTH
+  Say Y here if you want to connect a USB Bluetooth device to your
+  computer's USB port. You will need the Bluetooth stack (available
+  at <http://developer.axis.com/software>) to fully use the device.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called bluetooth.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+USB MIDI support
+CONFIG_USB_MIDI
+  Say Y here if you want to connect a USB MIDI device to your
+  computer's USB port. This driver is for devices that comply with
+  'Universal Serial Bus Device Class Definition for MIDI Device'.
+
+  The following devices are known to work:
+    * Steinberg USB2MIDI
+    * Roland MPU64
+    * Roland PC-300
+    * Roland SC8850
+    * Roland UM-1
+    * Roland UM-2
+    * Roland UA-100
+    * Yamaha MU1000
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called usb-midi.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Minix fs support
+CONFIG_MINIX_FS
+  Minix is a simple operating system used in many classes about OS's.
+  The minix file system (method to organize files on a hard disk
+  partition or a floppy disk) was the original file system for Linux,
+  but has been superseded by the second extended file system ext2fs.
+  You don't want to use the minix file system on your hard disk
+  because of certain built-in restrictions, but it is sometimes found
+  on older Linux floppy disks.  This option will enlarge your kernel
+  by about 28 KB. If unsure, say N.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>. The module
+  will be called minix.o.  Note that the file system of your root
+  partition (the one containing the directory /) cannot be compiled as
+  a module.
+
+Reiserfs support
+CONFIG_REISERFS_FS
+  Stores not just filenames but the files themselves in a balanced
+  tree.  Uses journalling.
+
+  Balanced trees are more efficient than traditional file system
+  architectural foundations.
+
+  In general, ReiserFS is as fast as ext2, but is very efficient with
+  large directories and small files.  Additional patches are needed
+  for NFS and quotas, please see <http://www.reiserfs.org/> for links.
+
+  It is more easily extended to have features currently found in
+  database and keyword search systems than block allocation based file
+  systems are.  The next version will be so extended, and will support
+  plugins consistent with our motto ``It takes more than a license to
+  make source code open.''
+
+  Read <http://www.reiserfs.org/> to learn more about reiserfs.
+
+  Sponsored by Threshold Networks, Emusic.com, and Bigstorage.com.
+
+  If you like it, you can pay us to add new features to it that you
+  need, buy a support contract, or pay us to port it to another OS.
+
+Enable extra Reiserfs consistency checks
+CONFIG_REISERFS_CHECK
+  If you set this to Y, then ReiserFS will perform every check it can
+  possibly imagine of its internal consistency throughout its
+  operation.  It will also go substantially slower.  More than once we
+  have forgotten that this was on, and then gone despondent over the
+  latest benchmarks.:-) Use of this option allows our team to go all
+  out in checking for consistency when debugging without fear of its
+  effect on end users.  If you are on the verge of sending in a bug
+  report, say Y and you might get a useful error message.  Almost
+  everyone should say N.
+
+Publish some reiserfs-specific info under /proc/fs/reiserfs
+CONFIG_REISERFS_PROC_INFO
+  Create under /proc/fs/reiserfs a hierarchy of files, displaying
+  various ReiserFS statistics and internal data at the expense of making
+  your kernel or module slightly larger (+8 KB). This also increases the
+  amount of kernel memory required for each mount by 440 bytes.
+  It isn't useful to average persons, and you probably can't measure the
+  performance cost of it.  If you are fine-tuning reiserfs, say Y,
+  otherwise say N.
+
+Second extended fs support
+CONFIG_EXT2_FS
+  This is the de facto standard Linux file system (method to organize
+  files on a storage device) for hard disks.
+
+  You want to say Y here, unless you intend to use Linux exclusively
+  from inside a DOS partition using the UMSDOS file system. The
+  advantage of the latter is that you can get away without
+  repartitioning your hard drive (which often implies backing
+  everything up and restoring afterwards); the disadvantage is that
+  Linux becomes susceptible to DOS viruses and that UMSDOS is somewhat
+  slower than ext2fs. Even if you want to run Linux in this fashion,
+  it might be a good idea to have ext2fs around: it enables you to
+  read more floppy disks and facilitates the transition to a *real*
+  Linux partition later. Another (rare) case which doesn't require
+  ext2fs is a diskless Linux box which mounts all files over the
+  network using NFS (in this case it's sufficient to say Y to "NFS
+  file system support" below). Saying Y here will enlarge your kernel
+  by about 44 KB.
+
+  The Ext2fs-Undeletion mini-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>, gives information about
+  how to retrieve deleted files on ext2fs file systems.
+
+  To change the behaviour of ext2 file systems, you can use the tune2fs
+  utility ("man tune2fs"). To modify attributes of files and
+  directories on ext2 file systems, use chattr ("man chattr").
+
+  Ext2fs partitions can be read from within DOS using the ext2tool
+  command line tool package (available from
+  <ftp://ibiblio.org/pub/Linux/system/filesystems/ext2/>) and from
+  within Windows NT using the ext2nt command line tool package from
+  <ftp://ibiblio.org/pub/Linux/utils/dos/>.  Explore2fs is a
+  graphical explorer for ext2fs partitions which runs on Windows 95
+  and Windows NT and includes experimental write support; it is
+  available from
+  <http://jnewbigin-pc.it.swin.edu.au/Linux/Explore2fs.htm>.
+
+  If you want to compile this file system as a module ( = code which
+  can be inserted in and removed from the running kernel whenever you
+  want), say M here and read <file:Documentation/modules.txt>.  The
+  module will be called ext2.o.  Be aware however that the file system
+  of your root partition (the one containing the directory /) cannot
+  be compiled as a module, and so this could be dangerous.  Most
+  everyone wants to say Y here.
+
+Ext3 journalling file system support (EXPERIMENTAL)
+CONFIG_EXT3_FS
+  This is the journalling version of the Second extended file system
+  (often called ext3), the de facto standard Linux file system
+  (method to organize files on a storage device) for hard disks.
+
+  The journalling code included in this driver means you do not have
+  to run e2fsck (file system checker) on your file systems after a
+  crash.  The journal keeps track of any changes that were being made
+  at the time the system crashed, and can ensure that your file system
+  is consistent without the need for a lengthy check.
+
+  Other than adding the journal to the file system, the on-disk format
+  of ext3 is identical to ext2.  It is possible to freely switch
+  between using the ext3 driver and the ext2 driver, as long as the
+  file system has been cleanly unmounted, or e2fsck is run on the file
+  system.
+
+  To add a journal on an existing ext2 file system or change the
+  behaviour of ext3 file systems, you can use the tune2fs utility ("man
+  tune2fs").  To modify attributes of files and directories on ext3
+  file systems, use chattr ("man chattr").  You need to be using
+  e2fsprogs version 1.20 or later in order to create ext3 journals
+  (available at <http://sourceforge.net/projects/e2fsprogs/>).
+
+  If you want to compile this file system as a module ( = code which
+  can be inserted in and removed from the running kernel whenever you
+  want), say M here and read <file:Documentation/modules.txt>.  The
+  module will be called ext3.o.  Be aware however that the file system
+  of your root partition (the one containing the directory /) cannot
+  be compiled as a module, and so this may be dangerous.
+
+Journal Block Device support (JBD for ext3) (EXPERIMENTAL)
+CONFIG_JBD
+  This is a generic journalling layer for block devices.  It is
+  currently used by the ext3 file system, but it could also be used to
+  add journal support to other file systems or block devices such as
+  RAID or LVM.
+
+  If you are using the ext3 file system, you need to say Y here. If
+  you are not using ext3 then you will probably want to say N.
+
+  If you want to compile this device as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called jbd.o.  If you are compiling ext3 into the kernel,
+  you cannot compile this code as a module.
+
+JBD (ext3) debugging support
+CONFIG_JBD_DEBUG
+  If you are using the ext3 journalling file system (or potentially any
+  other file system/device using JBD), this option allows you to
+  enable debugging output while the system is running, in order to
+  help track down any problems you are having.  By default the
+  debugging output will be turned off.
+
+  If you select Y here, then you will be able to turn on debugging
+  with "echo N > /proc/sys/fs/jbd-debug", where N is a number between
+  1 and 5, the higher the number, the more debugging output is
+  generated.  To turn debugging off again, do
+  "echo 0 > /proc/sys/fs/jbd-debug".
+
+Buffer Head tracing (DEBUG)
+CONFIG_BUFFER_DEBUG
+  If you are a kernel developer working with file systems or in the
+  block device layer, this buffer head tracing may help you to track
+  down bugs in your code.  This enables some debugging macros
+  (BUFFER_TRACE, etc.) which allow you to track the state of a buffer
+  through various layers of code.  The debugging code is used
+  primarily by ext3 and JBD code.
+
+  Because this option adds considerably to the size of each buffer,
+  most people will want to say N here.
+
+BeOS filesystem support (BeFS) (read only)
+CONFIG_BEFS_FS
+  The BeOS File System (BeFS) is the native file system of Be, Inc's
+  BeOS. Notable features include support for arbitrary attributes
+  on files and directories, and database-like indices on selected
+  attributes. (Also note that this driver doesn't make those features
+  available at this time). It is a 64 bit filesystem, so it supports
+  extremely large volumes and files.
+
+  If you use this filesystem, you should also say Y to at least one
+  of the NLS (native language support) options below.
+
+  If you don't know what this is about, say N.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read Documentation/modules.txt. The module will be
+  called befs.o.
+
+Debug BeFS
+CONFIG_BEFS_DEBUG
+  If you say Y here, you can use the 'debug' mount option to enable
+  debugging output from the driver. This is unlike previous versions
+  of the driver, where enabling this option would turn on debugging
+  output automatically.
+
+  Example:
+  mount -t befs /dev/hda2 /mnt -o debug
+
+BFS file system support
+CONFIG_BFS_FS
+  Boot File System (BFS) is a file system used under SCO UnixWare to
+  allow the bootloader access to the kernel image and other important
+  files during the boot process.  It is usually mounted under /stand
+  and corresponds to the slice marked as "STAND" in the UnixWare
+  partition.  You should say Y if you want to read or write the files
+  on your /stand slice from within Linux.  You then also need to say Y
+  to "UnixWare slices support", below.  More information about the BFS
+  file system is contained in the file
+  <file:Documentation/filesystems/bfs.txt>.
+
+  If you don't know what this is about, say N.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called bfs.o.  Note that the file system of your root
+  partition (the one containing the directory /) cannot be compiled as
+  a module.
+
+Compressed ROM file system support
+CONFIG_CRAMFS
+  Saying Y here includes support for CramFs (Compressed ROM File
+  System).  CramFs is designed to be a simple, small, and compressed
+  file system for ROM based embedded systems.  CramFs is read-only,
+  limited to 256MB file systems (with 16MB files), and doesn't support
+  16/32 bits uid/gid, hard links and timestamps.
+
+  See <file:Documentation/filesystems/cramfs.txt> and
+  <file:fs/cramfs/README> for further information.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called cramfs.o.  Note that the root file system (the one
+  containing the directory /) cannot be compiled as a module.
+
+  If unsure, say N.
+
+CMS file system support
+CONFIG_CMS_FS
+  Read only support for CMS minidisk file systems found on IBM
+  mainframe systems.  Only the basic format is supported so far.  If
+  you don't know what CMS is you probably don't want to know any more.
+
+# When the 2.5 version of configure.help goes away, the part of this that 
+# duplicates Documentation/filesystems/tmpfs.txt can drop out.
+Virtual memory file system support
+CONFIG_TMPFS
+  Tmpfs is a file system which keeps all files in virtual memory.
+  Everything in tmpfs is temporary in the sense that no files will be
+  created on your hard drive. If you reboot, everything in tmpfs will
+  be lost.
+
+  In contrast to RAM disks, which get allocated a fixed amount of
+  physical RAM, tmpfs grows and shrinks to accommodate the files it
+  contains and is able to swap unneeded pages out to swap space.
+
+  Everything is "virtual" in the sense that no files will be created
+  on your hard drive; if you reboot, everything in tmpfs will be
+  lost.
+
+  You should mount the file system somewhere to be able to use
+  POSIX shared memory. Adding the following line to /etc/fstab should
+  take care of things:
+
+  tmpfs                /dev/shm        tmpfs           defaults        0 0
+
+  Remember to create the directory that you intend to mount tmpfs on
+  if necessary (/dev/shm is automagically created if you use devfs).
+
+  You can set limits for the number of blocks and inodes used by the
+  file system with the mount options "size", "nr_blocks" and
+  "nr_inodes". These parameters accept a suffix k, m or g for kilo,
+  mega and giga and can be changed on remount.
+
+  The initial permissions of the root directory can be set with the
+  mount option "mode".
+
+  See <file:Documentation/filesystems/tmpfs.txt> for details.
+
+Simple RAM-based file system support
+CONFIG_RAMFS
+  Ramfs is a file system which keeps all files in RAM. It allows
+  read and write access.
+
+  It is more of an programming example than a usable file system.  If
+  you need a file system which lives in RAM with limit checking use
+  tmpfs.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ramfs.o.
+
+ISO 9660 CD-ROM file system support
+CONFIG_ISO9660_FS
+  This is the standard file system used on CD-ROMs.  It was previously
+  known as "High Sierra File System" and is called "hsfs" on other
+  Unix systems.  The so-called Rock-Ridge extensions which allow for
+  long Unix filenames and symbolic links are also supported by this
+  driver.  If you have a CD-ROM drive and want to do more with it than
+  just listen to audio CDs and watch its LEDs, say Y (and read
+  <file:Documentation/filesystems/isofs.txt> and the CD-ROM-HOWTO,
+  available from <http://www.tldp.org/docs.html#howto>), thereby
+  enlarging your kernel by about 27 KB; otherwise say N.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called isofs.o.
+
+Microsoft Joliet CD-ROM extensions
+CONFIG_JOLIET
+  Joliet is a Microsoft extension for the ISO 9660 CD-ROM file system
+  which allows for long filenames in unicode format (unicode is the
+  new 16 bit character code, successor to ASCII, which encodes the
+  characters of almost all languages of the world; see
+  <http://www.unicode.org/> for more information).  Say Y here if you
+  want to be able to read Joliet CD-ROMs under Linux.
+
+Transparent decompression extension
+CONFIG_ZISOFS
+  This is a Linux-specific extension to RockRidge which lets you store
+  data in compressed form on a CD-ROM and have it transparently
+  decompressed when the CD-ROM is accessed.  See
+  <http://www.kernel.org/pub/linux/utils/fs/zisofs/> for the tools
+  necessary to create such a filesystem.  Say Y here if you want to be
+  able to read such compressed CD-ROMs.
+
+UDF file system support (read-only)
+CONFIG_UDF_FS
+  This is the new file system used on some CD-ROMs and DVDs. Say Y if
+  you intend to mount DVD discs or CDRW's written in packet mode, or
+  if written to by other UDF utilities, such as DirectCD. This UDF
+  file system support is read-only. If you want to write to UDF
+  file systems on some media, you need to say Y to "UDF read-write
+  support" below in addition. Please read
+  <file:Documentation/filesystems/udf.txt>.
+
+  This file system support is also available as a module ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). The module is called udf.o. If you want to
+  compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+  If unsure, say N.
+
+UDF write support (DANGEROUS)
+CONFIG_UDF_RW
+  Say Y if you want to test write support for UDF file systems.
+  Due to lack of support for writing to CDR/CDRW's, this option
+  is only supported for hard discs, DVD-RAM, and loopback files.
+
+DOS FAT fs support
+CONFIG_FAT_FS
+  If you want to use one of the FAT-based file systems (the MS-DOS,
+  VFAT (Windows 95) and UMSDOS (used to run Linux on top of an
+  ordinary DOS partition) file systems), then you must say Y or M here
+  to include FAT support. You will then be able to mount partitions or
+  diskettes with FAT-based file systems and transparently access the
+  files on them, i.e. MSDOS files will look and behave just like all
+  other Unix files.
+
+  This FAT support is not a file system in itself, it only provides
+  the foundation for the other file systems. You will have to say Y or
+  M to at least one of "MSDOS fs support" or "VFAT fs support" in
+  order to make use of it.
+
+  Another way to read and write MSDOS floppies and hard drive
+  partitions from within Linux (but not transparently) is with the
+  mtools ("man mtools") program suite. You don't need to say Y here in
+  order to do that.
+
+  If you need to move large files on floppies between a DOS and a
+  Linux box, say Y here, mount the floppy under Linux with an MSDOS
+  file system and use GNU tar's M option. GNU tar is a program
+  available for Unix and DOS ("man tar" or "info tar").
+
+  It is now also becoming possible to read and write compressed FAT
+  file systems; read <file:Documentation/filesystems/fat_cvf.txt> for
+  details.
+
+  The FAT support will enlarge your kernel by about 37 KB. If unsure,
+  say Y.
+
+  If you want to compile this as a module however ( = code which can
+  be inserted in and removed from the running kernel whenever you
+  want), say M here and read <file:Documentation/modules.txt>.  The
+  module will be called fat.o.  Note that if you compile the FAT
+  support as a module, you cannot compile any of the FAT-based file
+  systems into the kernel -- they will have to be modules as well.
+  The file system of your root partition (the one containing the
+  directory /) cannot be a module, so don't say M here if you intend
+  to use UMSDOS as your root file system.
+
+MSDOS fs support
+CONFIG_MSDOS_FS
+  This allows you to mount MSDOS partitions of your hard drive (unless
+  they are compressed; to access compressed MSDOS partitions under
+  Linux, you can either use the DOS emulator DOSEMU, described in the
+  DOSEMU-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>, or try dmsdosfs in
+  <ftp://ibiblio.org/pub/Linux/system/filesystems/dosfs/>. If you
+  intend to use dosemu with a non-compressed MSDOS partition, say Y
+  here) and MSDOS floppies. This means that file access becomes
+  transparent, i.e. the MSDOS files look and behave just like all
+  other Unix files.
+
+  If you want to use UMSDOS, the Unix-like file system on top of a
+  DOS file system, which allows you to run Linux from within a DOS
+  partition without repartitioning, you'll have to say Y or M here.
+
+  If you have Windows 95 or Windows NT installed on your MSDOS
+  partitions, you should use the VFAT file system (say Y to "VFAT fs
+  support" below), or you will not be able to see the long filenames
+  generated by Windows 95 / Windows NT.
+
+  This option will enlarge your kernel by about 7 KB. If unsure,
+  answer Y. This will only work if you said Y to "DOS FAT fs support"
+  as well. If you want to compile this as a module however ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want), say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called msdos.o.
+
+VFAT (Windows-95) fs support
+CONFIG_VFAT_FS
+  This option provides support for normal Windows file systems with
+  long filenames.  That includes non-compressed FAT-based file systems
+  used by Windows 95, Windows 98, Windows NT 4.0, and the Unix
+  programs from the mtools package.
+
+  You cannot use the VFAT file system for your Linux root partition
+  (the one containing the directory /); use UMSDOS instead if you
+  want to run Linux from within a DOS partition (i.e. say Y to
+  "Unix like fs on top of std MSDOS fs", below).
+
+  The VFAT support enlarges your kernel by about 10 KB and it only
+  works if you said Y to the "DOS FAT fs support" above.  Please read
+  the file <file:Documentation/filesystems/vfat.txt> for details.  If
+  unsure, say Y.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called vfat.o.
+
+Unix-like file system on top of standard MSDOS fs
+CONFIG_UMSDOS_FS
+  Say Y here if you want to run Linux from within an existing DOS
+  partition of your hard drive. The advantage of this is that you can
+  get away without repartitioning your hard drive (which often implies
+  backing everything up and restoring afterwards) and hence you're
+  able to quickly try out Linux or show it to your friends; the
+  disadvantage is that Linux becomes susceptible to DOS viruses and
+  that UMSDOS is somewhat slower than ext2fs.  Another use of UMSDOS
+  is to write files with long unix filenames to MSDOS floppies; it
+  also allows Unix-style soft-links and owner/permissions of files on
+  MSDOS floppies.  You will need a program called umssync in order to
+  make use of UMSDOS; read
+  <file:Documentation/filesystems/umsdos.txt>.
+
+  To get utilities for initializing/checking UMSDOS file system, or
+  latest patches and/or information, visit the UMSDOS home page at
+  <http://www.voyager.hr/~mnalis/umsdos/>.
+
+  This option enlarges your kernel by about 28 KB and it only works if
+  you said Y to both "DOS FAT fs support" and "MSDOS fs support"
+  above.  If you want to compile this as a module ( = code which can
+  be inserted in and removed from the running kernel whenever you
+  want), say M here and read <file:Documentation/modules.txt>.  The
+  module will be called umsdos.o.  Note that the file system of your
+  root partition (the one containing the directory /) cannot be a
+  module, so saying M could be dangerous.  If unsure, say N.
+
+/proc file system support
+CONFIG_PROC_FS
+  This is a virtual file system providing information about the status
+  of the system. "Virtual" means that it doesn't take up any space on
+  your hard disk: the files are created on the fly by the kernel when
+  you try to access them. Also, you cannot read the files with older
+  version of the program less: you need to use more or cat.
+
+  It's totally cool; for example, "cat /proc/interrupts" gives
+  information about what the different IRQs are used for at the moment
+  (there is a small number of Interrupt ReQuest lines in your computer
+  that are used by the attached devices to gain the CPU's attention --
+  often a source of trouble if two devices are mistakenly configured
+  to use the same IRQ). The program procinfo to display some
+  information about your system gathered from the /proc file system.
+
+  Before you can use the /proc file system, it has to be mounted,
+  meaning it has to be given a location in the directory hierarchy.
+  That location should be /proc. A command such as "mount -t proc proc
+  /proc" or the equivalent line in /etc/fstab does the job.
+
+  The /proc file system is explained in the file
+  <file:Documentation/filesystems/proc.txt> and on the proc(5) manpage
+  ("man 5 proc").
+
+  This option will enlarge your kernel by about 67 KB. Several
+  programs depend on this, so everyone should say Y here.
+
+Support for PReP Residual Data
+CONFIG_PREP_RESIDUAL
+  Some PReP systems have residual data passed to the kernel by the
+  firmware.  This allows detection of memory size, devices present and
+  other useful pieces of information.  Sometimes this information is
+  not present or incorrect.
+
+  Unless you expect to boot on a PReP system, there is no need to
+  select Y.
+
+PReP residual data available in /proc/residual
+CONFIG_PROC_PREPRESIDUAL
+  Enabling this option will create a /proc/residual file which allows
+  you to get at the residual data on PReP systems.  You will need a tool
+  (lsresidual) to parse it.  If you aren't on a PReP system, you don't
+  want this.
+
+/dev file system support
+CONFIG_DEVFS_FS
+  This is support for devfs, a virtual file system (like /proc) which
+  provides the file system interface to device drivers, normally found
+  in /dev. Devfs does not depend on major and minor number
+  allocations. Device drivers register entries in /dev which then
+  appear automatically, which means that the system administrator does
+  not have to create character and block special device files in the
+  /dev directory using the mknod command (or MAKEDEV script) anymore.
+
+  This is work in progress. If you want to use this, you *must* read
+  the material in <file:Documentation/filesystems/devfs/>, especially
+  the file README there.
+
+  If unsure, say N.
+
+Automatically mount devfs at boot time
+CONFIG_DEVFS_MOUNT
+  This option appears if you have CONFIG_DEVFS_FS enabled. Setting
+  this to 'Y' will make the kernel automatically mount devfs onto /dev
+  when the system is booted, before the init thread is started.
+  You can override this with the "devfs=nomount" boot option.
+
+  If unsure, say N.
+
+Debug devfs
+CONFIG_DEVFS_DEBUG
+  If you say Y here, then the /dev file system code will generate
+  debugging messages. See the file
+  <file:Documentation/filesystems/devfs/boot-options> for more
+  details.
+
+  If unsure, say N.
+
+NFS file system support
+CONFIG_NFS_FS
+  If you are connected to some other (usually local) Unix computer
+  (using SLIP, PLIP, PPP or Ethernet) and want to mount files residing
+  on that computer (the NFS server) using the Network File Sharing
+  protocol, say Y. "Mounting files" means that the client can access
+  the files with usual UNIX commands as if they were sitting on the
+  client's hard disk. For this to work, the server must run the
+  programs nfsd and mountd (but does not need to have NFS file system
+  support enabled in its kernel). NFS is explained in the Network
+  Administrator's Guide, available from
+  <http://www.tldp.org/docs.html#guide>, on its man page: "man
+  nfs", and in the NFS-HOWTO.
+
+  A superior but less widely used alternative to NFS is provided by
+  the Coda file system; see "Coda file system support" below.
+
+  If you say Y here, you should have said Y to TCP/IP networking also.
+  This option would enlarge your kernel by about 27 KB.
+
+  This file system is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called nfs.o. If you want to compile it as a module,
+  say M here and read <file:Documentation/modules.txt>.
+
+  If you are configuring a diskless machine which will mount its root
+  file system over NFS at boot time, say Y here and to "Kernel
+  level IP autoconfiguration" above and to "Root file system on NFS"
+  below. You cannot compile this driver as a module in this case.
+  There are two packages designed for booting diskless machines over
+  the net: netboot, available from
+  <http://ftp1.sourceforge.net/netboot/>, and Etherboot,
+  available from <http://ftp1.sourceforge.net/etherboot/>.
+
+  If you don't know what all this is about, say N.
+
+Provide NFSv3 client support
+CONFIG_NFS_V3
+  Say Y here if you want your NFS client to be able to speak the newer
+  version 3 of the NFS protocol.
+
+  If unsure, say N.
+
+Allow direct I/O on files in NFS
+CONFIG_NFS_DIRECTIO
+  There are important applications whose performance or correctness
+  depends on uncached access to file data.  Database clusters (multiple
+  copies of the same instance running on separate hosts) implement their
+  own cache coherency protocol that subsumes the NFS cache protocols.
+  Applications that process datasets considerably larger than the client's
+  memory do not always benefit from a local cache.  A streaming video
+  server, for instance, has no need to cache the contents of a file.
+
+  This option enables applications to perform direct I/O on files in NFS
+  file systems using the O_DIRECT open() flag.  When O_DIRECT is set for
+  files, their data is not cached in the system's page cache.  Direct
+  read and write operations are aligned to block boundaries.  Data is
+  moved to and from user-level application buffers directly.
+
+  Unless your program is designed to use O_DIRECT properly, you are much
+  better off allowing the NFS client to manage caching for you.  Misusing
+  O_DIRECT can cause poor server performance or network storms.  This
+  kernel build option defaults OFF to avoid exposing system administrators
+  unwittingly to a potentially hazardous feature.
+
+  If unsure, say N.
+
+Root file system on NFS
+CONFIG_ROOT_NFS
+  If you want your Linux box to mount its whole root file system (the
+  one containing the directory /) from some other computer over the
+  net via NFS (presumably because your box doesn't have a hard disk),
+  say Y. Read <file:Documentation/nfsroot.txt> for details. It is
+  likely that in this case, you also want to say Y to "Kernel level IP
+  autoconfiguration" so that your box can discover its network address
+  at boot time.
+
+  Most people say N here.
+
+NFS server support
+CONFIG_NFSD
+  If you want your Linux box to act as an NFS *server*, so that other
+  computers on your local network which support NFS can access certain
+  directories on your box transparently, you have two options: you can
+  use the self-contained user space program nfsd, in which case you
+  should say N here, or you can say Y and use the kernel based NFS
+  server. The advantage of the kernel based solution is that it is
+  faster.
+
+  In either case, you will need support software; the respective
+  locations are given in the file <file:Documentation/Changes> in the
+  NFS section.
+
+  If you say Y here, you will get support for version 2 of the NFS
+  protocol (NFSv2). If you also want NFSv3, say Y to the next question
+  as well.
+
+  Please read the NFS-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  The NFS server is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called nfsd.o.  If you want to compile it as a module,
+  say M here and read <file:Documentation/modules.txt>.  If unsure,
+  say N.
+
+Provide NFSv3 server support
+CONFIG_NFSD_V3
+  If you would like to include the NFSv3 server as well as the NFSv2
+  server, say Y here.  If unsure, say Y.
+
+Provide NFS over TCP server support EXPERIMENTAL
+CONFIG_NFSD_TCP
+  Enable NFS service over TCP connections.  This the officially
+  still experimental, but seems to work well.
+
+OS/2 HPFS file system support
+CONFIG_HPFS_FS
+  OS/2 is IBM's operating system for PC's, the same as Warp, and HPFS
+  is the file system used for organizing files on OS/2 hard disk
+  partitions. Say Y if you want to be able to read files from and
+  write files to an OS/2 HPFS partition on your hard drive. OS/2
+  floppies however are in regular MSDOS format, so you don't need this
+  option in order to be able to read them. Read
+  <file:Documentation/filesystems/hpfs.txt>.
+
+  This file system is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called hpfs.o.  If you want to compile it as a module,
+  say M here and read <file:Documentation/modules.txt>.  If unsure,
+  say N.
+
+NTFS file system support (read-only)
+CONFIG_NTFS_FS
+  NTFS is the file system of Microsoft Windows NT. Say Y if you want
+  to get read access to files on NTFS partitions of your hard drive.
+  The Linux NTFS driver supports most of the mount options of the VFAT
+  driver, see <file:Documentation/filesystems/ntfs.txt>. Saying Y here
+  will give you read-only access to NTFS partitions.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ntfs.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+NTFS write support (DANGEROUS)
+CONFIG_NTFS_RW
+  If you say Y here, you will (maybe) be able to write to NTFS file
+  systems as well as read from them. The read-write support in NTFS
+  is far from being complete and is not well tested. If you say Y
+  here, back up your NTFS volume first, since it will probably get
+  damaged. Also, download the Linux-NTFS project distribution from
+  Sourceforge at <http://linux-ntfs.sf.net/> and always run the
+  included ntfsfix utility after writing to an NTFS partition from
+  Linux to fix some of the damage done by the driver. You should run
+  ntfsfix _after_ unmounting the partition in Linux but _before_
+  rebooting into Windows. When Windows next boots, chkdsk will be
+  run automatically to fix the remaining damage.
+  Please note that write support is limited to Windows NT4 and
+  earlier versions.
+
+  If unsure, say N.
+
+System V/Xenix/V7/Coherent file system support
+CONFIG_SYSV_FS
+  SCO, Xenix and Coherent are commercial Unix systems for Intel
+  machines, and Version 7 was used on the DEC PDP-11. Saying Y
+  here would allow you to read from their floppies and hard disk
+  partitions.
+
+  If you have floppies or hard disk partitions like that, it is likely
+  that they contain binaries from those other Unix systems; in order
+  to run these binaries, you will want to install linux-abi which is a
+  a set of kernel modules that lets you run SCO, Xenix, Wyse,
+  UnixWare, Dell Unix and System V programs under Linux.  It is
+  available via FTP (user: ftp) from
+  <ftp://ftp.openlinux.org/pub/people/hch/linux-abi/>).
+  NOTE: that will work only for binaries from Intel-based systems;
+  PDP ones will have to wait until somebody ports Linux to -11 ;-)
+
+  If you only intend to mount files from some other Unix over the
+  network using NFS, you don't need the System V file system support
+  (but you need NFS file system support obviously).
+
+  Note that this option is generally not needed for floppies, since a
+  good portable way to transport files and directories between unixes
+  (and even other operating systems) is given by the tar program ("man
+  tar" or preferably "info tar").  Note also that this option has
+  nothing whatsoever to do with the option "System V IPC". Read about
+  the System V file system in
+  <file:Documentation/filesystems/sysv-fs.txt>.
+  Saying Y here will enlarge your kernel by about 27 KB.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called sysv.o.
+
+  If you haven't heard about all of this before, it's safe to say N.
+
+Amiga FFS file system support
+CONFIG_AFFS_FS
+  The Fast File System (FFS) is the common file system used on hard
+  disks by Amiga(tm) systems since AmigaOS Version 1.3 (34.20).  Say Y
+  if you want to be able to read and write files from and to an Amiga
+  FFS partition on your hard drive.  Amiga floppies however cannot be
+  read with this driver due to an incompatibility of the floppy
+  controller used in an Amiga and the standard floppy controller in
+  PCs and workstations. Read <file:Documentation/filesystems/affs.txt>
+  and <file:fs/affs/Changes>.
+
+  With this driver you can also mount disk files used by Bernd
+  Schmidt's Un*X Amiga Emulator
+  (<http://www.freiburg.linux.de/~uae/>).
+  If you want to do this, you will also need to say Y or M to "Loop
+  device support", above.
+
+  This file system is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called affs.o.  If you want to compile it as a module,
+  say M here and read <file:Documentation/modules.txt>.  If unsure,
+  say N.
+
+Apple HFS file system support
+CONFIG_HFS_FS
+  If you say Y here, you will be able to mount Macintosh-formatted
+  floppy disks and hard drive partitions with full read-write access.
+  Please read <file:fs/hfs/HFS.txt> to learn about the available mount
+  options.
+
+  This file system support is also available as a module ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). The module is called hfs.o.  If you want to
+  compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+Apple HFS+ (Extended HFS) file system support
+CONFIG_HFSPLUS_FS
+  If you say Y here, you will be able to mount extended format
+  Macintosh-formatted hard drive partitions with full read-write access.
+
+  This file system is often called HFS+ and was introduced with
+  MacOS 8. It includes all Mac specific filesystem data such as
+  data forks and creator codes, but it also has several UNIX
+  style features such as file ownership and permissions.
+
+  This file system is also available as a module ( = code which can
+  be inserted in and removed from the running kernel whenever you
+  want). The module is called hfsplus.o. If you want to compile it
+  as a module, say M here and read Documentation/modules.txt.
+
+ROM file system support
+CONFIG_ROMFS_FS
+  This is a very small read-only file system mainly intended for
+  initial ram disks of installation disks, but it could be used for
+  other read-only media as well.  Read
+  <file:Documentation/filesystems/romfs.txt> for details.
+
+  This file system support is also available as a module ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). The module is called romfs.o.  If you want to
+  compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  Note that the file system of your
+  root partition (the one containing the directory /) cannot be a
+  module.
+
+  If you don't know whether you need it, then you don't need it:
+  answer N.
+
+QNX4 file system support (read only)
+CONFIG_QNX4FS_FS
+  This is the file system used by the real-time operating systems
+  QNX 4 and QNX 6 (the latter is also called QNX RTP).
+  Further information is available at <http://www.qnx.com/>.
+  Say Y if you intend to mount QNX hard disks or floppies.
+  Unless you say Y to "QNX4FS read-write support" below, you will
+  only be able to read these file systems.
+
+  This file system support is also available as a module ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). The module is called qnx4.o. If you want to
+  compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+  If you don't know whether you need it, then you don't need it:
+  answer N.
+
+QNX4FS write support (DANGEROUS)
+CONFIG_QNX4FS_RW
+  Say Y if you want to test write support for QNX4 file systems.
+
+  It's currently broken, so for now:
+  answer N.
+
+Kernel automounter support
+CONFIG_AUTOFS_FS
+  The automounter is a tool to automatically mount remote file systems
+  on demand. This implementation is partially kernel-based to reduce
+  overhead in the already-mounted case; this is unlike the BSD
+  automounter (amd), which is a pure user space daemon.
+
+  To use the automounter you need the user-space tools from the autofs
+  package; you can find the location in <file:Documentation/Changes>.
+  You also want to answer Y to "NFS file system support", below.
+
+  If you want to use the newer version of the automounter with more
+  features, say N here and say Y to "Kernel automounter v4 support",
+  below.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called autofs.o.
+
+  If you are not a part of a fairly large, distributed network, you
+  probably do not need an automounter, and can say N here.
+
+Kernel automounter version 4 support (also supports v3)
+CONFIG_AUTOFS4_FS
+  The automounter is a tool to automatically mount remote file systems
+  on demand. This implementation is partially kernel-based to reduce
+  overhead in the already-mounted case; this is unlike the BSD
+  automounter (amd), which is a pure user space daemon.
+
+  To use the automounter you need the user-space tools from
+  <ftp://ftp.kernel.org/pub/linux/daemons/autofs/testing-v4/>; you also
+  want to answer Y to "NFS file system support", below.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called autofs4.o.  You will need to add "alias autofs
+  autofs4" to your modules configuration file.
+
+  If you are not a part of a fairly large, distributed network or
+  don't have a laptop which needs to dynamically reconfigure to the
+  local network, you probably do not need an automounter, and can say
+  N here.
+
+EFS file system support (read-only)
+CONFIG_EFS_FS
+  EFS is an older file system used for non-ISO9660 CD-ROMs and hard
+  disk partitions by SGI's IRIX operating system (IRIX 6.0 and newer
+  uses the XFS file system for hard disk partitions however).
+
+  This implementation only offers read-only access. If you don't know
+  what all this is about, it's safe to say N. For more information
+  about EFS see its home page at <http://aeschi.ch.eu.org/efs/>.
+
+  If you want to compile the EFS file system support as a module ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want), say M here and read
+  <file:Documentation/modules.txt>. The module will be called efs.o.
+
+Journalling Flash File System (JFFS) support
+CONFIG_JFFS_FS
+  JFFS is the Journalling Flash File System developed by Axis
+  Communications in Sweden, aimed at providing a crash/powerdown-safe
+  file system for disk-less embedded devices. Further information is
+  available at (<http://developer.axis.com/software/jffs/>).
+
+JFFS debugging verbosity (0 = quiet, 3 = noisy)
+CONFIG_JFFS_FS_VERBOSE
+  Determines the verbosity level of the JFFS debugging messages.
+
+Journalling Flash File System v2 (JFFS2) support
+CONFIG_JFFS2_FS
+  JFFS2 is the second generation of the Journalling Flash File System
+  for use on diskless embedded devices. It provides improved wear
+  levelling, compression and support for hard links. You cannot use
+  this on normal block devices, only on 'MTD' devices.
+
+  Further information should be made available soon at
+  <http://sources.redhat.com/jffs2/>.
+
+JFFS2 debugging verbosity (0 = quiet, 2 = noisy)
+CONFIG_JFFS2_FS_DEBUG
+  This controls the amount of debugging messages produced by the JFFS2
+  code. Set it to zero for use in production systems. For evaluation,
+  testing and debugging, it's advisable to set it to one. This will
+  enable a few assertions and will print debugging messages at the
+  KERN_DEBUG loglevel, where they won't normally be visible. Level 2
+  is unlikely to be useful - it enables extra debugging in certain
+  areas which at one point needed debugging, but when the bugs were
+  located and fixed, the detailed messages were relegated to level 2.
+
+  If reporting bugs, please try to have available a full dump of the
+  messages at debug level 1 while the misbehaviour was occurring.
+
+JFFS stats available in /proc filesystem
+CONFIG_JFFS_PROC_FS
+  Enabling this option will cause statistics from mounted JFFS file systems
+  to be made available to the user in the /proc/fs/jffs/ directory.
+
+UFS file system support (read-only)
+CONFIG_UFS_FS
+  BSD and derivate versions of Unix (such as SunOS, FreeBSD, NetBSD,
+  OpenBSD and NeXTstep) use a file system called UFS. Some System V
+  Unixes can create and mount hard disk partitions and diskettes using
+  this file system as well. Saying Y here will allow you to read from
+  these partitions; if you also want to write to them, say Y to the
+  experimental "UFS file system write support", below. Please read the
+  file <file:Documentation/filesystems/ufs.txt> for more information.
+
+  If you only intend to mount files from some other Unix over the
+  network using NFS, you don't need the UFS file system support (but
+  you need NFS file system support obviously).
+
+  Note that this option is generally not needed for floppies, since a
+  good portable way to transport files and directories between unixes
+  (and even other operating systems) is given by the tar program ("man
+  tar" or preferably "info tar").
+
+  When accessing NeXTstep files, you may need to convert them from the
+  NeXT character set to the Latin1 character set; use the program
+  recode ("info recode") for this purpose.
+
+  If you want to compile the UFS file system support as a module ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want), say M here and read
+  <file:Documentation/modules.txt>. The module will be called ufs.o.
+
+  If you haven't heard about all of this before, it's safe to say N.
+
+UFS file system write support (DANGEROUS)
+CONFIG_UFS_FS_WRITE
+  Say Y here if you want to try writing to UFS partitions. This is
+  experimental, so you should back up your UFS partitions beforehand.
+
+Advanced partition selection
+CONFIG_PARTITION_ADVANCED
+  Say Y here if you would like to use hard disks under Linux which
+  were partitioned under an operating system running on a different
+  architecture than your Linux system.
+
+  Note that the answer to this question won't directly affect the
+  kernel: saying N will just cause the configurator to skip all
+  the questions about foreign partitioning schemes.
+
+  If unsure, say N.
+
+Acorn partition support
+CONFIG_ACORN_PARTITION
+  Support hard disks partitioned under Acorn operating systems.
+
+Xeno partition support
+CONFIG_XENO_PARTITION
+  Support Xeno-style partitions on physical disks.  The Xen
+  hypervisor can export partitions on a physical disk to clients,
+  but access to the partition table requires special hackery.
+  This will be used if this option is enabled; otherwise, 
+  it will be possible to access exported partitions by sector
+  number but not with useful names e.g. /dev/hda4.
+
+  If unsure, say Y.
+
+Native filecore partition support
+CONFIG_ACORN_PARTITION_ADFS
+  The Acorn Disc Filing System is the standard file system of the
+  RiscOS operating system which runs on Acorn's ARM-based Risc PC
+  systems and the Acorn Archimedes range of machines.  If you say
+  `Y' here, Linux will support disk partitions created under ADFS.
+
+PowerTec partition support
+CONFIG_ACORN_PARTITION_POWERTEC
+  Support reading partition tables created on Acorn machines using
+  the PowerTec SCSI drive.
+
+RISCiX partition support
+CONFIG_ACORN_PARTITION_RISCIX
+  Once upon a time, there was a native Unix port for the Acorn series
+  of machines called RISCiX.  If you say 'Y' here, Linux will be able
+  to read disks partitioned under RISCiX.
+
+ICS partition support
+CONFIG_ACORN_PARTITION_ICS
+  Say Y here if you would like to use hard disks under Linux which
+  were partitioned using the ICS interface on Acorn machines.
+
+Alpha OSF partition support
+CONFIG_OSF_PARTITION
+  Say Y here if you would like to use hard disks under Linux which
+  were partitioned on an Alpha machine.
+
+Macintosh partition map support
+CONFIG_MAC_PARTITION
+  Say Y here if you would like to use hard disks under Linux which
+  were partitioned on a Macintosh.
+
+Windows Logical Disk Manager (Dynamic Disk) support (EXPERIMENTAL)
+CONFIG_LDM_PARTITION
+  Say Y here if you would like to use hard disks under Linux which
+  were partitioned using Windows 2000's or XP's Logical Disk Manager.
+  They are also known as "Dynamic Disks".
+
+  Windows 2000 introduced the concept of Dynamic Disks to get around
+  the limitations of the PC's partitioning scheme.  The Logical Disk
+  Manager allows the user to repartition a disk and create spanned,
+  mirrored, striped or RAID volumes, all without the need for
+  rebooting.
+
+  Normal partitions are now called Basic Disks under Windows 2000 and
+  XP.
+
+  Technical documentation to accompany this driver is available from:
+  <http://linux-ntfs.sf.net/ldm/>.
+
+  If unsure, say N.
+
+Windows LDM extra logging
+CONFIG_LDM_DEBUG
+  Say Y here if you would like LDM to log verbosely.  This could be
+  helpful if the driver doesn't work as expected and you'd like to
+  report a bug.
+
+  If unsure, say N.
+
+PC BIOS (MSDOS partition tables) support
+CONFIG_MSDOS_PARTITION
+  Say Y here if you would like to use hard disks under Linux which
+  were partitioned on an x86 PC (not necessarily by DOS).
+
+Amiga partition table support
+CONFIG_AMIGA_PARTITION
+  Say Y here if you would like to use hard disks under Linux which
+  were partitioned under AmigaOS.
+
+Atari partition table support
+CONFIG_ATARI_PARTITION
+  Say Y here if you would like to use hard disks under Linux which
+  were partitioned under the Atari OS.
+
+BSD disklabel (FreeBSD partition tables) support
+CONFIG_BSD_DISKLABEL
+  FreeBSD uses its own hard disk partition scheme on your PC. It
+  requires only one entry in the primary partition table of your disk
+  and manages it similarly to DOS extended partitions, putting in its
+  first sector a new partition table in BSD disklabel format. Saying Y
+  here allows you to read these disklabels and further mount FreeBSD
+  partitions from within Linux if you have also said Y to "UFS
+  file system support", above. If you don't know what all this is
+  about, say N.
+
+Minix subpartition support
+CONFIG_MINIX_SUBPARTITION
+  Minix 2.0.0/2.0.2 subpartition table support for Linux.
+  Say Y here if you want to mount and use Minix 2.0.0/2.0.2
+  subpartitions.
+
+Sun partition table support
+CONFIG_SUN_PARTITION
+  Like most systems, SunOS uses its own hard disk partition table
+  format, incompatible with all others. Saying Y here allows you to
+  read these partition tables and further mount SunOS partitions from
+  within Linux if you have also said Y to "UFS file system support",
+  above. This is mainly used to carry data from a SPARC under SunOS to
+  your Linux box via a removable medium like magneto-optical or ZIP
+  drives; note however that a good portable way to transport files and
+  directories between unixes (and even other operating systems) is
+  given by the tar program ("man tar" or preferably "info tar"). If
+  you don't know what all this is about, say N.
+
+Solaris (x86) partition table support
+CONFIG_SOLARIS_X86_PARTITION
+  Like most systems, Solaris x86 uses its own hard disk partition
+  table format, incompatible with all others. Saying Y here allows you
+  to read these partition tables and further mount Solaris x86
+  partitions from within Linux if you have also said Y to "UFS
+  file system support", above.
+
+SGI partition support
+CONFIG_SGI_PARTITION
+  Say Y here if you would like to be able to read the hard disk
+  partition table format used by SGI machines.
+
+Intel EFI GUID partition support
+CONFIG_EFI_PARTITION
+  Say Y here if you would like to use hard disks under Linux which
+  were partitioned using EFI GPT.  Presently only useful on the
+  IA-64 platform.
+
+Ultrix partition table support
+CONFIG_ULTRIX_PARTITION
+  Say Y here if you would like to be able to read the hard disk
+  partition table format used by DEC (now Compaq) Ultrix machines.
+  Otherwise, say N.
+
+IBM disk label and partition support
+CONFIG_IBM_PARTITION
+  You have to say Y here if you would like to be able to read volume 
+  labels of IBM DASD disks. These can be ECKD DASD disks with 
+  compatible disk layout (cdl) and standard Linux disk layout (ldl), 
+  FBA DASD disks and CMS reserved minidisks.
+  Otherwise, say N and you will not be able to access these disks.
+
+ADFS file system support
+CONFIG_ADFS_FS
+  The Acorn Disc Filing System is the standard file system of the
+  RiscOS operating system which runs on Acorn's ARM-based Risc PC
+  systems and the Acorn Archimedes range of machines. If you say Y
+  here, Linux will be able to read from ADFS partitions on hard drives
+  and from ADFS-formatted floppy discs. If you also want to be able to
+  write to those devices, say Y to "ADFS write support" below.
+
+  The ADFS partition should be the first partition (i.e.,
+  /dev/[hs]d?1) on each of your drives. Please read the file
+  <file:Documentation/filesystems/adfs.txt> for further details.
+
+  This code is also available as a module called adfs.o ( = code which
+  can be inserted in and removed from the running kernel whenever you
+  want). If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+  If unsure, say N.
+
+ADFS write support (DANGEROUS)
+CONFIG_ADFS_FS_RW
+  If you say Y here, you will be able to write to ADFS partitions on
+  hard drives and ADFS-formatted floppy disks. This is experimental
+  codes, so if you're unsure, say N.
+
+JFS filesystem support
+CONFIG_JFS_FS
+  This is a port of IBM's Journalling Filesystem .  More information is
+  available in the file Documentation/filesystems/jfs.txt.
+
+  If you do not intend to use the JFS filesystem, say N.
+
+JFS Debugging
+CONFIG_JFS_DEBUG
+  If you are experiencing any problems with the JFS filesystem, say
+  Y here.  This will result in additional debugging messages to be
+  written to the system log.  Under normal circumstances, this
+  results in very little overhead.
+
+JFS Statistics
+CONFIG_JFS_STATISTICS
+  Enabling this option will cause statistics from the JFS file system
+  to be made available to the user in the /proc/fs/jfs/ directory.
+
+/dev/pts file system for Unix98 PTYs
+CONFIG_DEVPTS_FS
+  You should say Y here if you said Y to "Unix98 PTY support" above.
+  You'll then get a virtual file system which can be mounted on
+  /dev/pts with "mount -t devpts". This, together with the pseudo
+  terminal master multiplexer /dev/ptmx, is used for pseudo terminal
+  support as described in The Open Group's Unix98 standard: in order
+  to acquire a pseudo terminal, a process opens /dev/ptmx; the number
+  of the pseudo terminal is then made available to the process and the
+  pseudo terminal slave can be accessed as /dev/pts/<number>. What was
+  traditionally /dev/ttyp2 will then be /dev/pts/2, for example.
+
+  The GNU C library glibc 2.1 contains the requisite support for this
+  mode of operation; you also need client programs that use the Unix98
+  API. Please read <file:Documentation/Changes> for more information
+  about the Unix98 pty devices.
+
+  Note that the experimental "/dev file system support"
+  (CONFIG_DEVFS_FS)  is a more general facility.
+
+FreeVxFS file system support (VERITAS VxFS(TM) compatible)
+CONFIG_VXFS_FS
+  FreeVxFS is a file system driver that support the VERITAS VxFS(TM)
+  file system format.  VERITAS VxFS(TM) is the standard file system
+  of SCO UnixWare (and possibly others) and optionally available
+  for Sunsoft Solaris, HP-UX and many other operating systems.
+  Currently only readonly access is supported.
+
+  NOTE: the file system type as used by mount(1), mount(2) and
+        fstab(5) is 'vxfs' as it describes the file system format, not
+        the actual driver.
+
+  This file system is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called freevxfs.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.  If
+  unsure, say N. 
+
+UnixWare slices support
+CONFIG_UNIXWARE_DISKLABEL
+  Like some systems, UnixWare uses its own slice table inside a
+  partition (VTOC - Virtual Table of Contents). Its format is
+  incompatible with all other OSes. Saying Y here allows you to read
+  VTOC and further mount UnixWare partitions read-only from within
+  Linux if you have also said Y to "UFS file system support" or
+  "System V and Coherent file system support", above.
+
+  This is mainly used to carry data from a UnixWare box to your
+  Linux box via a removable medium like magneto-optical, ZIP or
+  removable IDE drives. Note, however, that a good portable way to
+  transport files and directories between unixes (and even other
+  operating systems) is given by the tar program ("man tar" or
+  preferably "info tar").
+
+  If you don't know what all this is about, say N.
+
+SMB file system support (to mount Windows shares etc.)
+CONFIG_SMB_FS
+  SMB (Server Message Block) is the protocol Windows for Workgroups
+  (WfW), Windows 95/98, Windows NT and OS/2 Lan Manager use to share
+  files and printers over local networks.  Saying Y here allows you to
+  mount their file systems (often called "shares" in this context) and
+  access them just like any other Unix directory.  Currently, this
+  works only if the Windows machines use TCP/IP as the underlying
+  transport protocol, and not NetBEUI.  For details, read
+  <file:Documentation/filesystems/smbfs.txt> and the SMB-HOWTO,
+  available from <http://www.tldp.org/docs.html#howto>.
+
+  Note: if you just want your box to act as an SMB *server* and make
+  files and printing services available to Windows clients (which need
+  to have a TCP/IP stack), you don't need to say Y here; you can use
+  the program SAMBA (available from <ftp://ftp.samba.org/pub/samba/>)
+  for that.
+
+  General information about how to connect Linux, Windows machines and
+  Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>.
+
+  If you want to compile the SMB support as a module ( = code which
+  can be inserted in and removed from the running kernel whenever you
+  want), say M here and read <file:Documentation/modules.txt>.  The
+  module will be called smbfs.o.  Most people say N, however.
+
+Use a default NLS
+CONFIG_SMB_NLS_DEFAULT
+  Enabling this will make smbfs use nls translations by default. You
+  need to specify the local charset (CONFIG_NLS_DEFAULT) in the nls
+  settings and you need to give the default nls for the SMB server as
+  CONFIG_SMB_NLS_REMOTE.
+
+  The nls settings can be changed at mount time, if your smbmount
+  supports that, using the codepage and iocharset parameters.
+
+  smbmount from samba 2.2.0 or later supports this.
+
+Default Remote NLS Option
+CONFIG_SMB_NLS_REMOTE
+  This setting allows you to specify a default value for which
+  codepage the server uses. If this field is left blank no
+  translations will be done by default. The local codepage/charset
+  default to CONFIG_NLS_DEFAULT.
+
+  The nls settings can be changed at mount time, if your smbmount
+  supports that, using the codepage and iocharset parameters.
+
+  smbmount from samba 2.2.0 or later supports this.
+
+Coda file system support (advanced network fs)
+CONFIG_CODA_FS
+  Coda is an advanced network file system, similar to NFS in that it
+  enables you to mount file systems of a remote server and access them
+  with regular Unix commands as if they were sitting on your hard
+  disk.  Coda has several advantages over NFS: support for
+  disconnected operation (e.g. for laptops), read/write server
+  replication, security model for authentication and encryption,
+  persistent client caches and write back caching.
+
+  If you say Y here, your Linux box will be able to act as a Coda
+  *client*.  You will need user level code as well, both for the
+  client and server.  Servers are currently user level, i.e. they need
+  no kernel support.  Please read
+  <file:Documentation/filesystems/coda.txt> and check out the Coda
+  home page <http://www.coda.cs.cmu.edu/>.
+
+  If you want to compile the coda client support as a module ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want), say M here and read
+  <file:Documentation/modules.txt>.  The module will be called coda.o.
+
+InterMezzo file system support (replicating fs)
+CONFIG_INTERMEZZO_FS
+  InterMezzo is a networked file system with disconnected operation
+  and kernel level write back caching.  It is most often used for
+  replicating potentially large trees or keeping laptop/desktop copies
+  in sync.
+
+  If you say Y or M your kernel or module will provide InterMezzo
+  support.  You will also need a file server daemon, which you can get
+  from <http://www.inter-mezzo.org/>.
+
+NCP file system support (to mount NetWare volumes)
+CONFIG_NCP_FS
+  NCP (NetWare Core Protocol) is a protocol that runs over IPX and is
+  used by Novell NetWare clients to talk to file servers.  It is to
+  IPX what NFS is to TCP/IP, if that helps.  Saying Y here allows you
+  to mount NetWare file server volumes and to access them just like
+  any other Unix directory.  For details, please read the file
+  <file:Documentation/filesystems/ncpfs.txt> in the kernel source and
+  the IPX-HOWTO from <http://www.tldp.org/docs.html#howto>.
+
+  You do not have to say Y here if you want your Linux box to act as a
+  file *server* for Novell NetWare clients.
+
+  General information about how to connect Linux, Windows machines and
+  Macs is on the WWW at <http://www.eats.com/linux_mac_win.html>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ncpfs.o.  Say N unless you are connected to a Novell
+  network.
+
+Packet signatures
+CONFIG_NCPFS_PACKET_SIGNING
+  NCP allows packets to be signed for stronger security. If you want
+  security, say Y.  Normal users can leave it off.  To be able to use
+  packet signing you must use ncpfs > 2.0.12.
+
+Proprietary file locking
+CONFIG_NCPFS_IOCTL_LOCKING
+  Allows locking of records on remote volumes.  Say N unless you have
+  special applications which are able to utilize this locking scheme.
+
+Clear remove/delete inhibit when needed
+CONFIG_NCPFS_STRONG
+  Allows manipulation of files flagged as Delete or Rename Inhibit.
+  To use this feature you must mount volumes with the ncpmount
+  parameter "-s" (ncpfs-2.0.12 and newer).  Say Y unless you are not
+  mounting volumes with -f 444.
+
+Use NFS namespace if available
+CONFIG_NCPFS_NFS_NS
+  Allows you to utilize NFS namespace on NetWare servers.  It brings
+  you case sensitive filenames.  Say Y.  You can disable it at
+  mount-time with the `-N nfs' parameter of ncpmount.
+
+Use LONG (OS/2) namespace if available
+CONFIG_NCPFS_OS2_NS
+  Allows you to utilize OS2/LONG namespace on NetWare servers.
+  Filenames in this namespace are limited to 255 characters, they are
+  case insensitive, and case in names is preserved.  Say Y.  You can
+  disable it at mount time with the -N os2 parameter of ncpmount.
+
+Lowercase DOS filenames on LONG namespace volume
+CONFIG_NCPFS_SMALLDOS
+  If you say Y here, every filename on a NetWare server volume using
+  the OS2/LONG namespace and created under DOS or on a volume using
+  DOS namespace will be converted to lowercase characters.
+  Saying N here will give you these filenames in uppercase.
+
+  This is only a cosmetic option since the OS2/LONG namespace is case
+  insensitive. The only major reason for this option is backward
+  compatibility when moving from DOS to OS2/LONG namespace support.
+  Long filenames (created by Win95) will not be affected.
+
+  This option does not solve the problem that filenames appear
+  differently under Linux and under Windows, since Windows does an
+  additional conversions on the client side. You can achieve similar
+  effects by saying Y to "Allow using of Native Language Support"
+  below.
+
+Use Native Language Support
+CONFIG_NCPFS_NLS
+  Allows you to use codepages and I/O charsets for file name
+  translation between the server file system and input/output. This
+  may be useful, if you want to access the server with other operating
+  systems, e.g. Windows 95. See also NLS for more Information.
+
+  To select codepages and I/O charsets use ncpfs-2.2.0.13 or newer.
+
+Symbolic links and mode permission bits
+CONFIG_NCPFS_EXTRAS
+  This enables the use of symbolic links and an execute permission
+  bit on NCPFS. The file server need not have long name space or NFS
+  name space loaded for these to work.
+
+  To use the new attributes, it is recommended to use the flags
+  '-f 600 -d 755' on the ncpmount command line.
+
+Default NLS Option
+CONFIG_NLS_DEFAULT
+  The default NLS used when mounting file system. Note, that this is
+  the NLS used by your console, not the NLS used by a specific file
+  system (if different) to store data (filenames) on a disk.
+  Currently, the valid values are:
+  big5, cp437, cp737, cp775, cp850, cp852, cp855, cp857, cp860, cp861,
+  cp862, cp863, cp864, cp865, cp866, cp869, cp874, cp932, cp936,
+  cp949, cp950, cp1250, cp1251, cp1255, euc-jp, euc-kr, gb2312, iso8859-1,
+  iso8859-2, iso8859-3, iso8859-4, iso8859-5, iso8859-6, iso8859-7,
+  iso8859-8, iso8859-9, iso8859-13, iso8859-14, iso8859-15,
+  koi8-r, koi8-ru, koi8-u, sjis, tis-620, utf8.
+  If you specify a wrong value, it will use the built-in NLS;
+  compatible with iso8859-1.
+
+  If unsure, specify it as "iso8859-1".
+
+Codepage 437 (United States, Canada)
+CONFIG_NLS_CODEPAGE_437
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored
+  in so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the DOS codepage that is used in
+  the United States and parts of Canada. This is recommended.
+
+Codepage 737 (Greek)
+CONFIG_NLS_CODEPAGE_737
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored
+  in so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the DOS codepage that is used for
+  Greek. If unsure, say N.
+
+Codepage 775 (Baltic Rim)
+CONFIG_NLS_CODEPAGE_775
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored
+  in so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the DOS codepage that is used
+  for the Baltic Rim Languages (Latvian and Lithuanian). If unsure,
+  say N.
+
+Codepage 850 (Europe)
+CONFIG_NLS_CODEPAGE_850
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored in
+  so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the DOS codepage that is used for
+  much of Europe -- United Kingdom, Germany, Spain, Italy, and [add
+  more countries here]. It has some characters useful to many European
+  languages that are not part of the US codepage 437.
+
+  If unsure, say Y.
+
+Codepage 852 (Central/Eastern Europe)
+CONFIG_NLS_CODEPAGE_852
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored in
+  so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the Latin 2 codepage used by DOS
+  for much of Central and Eastern Europe. It has all the required
+  characters for these languages: Albanian, Croatian, Czech, English,
+  Finnish, Hungarian, Irish, German, Polish, Rumanian, Serbian (Latin
+  transcription), Slovak, Slovenian, and Serbian.
+
+Codepage 855 (Cyrillic)
+CONFIG_NLS_CODEPAGE_855
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored in
+  so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the DOS codepage for Cyrillic.
+
+Codepage 857 (Turkish)
+CONFIG_NLS_CODEPAGE_857
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored in
+  so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the DOS codepage for Turkish.
+
+Codepage 860 (Portuguese)
+CONFIG_NLS_CODEPAGE_860
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored in
+  so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the DOS codepage for Portuguese.
+
+Codepage 861 (Icelandic)
+CONFIG_NLS_CODEPAGE_861
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored in
+  so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the DOS codepage for Icelandic.
+
+Codepage 862 (Hebrew)
+CONFIG_NLS_CODEPAGE_862
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored in
+  so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the DOS codepage for Hebrew.
+
+Codepage 863 (Canadian French)
+CONFIG_NLS_CODEPAGE_863
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored in
+  so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the DOS codepage for Canadian
+  French.
+
+Codepage 864 (Arabic)
+CONFIG_NLS_CODEPAGE_864
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored in
+  so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the DOS codepage for Arabic.
+
+Codepage 865 (Norwegian, Danish)
+CONFIG_NLS_CODEPAGE_865
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored in
+  so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the DOS codepage for the Nordic
+  European countries.
+
+Codepage 866 (Cyrillic/Russian)
+CONFIG_NLS_CODEPAGE_866
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored in
+  so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the DOS codepage for
+  Cyrillic/Russian.
+
+Codepage 869 (Greek)
+CONFIG_NLS_CODEPAGE_869
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored in
+  so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the DOS codepage for Greek.
+
+Thai charset (CP874, TIS-620)
+CONFIG_NLS_CODEPAGE_874
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored in
+  so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the DOS codepage for Thai.
+
+Windows CP1251 (Bulgarian, Belarusian)
+CONFIG_NLS_CODEPAGE_1251
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored in
+  so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the DOS codepage for Russian and
+  Bulgarian and Belarusian.
+
+Japanese charsets (Shift-JIS, EUC-JP)
+CONFIG_NLS_CODEPAGE_932
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored in
+  so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the DOS codepage for Shift-JIS
+  or EUC-JP. To use EUC-JP, you can use 'euc-jp' as mount option or
+  NLS Default value during kernel configuration, instead of 'cp932'.
+
+Simplified Chinese charset (CP936, GB2312)
+CONFIG_NLS_CODEPAGE_936
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored in
+  so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the DOS codepage for Simplified
+  Chinese(GBK).
+
+Korean charset (CP949, EUC-KR)
+CONFIG_NLS_CODEPAGE_949
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored in
+  so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the DOS codepage for UHC.
+
+Traditional Chinese charset (Big5)
+CONFIG_NLS_CODEPAGE_950
+  The Microsoft FAT file system family can deal with filenames in
+  native language character sets. These character sets are stored in
+  so-called DOS codepages. You need to include the appropriate
+  codepage if you want to be able to read/write these filenames on
+  DOS/Windows partitions correctly. This does apply to the filenames
+  only, not to the file contents. You can include several codepages;
+  say Y here if you want to include the DOS codepage for Traditional
+  Chinese(Big5).
+
+Central European (Codepage 1250)
+CONFIG_NLS_CODEPAGE_1250
+  If you want to display filenames with native language characters
+  from the Microsoft FAT file system family or from JOLIET CDROMs
+  correctly on the screen, you need to include the appropriate
+  input/output character sets. Say Y here for the Windows CP-1250
+  character set, which works for most Latin-written Slavic and Central
+  European languages: Czech, German, Hungarian, Polish, Rumanian, Croatian,
+  Slovak, Slovene.
+
+NLS ISO 8859-1 (Latin 1; Western European Languages)
+CONFIG_NLS_ISO8859_1
+  If you want to display filenames with native language characters
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
+  correctly on the screen, you need to include the appropriate
+  input/output character sets. Say Y here for the Latin 1 character
+  set, which covers most West European languages such as Albanian,
+  Catalan, Danish, Dutch, English, Faeroese, Finnish, French, German,
+  Galician, Irish, Icelandic, Italian, Norwegian, Portuguese, Spanish,
+  and Swedish. It is also the default for the US. If unsure, say Y.
+
+NLS ISO 8859-2 (Latin 2; Slavic/Central European Languages)
+CONFIG_NLS_ISO8859_2
+  If you want to display filenames with native language characters
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
+  correctly on the screen, you need to include the appropriate
+  input/output character sets. Say Y here for the Latin 2 character
+  set, which works for most Latin-written Slavic and Central European
+  languages: Czech, German, Hungarian, Polish, Rumanian, Croatian,
+  Slovak, Slovene.
+
+NLS ISO 8859-3 (Latin 3; Esperanto, Galician, Maltese, Turkish)
+CONFIG_NLS_ISO8859_3
+  If you want to display filenames with native language characters
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
+  correctly on the screen, you need to include the appropriate
+  input/output character sets. Say Y here for the Latin 3 character
+  set, which is popular with authors of Esperanto, Galician, Maltese,
+  and Turkish.
+
+NLS ISO 8859-4 (Latin 4; old Baltic charset)
+CONFIG_NLS_ISO8859_4
+  If you want to display filenames with native language characters
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
+  correctly on the screen, you need to include the appropriate
+  input/output character sets. Say Y here for the Latin 4 character
+  set which introduces letters for Estonian, Latvian, and
+  Lithuanian. It is an incomplete predecessor of Latin 7.
+
+NLS ISO 8859-5 (Cyrillic)
+CONFIG_NLS_ISO8859_5
+  If you want to display filenames with native language characters
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
+  correctly on the screen, you need to include the appropriate
+  input/output character sets. Say Y here for ISO8859-5, a Cyrillic
+  character set with which you can type Bulgarian, Belarusian,
+  Macedonian, Russian, Serbian, and Ukrainian. Note that the charset
+  KOI8-R is preferred in Russia.
+
+NLS ISO 8859-6 (Arabic)
+CONFIG_NLS_ISO8859_6
+  If you want to display filenames with native language characters
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
+  correctly on the screen, you need to include the appropriate
+  input/output character sets. Say Y here for ISO8859-6, the Arabic
+  character set.
+
+NLS ISO 8859-7 (Modern Greek)
+CONFIG_NLS_ISO8859_7
+  If you want to display filenames with native language characters
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
+  correctly on the screen, you need to include the appropriate
+  input/output character sets. Say Y here for ISO8859-7, the Modern
+  Greek character set.
+
+Hebrew charsets (ISO-8859-8, CP1255)
+CONFIG_NLS_ISO8859_8
+  If you want to display filenames with native language characters
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
+  correctly on the screen, you need to include the appropriate
+  input/output character sets. Say Y here for ISO8859-8, the Hebrew
+  character set.
+
+NLS ISO 8859-9 (Latin 5; Turkish)
+CONFIG_NLS_ISO8859_9
+  If you want to display filenames with native language characters
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
+  correctly on the screen, you need to include the appropriate
+  input/output character sets. Say Y here for the Latin 5 character
+  set, and it replaces the rarely needed Icelandic letters in Latin 1
+  with the Turkish ones. Useful in Turkey.
+
+NLS ISO 8859-10 (Latin 6; Nordic)
+CONFIG_NLS_ISO8859_10
+  If you want to display filenames with native language characters
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
+  correctly on the screen, you need to include the appropriate
+  input/output character sets. Say Y here for the Latin 6 character
+  set, which adds the last Inuit (Greenlandic) and Sami (Lappish)
+  letters that were missing in Latin 4 to cover the entire Nordic
+  area.
+
+NLS ISO 8859-13 (Latin 7; Baltic)
+CONFIG_NLS_ISO8859_13
+  If you want to display filenames with native language characters
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
+  correctly on the screen, you need to include the appropriate
+  input/output character sets. Say Y here for the Latin 7 character
+  set, which supports modern Baltic languages including Latvian
+  and Lithuanian.
+
+NLS ISO 8859-14 (Latin 8; Celtic)
+CONFIG_NLS_ISO8859_14
+  If you want to display filenames with native language characters
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
+  correctly on the screen, you need to include the appropriate
+  input/output character sets. Say Y here for the Latin 8 character
+  set, which adds the last accented vowels for Welsh (aka Cymraeg)
+  (and Manx Gaelic) that were missing in Latin 1.
+  <http://linux.speech.cymru.org/> has further information.
+
+NLS ISO 8859-15 (Latin 9; Western European languages with Euro)
+CONFIG_NLS_ISO8859_15
+  If you want to display filenames with native language characters
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
+  correctly on the screen, you need to include the appropriate
+  input/output character sets. Say Y here for the Latin 9 character
+  set, which covers most West European languages such as Albanian,
+  Catalan, Danish, Dutch, English, Estonian, Faeroese, Finnish,
+  French, German, Galician, Irish, Icelandic, Italian, Norwegian,
+  Portuguese, Spanish, and Swedish. Latin 9 is an update to
+  Latin 1 (ISO 8859-1) that removes a handful of rarely used
+  characters and instead adds support for Estonian, corrects the
+  support for French and Finnish, and adds the new Euro character.
+  If unsure, say Y.
+
+NLS KOI8-R (Russian)
+CONFIG_NLS_KOI8_R
+  If you want to display filenames with native language characters
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
+  correctly on the screen, you need to include the appropriate
+  input/output character sets. Say Y here for the preferred Russian
+  character set.
+
+NLS KOI8-U/RU (Ukrainian, Belarusian)
+CONFIG_NLS_KOI8_U
+  If you want to display filenames with native language characters
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
+  correctly on the screen, you need to include the appropriate
+  input/output character sets. Say Y here for the preferred Ukrainian
+  (koi8-u) and Belarusian (koi8-ru) character sets.
+
+NLS UTF8
+CONFIG_NLS_UTF8
+  If you want to display filenames with native language characters
+  from the Microsoft FAT file system family or from JOLIET CD-ROMs
+  correctly on the screen, you need to include the appropriate
+  input/output character sets. Say Y here for the UTF-8 encoding of
+  the Unicode/ISO9646 universal character set.
+
+Virtual terminal
+CONFIG_VT
+  If you say Y here, you will get support for terminal devices with
+  display and keyboard devices. These are called "virtual" because you
+  can run several virtual terminals (also called virtual consoles) on
+  one physical terminal. This is rather useful, for example one
+  virtual terminal can collect system messages and warnings, another
+  one can be used for a text-mode user session, and a third could run
+  an X session, all in parallel. Switching between virtual terminals
+  is done with certain key combinations, usually Alt-<function key>.
+
+  The setterm command ("man setterm") can be used to change the
+  properties (such as colors or beeping) of a virtual terminal. The
+  man page console_codes(4) ("man console_codes") contains the special
+  character sequences that can be used to change those properties
+  directly. The fonts used on virtual terminals can be changed with
+  the setfont ("man setfont") command and the key bindings are defined
+  with the loadkeys ("man loadkeys") command.
+
+  You need at least one virtual terminal device in order to make use
+  of your keyboard and monitor. Therefore, only people configuring an
+  embedded system would want to say N here in order to save some
+  memory; the only way to log into such a system is then via a serial
+  or network connection.
+
+  If unsure, say Y, or else you won't be able to do much with your new
+  shiny Linux system :-)
+
+Support for console on virtual terminal
+CONFIG_VT_CONSOLE
+  The system console is the device which receives all kernel messages
+  and warnings and which allows logins in single user mode. If you
+  answer Y here, a virtual terminal (the device used to interact with
+  a physical terminal) can be used as system console. This is the most
+  common mode of operations, so you should say Y here unless you want
+  the kernel messages be output only to a serial port (in which case
+  you should say Y to "Console on serial port", below).
+
+  If you do say Y here, by default the currently visible virtual
+  terminal (/dev/tty0) will be used as system console. You can change
+  that with a kernel command line option such as "console=tty3" which
+  would use the third virtual terminal as system console. (Try "man
+  bootparam" or see the documentation of your boot loader (lilo or
+  loadlin) about how to pass options to the kernel at boot time.)
+
+  If unsure, say Y.
+
+STI console
+CONFIG_STI_CONSOLE
+  The STI console is the builtin display/keyboard on HP-PARISC
+  machines.  Say Y here to build support for it into your kernel.
+  The alternative is to use your primary serial port as a console.
+
+Use MDIO for PHY configuration
+CONFIG_USE_MDIO
+  On some boards the hardware configuration of the ethernet PHY can be
+  used without any software interaction over the MDIO interface, so
+  all MII code can be omitted. Say N here if unsure or if you don't
+  need link status reports.
+
+860T FEC Ethernet
+CONFIG_FEC_ENET
+  Enable Ethernet support via the Fast Ethernet Controller (FCC) on
+  the Motorola MPC8260.
+
+Ethernet on FCC1
+CONFIG_FCC1_ENET
+  Use MPC8260 fast Ethernet controller 1 to drive Ethernet (default).
+
+Ethernet on FCC2
+CONFIG_FCC2_ENET
+  Use MPC8260 fast Ethernet controller 2 to drive Ethernet.
+
+Ethernet on FCC3
+CONFIG_FCC3_ENET
+  Use MPC8260 fast Ethernet controller 3 to drive Ethernet.
+
+CPM SCC Ethernet
+CONFIG_SCC_ENET
+  Enable Ethernet support via the Motorola MPC8xx serial
+  communications controller.
+
+# Choice: scc_ethernet
+Ethernet on SCC1
+CONFIG_SCC1_ENET
+  Use MPC8xx serial communications controller 1 to drive Ethernet
+  (default).
+
+Ethernet on SCC2
+CONFIG_SCC2_ENET
+  Use MPC8xx serial communications controller 2 to drive Ethernet.
+
+Ethernet on SCC3
+CONFIG_SCC3_ENET
+  Use MPC8xx serial communications controller 3 to drive Ethernet.
+
+Use Big CPM Ethernet Buffers
+CONFIG_ENET_BIG_BUFFERS
+  Allocate large buffers for MPC8xx Ethernet.  Increases throughput
+  and decreases the likelihood of dropped packets, but costs memory.
+
+Apple Desktop Bus (ADB) support
+CONFIG_ADB
+  Apple Desktop Bus (ADB) support is for support of devices which
+  are connected to an ADB port.  ADB devices tend to have 4 pins.
+  If you have an Apple Macintosh prior to the iMac, or a
+  "Blue and White G3", you probably want to say Y here.  Otherwise
+  say N.
+
+Support for CUDA based PowerMacs
+CONFIG_ADB_CUDA
+  This provides support for CUDA based Power Macintosh systems.  This
+  includes most OldWorld PowerMacs, the first generation iMacs, the
+  Blue&White G3 and the Yikes G4 (PCI Graphics).  All later models
+  should use CONFIG_ADB_PMU instead.
+
+  If unsure say Y.
+
+Support for PMU-based PowerMacs
+CONFIG_ADB_PMU
+  This provides support for PMU based Power Macintosh systems.  This
+  includes all PowerBooks and all AGP-based machines.
+  
+  If unsure say Y.
+
+Include MacIO ADB driver
+CONFIG_ADB_MACIO
+  Say Y here to include direct support for the ADB controller in the
+  Hydra chip used on PowerPC Macintoshes of the CHRP type.  (The Hydra
+  also includes a MESH II SCSI controller, DBDMA controller, VIA chip,
+  OpenPIC controller and two RS422/Geoports.)
+
+Support for ADB keyboard (old driver)
+CONFIG_ADB_KEYBOARD
+  This option allows you to use an ADB keyboard attached to your
+  machine. Note that this disables any other (ie. PS/2) keyboard
+  support, even if your machine is physically capable of using both at
+  the same time.
+
+  If you use an ADB keyboard (4 pin connector), say Y here.
+  If you use a PS/2 keyboard (6 pin connector), say N here.
+
+HIL keyboard support
+CONFIG_HIL
+  The "Human Interface Loop" is a older, 8-channel USB-like controller
+  used in Hewlett Packard PA-RISC based machines.  There are a few
+  cases where it is seen on PC/MAC architectures as well, usually also
+  manufactured by HP.  This driver is based off MACH and BSD drivers,
+  and implements support for a keyboard attached to the HIL port.
+  Full support for the USB-like functions and non-keyboard channels of
+  the HIL is not provided for in this driver.  There are vestiges of
+  mouse support in the driver, but it is probably not working.  The
+  necessary hardware documentation to fully support the HIL controller
+  and interface it to the linux-input API is lacking.
+
+  Enable this option if you intend to use a HIL keyboard.
+
+Include IOP (IIfx/Quadra 9x0) ADB driver
+CONFIG_ADB_IOP
+  The I/O Processor (IOP) is an Apple custom IC designed to provide
+  intelligent support for I/O controllers.  It is described at
+  <http://www.angelfire.com/ca2/dev68k/iopdesc.html> to enable direct
+  support for it, say 'Y' here.
+
+Mac II style Apple Desktop Bus support
+CONFIG_ADB_MACII
+  Say Y here if want your kernel to support Macintosh systems that use
+  the Mac II style ADB.  This includes the II, IIx, IIcx, SE/30, IIci,
+  Quadra 610, Quadra 650, Quadra 700, Quadra 800, Centris 610 and
+  Centris 650.
+
+Mac IIsi style Apple Desktop Bus support
+CONFIG_ADB_MACIISI
+  Say Y here if want your kernel to support Macintosh systems that use
+  the Mac IIsi style ADB.  This includes the IIsi, IIvi, IIvx, Classic
+  II, LC, LC II, LC III, Performa 460, and the Performa 600.
+
+Apple 68K PowerBook Power Management and Desktop Bus support
+CONFIG_ADB_PMU68K
+  Say Y here if want your kernel to support the m68k based Powerbooks.
+  This includes the PowerBook 140, PowerBook 145, PowerBook 150,
+  PowerBook 160, PowerBook 165, PowerBook 165c, PowerBook 170,
+  PowerBook 180, PowerBook, 180c, PowerBook 190cs, PowerBook 520,
+  PowerBook Duo 210, PowerBook Duo 230, PowerBook Duo 250,
+  PowerBook Duo 270c, PowerBook Duo 280 and PowerBook Duo 280c.
+
+Macintosh IIfx/Quadra 900/Quadra 950 floppy support
+CONFIG_BLK_DEV_SWIM_IOP
+  Say Y here to support the SWIM (Super Woz Integrated Machine) IOP
+  floppy controller on the Macintosh IIfx and Quadra 900/950.
+
+Macintosh NS8390 based Ethernet support
+CONFIG_MAC8390
+  If you want to include a driver to support Nubus or LC-PDS
+  Ethernet cards using an NS8390 chipset or its equivalent, say Y
+  and read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+Macintosh CS89x0 based Ethernet support
+CONFIG_MAC89x0
+  Support for CS89x0 chipset based Ethernet cards.  If you have a
+  Nubus or LC-PDS network (Ethernet) card of this type, say Y and
+  read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  This module will
+  be called mac89x0.o.
+
+Macintosh onboard AMD 79C940 MACE based Ethernet support
+CONFIG_MACMACE
+  Support for the onboard AMD 79C940 MACE Ethernet controller used in
+  the 660AV and 840AV Macintosh.  If you have one of these Macintoshes
+  say Y and read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+Macintosh SONIC based Ethernet support (onboard, NuBus, LC, CS)
+CONFIG_MACSONIC
+  Support for NatSemi SONIC based Ethernet devices.  This includes
+  the onboard Ethernet in many Quadras as well as some LC-PDS,
+  a few Nubus and all known Comm Slot Ethernet cards.  If you have
+  one of these say Y and read the Ethernet-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt> as well as
+  <file:Documentation/networking/net-modules.txt>.  This module will
+  be called macsonic.o.
+
+Macintosh NCR5380 SCSI support
+CONFIG_MAC_SCSI
+  This is the NCR 5380 SCSI controller included on most of the 68030
+  based Macintoshes.  If you have one of these say Y and read the
+  SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+Macintosh NCR53c9[46] SCSI support
+CONFIG_SCSI_MAC_ESP
+  This is the NCR 53c9x SCSI controller found on most of the 68040
+  based Macintoshes.  If you have one of these say Y and read the
+  SCSI-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called mac_esp.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+Standard/generic (8250/16550 and compatible UARTs) serial support
+CONFIG_SERIAL
+  This selects whether you want to include the driver for the standard
+  serial ports.  The standard answer is Y.  People who might say N
+  here are those that are setting up dedicated Ethernet WWW/FTP
+  servers, or users that have one of the various bus mice instead of a
+  serial mouse and don't intend to use their machine's standard serial
+  port for anything.  (Note that the Cyclades and Stallion multi
+  serial port drivers do not need this driver built in for them to
+  work.)
+
+  If you want to compile this driver as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called
+  serial.o.
+  [WARNING: Do not compile this driver as a module if you are using
+  non-standard serial ports, since the configuration information will
+  be lost when the driver is unloaded.  This limitation may be lifted
+  in the future.]
+
+  BTW1: If you have a mouseman serial mouse which is not recognized by
+  the X window system, try running gpm first.
+
+  BTW2: If you intend to use a software modem (also called Winmodem)
+  under Linux, forget it.  These modems are crippled and require
+  proprietary drivers which are only available under Windows.
+
+  Most people will say Y or M here, so that they can use serial mice,
+  modems and similar devices connecting to the standard serial ports.
+
+Support for console on serial port
+CONFIG_SERIAL_CONSOLE
+  If you say Y here, it will be possible to use a serial port as the
+  system console (the system console is the device which receives all
+  kernel messages and warnings and which allows logins in single user
+  mode). This could be useful if some terminal or printer is connected
+  to that serial port.
+
+  Even if you say Y here, the currently visible virtual console
+  (/dev/tty0) will still be used as the system console by default, but
+  you can alter that using a kernel command line option such as
+  "console=ttyS1". (Try "man bootparam" or see the documentation of
+  your boot loader (lilo or loadlin) about how to pass options to the
+  kernel at boot time.)
+
+  If you don't have a VGA card installed and you say Y here, the
+  kernel will automatically use the first serial line, /dev/ttyS0, as
+  system console.
+
+  If unsure, say N.
+
+Support for serial port described by EFI HCDP table
+CONFIG_SERIAL_HCDP
+  If you wish to make the serial console port described by the EFI
+  HCDP table available for use as serial console or general
+  purpose port, say Y here. See
+  <http://www.dig64.org/specifications/DIG64_HCDPv10a_01.pdf>.
+
+Support for PowerMac serial ports
+CONFIG_MAC_SERIAL
+  If you have Macintosh style serial ports (8 pin mini-DIN), say Y
+  here. If you also have regular serial ports and enable the driver
+  for them, you can't currently use the serial console feature.
+
+Comtrol Rocketport support
+CONFIG_ROCKETPORT
+  This is a driver for the Comtrol Rocketport cards which provide
+  multiple serial ports. You would need something like this to connect
+  more than two modems to your Linux box, for instance in order to
+  become a dial-in server.
+
+  If you want to compile this driver as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called
+  rocket.o.
+
+Digiboard Intelligent async support
+CONFIG_DIGIEPCA
+  This is a driver for Digi International's Xx, Xeve, and Xem series
+  of cards which provide multiple serial ports. You would need
+  something like this to connect more than two modems to your Linux
+  box, for instance in order to become a dial-in server. This driver
+  supports the original PC (ISA) boards as well as PCI, and EISA. If
+  you have a card like this, say Y here and read the file
+  <file:Documentation/digiepca.txt>.
+
+  NOTE: There is another, separate driver for the Digiboard PC boards:
+  "Digiboard PC/Xx Support" below. You should (and can) only select
+  one of the two drivers.
+
+  If you want to compile this driver as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called epca.o.
+
+Digiboard PC/Xx Support
+CONFIG_DIGI
+  This is a driver for the Digiboard PC/Xe, PC/Xi, and PC/Xeve cards
+  that give you many serial ports. You would need something like this
+  to connect more than two modems to your Linux box, for instance in
+  order to become a dial-in server. If you have a card like that, say
+  Y here and read the file <file:Documentation/digiboard.txt>.
+
+  If you want to compile this driver as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called pcxx.o.
+
+SDL RISCom/8 card support
+CONFIG_RISCOM8
+  This is a driver for the SDL Communications RISCom/8 multiport card,
+  which gives you many serial ports. You would need something like
+  this to connect more than two modems to your Linux box, for instance
+  in order to become a dial-in server. If you have a card like that,
+  say Y here and read the file <file:Documentation/riscom8.txt>.
+
+  Also it's possible to say M here and compile this driver as kernel
+  loadable module; the module will be called riscom8.o.
+
+Computone IntelliPort Plus serial support
+CONFIG_COMPUTONE
+  This driver supports the entire family of Intelliport II/Plus
+  controllers with the exception of the MicroChannel controllers and
+  products previous to the Intelliport II. These are multiport cards,
+  which give you many serial ports. You would need something like this
+  to connect more than two modems to your Linux box, for instance in
+  order to become a dial-in server. If you have a card like that, say
+  Y here and read <file:Documentation/computone.txt>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>. You will get
+  two modules called ip2.o and ip2main.o.
+
+Specialix IO8+ card support
+CONFIG_SPECIALIX
+  This is a driver for the Specialix IO8+ multiport card (both the
+  ISA and the PCI version) which gives you many serial ports. You
+  would need something like this to connect more than two modems to
+  your Linux box, for instance in order to become a dial-in server.
+
+  If you have a card like that, say Y here and read the file
+  <file:Documentation/specialix.txt>. Also it's possible to say M here
+  and compile this driver as kernel loadable module which will be
+  called specialix.o.
+
+Specialix DTR/RTS pin is RTS
+CONFIG_SPECIALIX_RTSCTS
+  The Specialix IO8+ card can only support either RTS or DTR. If you
+  say N here, the driver will use the pin as "DTR" when the tty is in
+  software handshake mode.  If you say Y here or hardware handshake is
+  on, it will always be RTS.  Read the file
+  <file:Documentation/specialix.txt> for more information.
+
+Specialix RIO system support
+CONFIG_RIO
+  This is a driver for the Specialix RIO, a smart serial card which
+  drives an outboard box that can support up to 128 ports.  Product
+  information is at <http://www.sphinxcst.co.uk/perle/multi.htm>.
+  There are both ISA and PCI versions.
+
+Support really old RIO/PCI cards
+CONFIG_RIO_OLDPCI
+  Older RIO PCI cards need some initialization-time configuration to
+  determine the IRQ and some control addresses.  If you have a RIO and
+  this doesn't seem to work, try setting this to Y.
+
+Cyclades async mux support
+CONFIG_CYCLADES
+  This is a driver for a card that gives you many serial ports. You
+  would need something like this to connect more than two modems to
+  your Linux box, for instance in order to become a dial-in server.
+  For information about the Cyclades-Z card, read
+  <file:drivers/char/README.cycladesZ>.
+
+  As of 1.3.9x kernels, this driver's minor numbers start at 0 instead
+  of 32.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called cyclades.o.
+
+  If you haven't heard about it, it's safe to say N.
+
+Cyclades-Z interrupt mode operation
+CONFIG_CYZ_INTR
+  The Cyclades-Z family of multiport cards allows 2 (two) driver op
+  modes: polling and interrupt. In polling mode, the driver will check
+  the status of the Cyclades-Z ports every certain amount of time
+  (which is called polling cycle and is configurable). In interrupt
+  mode, it will use an interrupt line (IRQ) in order to check the
+  status of the Cyclades-Z ports. The default op mode is polling. If
+  unsure, say N.
+
+Stallion multiport serial support
+CONFIG_STALDRV
+  Stallion cards give you many serial ports.  You would need something
+  like this to connect more than two modems to your Linux box, for
+  instance in order to become a dial-in server.  If you say Y here,
+  you will be asked for your specific card model in the next
+  questions.  Make sure to read <file:Documentation/stallion.txt> in
+  this case.  If you have never heard about all this, it's safe to
+  say N.
+
+Stallion EasyIO or EC8/32 support
+CONFIG_STALLION
+  If you have an EasyIO or EasyConnection 8/32 multiport Stallion
+  card, then this is for you; say Y.  Make sure to read
+  <file:Documentation/stallion.txt>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called stallion.o.
+
+Stallion EC8/64, ONboard, Brumby support
+CONFIG_ISTALLION
+  If you have an EasyConnection 8/64, ONboard, Brumby or Stallion
+  serial multiport card, say Y here. Make sure to read
+  <file:Documentation/stallion.txt>.
+
+  To compile it as a module ( = code which can be inserted in and
+  removed from the running kernel whenever you want), say M here and
+  read <file:Documentation/modules.txt>. The module will be called
+  istallion.o.
+
+Microgate SyncLink adapter support
+CONFIG_SYNCLINK
+  Provides support for the SyncLink ISA and PCI multiprotocol serial
+  adapters. These adapters support asynchronous and HDLC bit
+  synchronous communication up to 10Mbps (PCI adapter).
+
+  This driver can only be built as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called synclink.o.  If you want to do that, say M
+  here.
+
+CONFIG_SYNCLINKMP
+  Enable support for the SyncLink Multiport (2 or 4 ports)
+  serial adapter, running asynchronous and HDLC communications up
+  to 2.048Mbps. Each ports is independently selectable for
+  RS-232, V.35, RS-449, RS-530, and X.21
+
+  This driver may be built as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called synclinkmp.o.  If you want to do that, say M
+  here.
+
+Synchronous HDLC line discipline support
+CONFIG_N_HDLC
+  Allows synchronous HDLC communications with tty device drivers that
+  support synchronous HDLC such as the Microgate SyncLink adapter.
+
+  This driver can only be built as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called n_hdlc.o. If you want to do that, say M
+  here.
+
+Specialix SX (and SI) card support
+CONFIG_SX
+  This is a driver for the SX and SI multiport serial cards.
+  Please read the file <file:Documentation/sx.txt> for details.
+
+  This driver can only be built as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called sx.o. If you want to do that, say M here.
+
+Hayes ESP serial port support
+CONFIG_ESPSERIAL
+  This is a driver which supports Hayes ESP serial ports.  Both single
+  port cards and multiport cards are supported.  Make sure to read
+  <file:Documentation/hayes-esp.txt>.
+
+  To compile this driver as a module ( = code which can be inserted in
+  and removed from the running kernel whenever you want), say M here
+  and read <file:Documentation/modules.txt>.  The module will be
+  called esp.o.  If unsure, say N.
+
+Moxa Intellio support
+CONFIG_MOXA_INTELLIO
+  Say Y here if you have a Moxa Intellio multiport serial card.
+
+  This driver can also be built as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called moxa.o. If you want to do that, say M
+  here.
+
+Moxa SmartIO support
+CONFIG_MOXA_SMARTIO
+  Say Y here if you have a Moxa SmartIO multiport serial card.
+
+  This driver can also be built as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called mxser.o. If you want to do that, say M
+  here.
+
+Multi-Tech multiport card support
+CONFIG_ISI
+  This is a driver for the Multi-Tech cards which provide several
+  serial ports.  The driver is experimental and can currently only be
+  built as a module ( = code which can be inserted in and removed from
+  the running kernel whenever you want).  Please read
+  <file:Documentation/modules.txt>.  The module will be called
+  isicom.o.
+
+Unix98 PTY support
+CONFIG_UNIX98_PTYS
+  A pseudo terminal (PTY) is a software device consisting of two
+  halves: a master and a slave. The slave device behaves identical to
+  a physical terminal; the master device is used by a process to
+  read data from and write data to the slave, thereby emulating a
+  terminal. Typical programs for the master side are telnet servers
+  and xterms.
+
+  Linux has traditionally used the BSD-like names /dev/ptyxx for
+  masters and /dev/ttyxx for slaves of pseudo terminals. This scheme
+  has a number of problems. The GNU C library glibc 2.1 and later,
+  however, supports the Unix98 naming standard: in order to acquire a
+  pseudo terminal, a process opens /dev/ptmx; the number of the pseudo
+  terminal is then made available to the process and the pseudo
+  terminal slave can be accessed as /dev/pts/<number>. What was
+  traditionally /dev/ttyp2 will then be /dev/pts/2, for example.
+
+  The entries in /dev/pts/ are created on the fly by a virtual
+  file system; therefore, if you say Y here you should say Y to
+  "/dev/pts file system for Unix98 PTYs" as well.
+
+  If you want to say Y here, you need to have the C library glibc 2.1
+  or later (equal to libc-6.1, check with "ls -l /lib/libc.so.*").
+  Read the instructions in <file:Documentation/Changes> pertaining to
+  pseudo terminals. It's safe to say N.
+
+Maximum number of Unix98 PTYs in use (0-2048)
+CONFIG_UNIX98_PTY_COUNT
+  The maximum number of Unix98 PTYs that can be used at any one time.
+  The default is 256, and should be enough for desktop systems. Server
+  machines which support incoming telnet/rlogin/ssh connections and/or
+  serve several X terminals may want to increase this: every incoming
+  connection and every xterm uses up one PTY.
+
+  When not in use, each additional set of 256 PTYs occupy
+  approximately 8 KB of kernel memory on 32-bit architectures.
+
+Parallel printer support
+CONFIG_PRINTER
+  If you intend to attach a printer to the parallel port of your Linux
+  box (as opposed to using a serial printer; if the connector at the
+  printer has 9 or 25 holes ["female"], then it's serial), say Y.
+  Also read the Printing-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  It is possible to share one parallel port among several devices
+  (e.g. printer and ZIP drive) and it is safe to compile the
+  corresponding drivers into the kernel.  If you want to compile this
+  driver as a module however ( = code which can be inserted in and
+  removed from the running kernel whenever you want), say M here and
+  read <file:Documentation/modules.txt> and
+  <file:Documentation/parport.txt>.  The module will be called lp.o.
+
+  If you have several parallel ports, you can specify which ports to
+  use with the "lp" kernel command line option.  (Try "man bootparam"
+  or see the documentation of your boot loader (lilo or loadlin) about
+  how to pass options to the kernel at boot time.)  The syntax of the
+  "lp" command line option can be found in <file:drivers/char/lp.c>.
+
+  If you have more than 8 printers, you need to increase the LP_NO
+  macro in lp.c and the PARPORT_MAX macro in parport.h.
+
+Support for console on line printer
+CONFIG_LP_CONSOLE
+  If you want kernel messages to be printed out as they occur, you
+  can have a console on the printer. This option adds support for
+  doing that; to actually get it to happen you need to pass the
+  option "console=lp0" to the kernel at boot time.
+
+  If the printer is out of paper (or off, or unplugged, or too
+  busy..) the kernel will stall until the printer is ready again.
+  By defining CONSOLE_LP_STRICT to 0 (at your own risk) you
+  can make the kernel continue when this happens,
+  but it'll lose the kernel messages.
+
+  If unsure, say N.
+
+Support for user-space parallel port device drivers
+CONFIG_PPDEV
+  Saying Y to this adds support for /dev/parport device nodes.  This
+  is needed for programs that want portable access to the parallel
+  port, for instance deviceid (which displays Plug-and-Play device
+  IDs).
+
+  This is the parallel port equivalent of SCSI generic support (sg).
+  It is safe to say N to this -- it is not needed for normal printing
+  or parallel port CD-ROM/disk support.
+
+  This support is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called
+  ppdev.o.
+
+  If unsure, say N.
+
+Cobalt Networks support
+CONFIG_COBALT
+  Support for Cobalt Networks x86-based servers.
+
+Gen III (3000 series) system support
+CONFIG_COBALT_GEN_III
+  This option enables support for the 3000 series of Cobalt Networks
+  systems. This includes the RaQ 3, RaQ 4, and Qube 3 product lines.
+
+  This platform uses an AMD K6-2 processor, an ALI M1541/1533 chipset,
+  an optional NCR 53c875 SCSI controller, and two Intel 82559ER or
+  National Semiconductor DP83815 NICs.
+
+  Getting this option wrong will likely result in a kernel that does
+  not boot. Selecting support for more than 1 system series will add
+  bloat to your kernel, but will not cause anything bad to happen.
+
+  If you have a Cobalt Networks System, but aren't sure what kind,
+  say Y here.
+
+Gen V (5000 series) system support
+CONFIG_COBALT_GEN_V
+  This option enables support for the 5000 series of Cobalt Networks
+  systems. This includes the RaQ XTR product line.
+
+  This platform uses Intel Pentium III Coppermine FCPGA CPUs, the
+  ServerWorks LE chipset (with registered ECC DIMMs only!), two
+  HighPoint HPT370 IDE controllers, and two National Semiconductor
+  DP83815 NICs.
+
+  Getting this option wrong will likely result in a kernel that does
+  not boot. Selecting support for more than 1 system series will add
+  bloat to your kernel, but will not cause anything bad to happen.
+
+  If you have a Cobalt Networks System, but aren't sure what kind,
+  say Y here.
+
+Create legacy /proc files
+CONFIG_COBALT_OLDPROC
+  This option forces some Cobalt Networks drivers to support legacy
+  files in /proc.  Older versions of these drivers exported files
+  directly in /proc, as opposed to the newer /proc/cobalt.  If you say
+  N to this option, the old filenames will no longer be exported.
+  Regardless of your selection here, files in /proc/cobalt will be
+  exported.  Of course, you have to include support for /proc fs, too.
+
+  It is safe to say Y here.
+
+Front panel LCD support
+CONFIG_COBALT_LCD
+  This enables support for the Cobalt Networks front panel.  This is
+  for the LCD panel and buttons.  The primary method for connection is
+  via the parallel port (IO base 0x370), but newer systems use an
+  I2C bus.
+
+  If you have a Cobalt Networks system, you should say Y here.
+
+Software controlled LED support
+CONFIG_COBALT_LED
+  This enables support for the software-controlled LEDs on Cobalt
+  Networks systems.  This includes the fault light and front panel
+  LEDs on the RaQ XTR, the lightbar on the Qube 3, and others.
+
+  If you have a Cobalt Networks system, you should say Y here.
+
+Silicon serial number support
+CONFIG_COBALT_SERNUM
+  This enables support for the on-board serial number on Cobalt
+  Networks systems.  This is a universally-unique 64-bit serial
+  number.  Some systems use a Dallas DS2401 chip, others have an I2C
+  based EEPROM.
+
+  If you select Y here, the files /proc/cobalt/hostid and
+  /proc/cobalt/serialnumber will be created.  The hostid file contains
+  a 32 bit integer generated from the serial number, in binary form.
+  The serialnumber file contains the hexadecimal representation of the
+  serial number, in ASCII.
+
+  If you have a Cobalt Networks system, you should say Y here.
+
+Chipset watchdog timer support
+CONFIG_COBALT_WDT
+  This enables support for the watchdog timer built into Cobalt
+  chipsets.  The timer wakes up periodically, to make find out if
+  system has hung, or disabled interrupts too long.  The result of
+  detecting a hang is a hard reboot.
+
+  If you have a Cobalt Networks system, you should say Y here.
+
+Thermal sensor support
+CONFIG_COBALT_THERMAL
+  This enables support for the thermal sensor(s) built into Cobalt
+  Networks systems.  This driver exports /proc/cobalt/thermal_sensors.
+
+  If you have a Cobalt Networks system, you should say Y here.
+
+Fan tachometer support
+CONFIG_COBALT_FANS
+  This enables support for the fan tachometers built into some Cobalt
+  Networks systems.  This driver exports /proc/cobalt/faninfo.  Some
+  Cobalt software depends on this feature, and enabling it does not
+  cause any risks.
+
+  If you have a Cobalt Networks system, you should say Y here, unless
+  you are absolutely sure.
+
+Disk drive ruler support
+CONFIG_COBALT_RULER
+  This enables support for the cobalt hard drive ruler, found on some
+  Cobalt systems, including the RaQ XTR.  This is the device that
+  enables swapping of drives.  It is not needed for basic disk
+  operation. Enabling this on a system with no ruler will have no
+  adverse effects.
+
+  If you have a Cobalt Networks system, you should say Y here,
+  unless you are absolutely sure.
+
+IT8172G Sound
+CONFIG_SOUND_IT8172
+  Say Y here to support the on-board sound generator on the Integrated
+  Technology Express, Inc. ITE8172 SBC.  Vendor page at
+  <http://www.ite.com.tw/ia/brief_it8172bsp.htm>; picture of the
+  board at <http://www.mvista.com/allies/semiconductor/ite.html>.
+
+I2C support
+CONFIG_I2C
+  I2C (pronounce: I-square-C) is a slow serial bus protocol used in
+  many micro controller applications and developed by Philips.  SMBus,
+  or System Management Bus is a subset of the I2C protocol.  More
+  information is contained in the directory <file:Documentation/i2c/>,
+  especially in the file called "summary" there.
+
+  Both I2C and SMBus are supported here. You will need this for
+  hardware sensors support, and also for Video For Linux support.
+  Specifically, if you want to use a BT848 based frame grabber/overlay
+  boards under Linux, say Y here and also to "I2C bit-banging
+  interfaces", below.
+
+  If you want I2C support, you should say Y here and also to the
+  specific driver for your bus adapter(s) below.  If you say Y to
+  "/proc file system" below, you will then get a /proc interface which
+  is documented in <file:Documentation/i2c/proc-interface>.
+
+  This I2C support is also available as a module.  If you want to
+  compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called i2c-core.o.
+
+UltraSPARC-III bootbus i2c controller driver
+CONFIG_BBC_I2C
+  The BBC devices on the UltraSPARC III have two I2C controllers.  The
+  first I2C controller connects mainly to configuration PROMs (NVRAM,
+  CPU configuration, DIMM types, etc.).  The second I2C controller
+  connects to environmental control devices such as fans and
+  temperature sensors.  The second controller also connects to the
+  smartcard reader, if present.  Say Y to enable support for these.
+
+I2C bit-banging interfaces
+CONFIG_I2C_ALGOBIT
+  This allows you to use a range of I2C adapters called bit-banging
+  adapters.  Say Y if you own an I2C adapter belonging to this class
+  and then say Y to the specific driver for you adapter below.
+
+  This support is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called i2c-algo-bit.o.
+
+Philips style parallel port adapter
+CONFIG_I2C_PHILIPSPAR
+  This supports parallel-port I2C adapters made by Philips.  Say Y if
+  you own such an adapter.
+
+  This driver is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called i2c-philips-par.o.
+
+  Note that if you want support for different parallel port devices,
+  life will be much easier if you compile them all as modules.
+
+ELV adapter
+CONFIG_I2C_ELV
+  This supports parallel-port I2C adapters called ELV.  Say Y if you
+  own such an adapter.
+
+  This driver is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called i2c-elv.o.
+
+Velleman K9000 adapter
+CONFIG_I2C_VELLEMAN
+  This supports the Velleman K9000 parallel-port I2C adapter.  Say Y
+  if you own such an adapter.
+
+  This driver is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called i2c-velleman.o.
+
+I2C PCF 8584 interfaces
+CONFIG_I2C_ALGOPCF
+  This allows you to use a range of I2C adapters called PCF adapters.
+  Say Y if you own an I2C adapter belonging to this class and then say
+  Y to the specific driver for you adapter below.
+
+  This support is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called i2c-algo-pcf.o.
+
+Elektor ISA card
+CONFIG_I2C_ELEKTOR
+  This supports the PCF8584 ISA bus I2C adapter.  Say Y if you own
+  such an adapter.
+
+  This driver is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called i2c-elektor.o.
+
+ITE I2C Algorithm
+CONFIG_ITE_I2C_ALGO
+  This supports the use the ITE8172 I2C interface found on some MIPS
+  systems. Say Y if you have one of these. You should also say Y for
+  the ITE I2C peripheral driver support below.
+
+  This support is also available as a module. If you want to compile
+  it as a modules, say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called i2c-algo-ite.o.
+
+ITE I2C Adapter
+CONFIG_ITE_I2C_ADAP
+  This supports the ITE8172 I2C peripheral found on some MIPS
+  systems. Say Y if you have one of these. You should also say Y for
+  the ITE I2C driver algorithm support above.
+
+  This support is also available as a module. If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called i2c-adap-ite.o.
+
+SiByte I2C Algorithm
+CONFIG_I2C_ALGO_SIBYTE
+  Supports the SiByte SOC on-chip I2C interfaces (2 channels).
+
+MAX1617 Temperature Sensor
+CONFIG_I2C_MAX1617
+  This builds a simple polling driver for the Maxim 1617 temperature
+  sensor.  Currently the device is only supported on a SiByte I2C
+  adapter, and the driver prints status updates to the system log.
+
+I2C device interface
+CONFIG_I2C_CHARDEV
+  Say Y here to use i2c-* device files, usually found in the /dev
+  directory on your system.  They make it possible to have user-space
+  programs use the I2C bus.  Information on how to do this is
+  contained in the file <file:Documentation/i2c/dev-interface>.
+
+  This code is also available as a module.  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called i2c-dev.o.
+
+I2C /proc interface (required for hardware sensors)
+CONFIG_I2C_PROC
+  This provides support for i2c device entries in the /proc filesystem.
+  The entries will be found in /proc/sys/dev/sensors.
+
+  This code is also available as a module. If you want to compile
+  it as a module, say M here and read <file:Documentation/modules.txt>.
+  The module will be called i2c-proc.o.
+
+Bus Mouse Support
+CONFIG_BUSMOUSE
+  Say Y here if your machine has a bus mouse as opposed to a serial
+  mouse. Most people have a regular serial MouseSystem or
+  Microsoft mouse (made by Logitech) that plugs into a COM port
+  (rectangular with 9 or 25 pins). These people say N here. 
+
+  If you have a laptop, you either have to check the documentation or
+  experiment a bit to find out whether the trackball is a serial mouse
+  or not; it's best to say Y here for you.
+
+  This is the generic bus mouse driver code. If you have a bus mouse,
+  you will have to say Y here and also to the specific driver for your
+  mouse below.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called busmouse.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Mouse Support (not serial and bus mice)
+CONFIG_MOUSE
+  This is for machines with a mouse which is neither a serial nor a
+  bus mouse. Examples are PS/2 mice (such as the track balls on some
+  laptops) and some digitizer pads. Most people have a regular serial
+  MouseSystem or Microsoft mouse (made by Logitech) that plugs into a
+  COM port (rectangular with 9 or 25 pins). These people say N here.
+  If you have something else, read the Busmouse-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>. This HOWTO contains
+  information about all non-serial mice, not just bus mice.
+
+  If you have a laptop, you either have to check the documentation or
+  experiment a bit to find out whether the trackball is a serial mouse
+  or not; it's best to say Y here for you.
+
+  Note that the answer to this question won't directly affect the
+  kernel: saying N will just cause the configurator to skip all
+  the questions about non-serial mice. If unsure, say Y.
+
+Logitech busmouse support
+CONFIG_LOGIBUSMOUSE
+  Logitech mouse connected to a proprietary interface card.  It's
+  generally a round connector with 9 pins. Note that the newer mice
+  made by Logitech don't use the Logitech protocol anymore; for those,
+  you don't need this option.  You want to read the Busmouse-HOWTO,
+  available from <http://www.tldp.org/docs.html#howto>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called busmouse.o.  If you are unsure, say N and read the
+  HOWTO nevertheless: it will tell you what you have.
+
+PS/2 mouse (aka "auxiliary device") support
+CONFIG_PSMOUSE
+  The PS/2 mouse connects to a special mouse port that looks much like
+  the keyboard port (small circular connector with 6 pins). This way,
+  the mouse does not use any serial ports. This port can also be used
+  for other input devices like light pens, tablets, keypads. Compaq,
+  AST and IBM all use this as their mouse port on currently shipping
+  machines. The trackballs of some laptops are PS/2 mice also. In
+  particular, the C&T 82C710 mouse on TI Travelmates is a PS/2 mouse.
+
+  Although PS/2 mice are not technically bus mice, they are explained
+  in detail in the Busmouse-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  When using a PS/2 mouse, you can get problems if you want to use the
+  mouse both on the Linux console and under X. Using the "-R" option
+  of the Linux mouse managing program gpm (available from
+  <ftp://gnu.systemy.it/pub/gpm/>) solves this problem, or you can get
+  the "mconv2" utility from <ftp://ibiblio.org/pub/Linux/system/mouse/>.
+
+C&T 82C710 mouse port support (as on TI Travelmate)
+CONFIG_82C710_MOUSE
+  This is a certain kind of PS/2 mouse used on the TI Travelmate. If
+  you are unsure, try first to say N here and come back if the mouse
+  doesn't work. Read the Busmouse-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+PC110 digitizer pad support
+CONFIG_PC110_PAD
+  This drives the digitizer pad on the IBM PC110 palmtop.  It can turn
+  the digitizer pad into a PS/2 mouse emulation with tap gestures or
+  into an absolute pad.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called pc110pad.o.
+
+Microsoft busmouse support
+CONFIG_MS_BUSMOUSE
+  These animals (also called Inport mice) are connected to an
+  expansion board using a round connector with 9 pins. If this is what
+  you have, say Y and read the Busmouse-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you are unsure, say N and read the HOWTO nevertheless: it will
+  tell you what you have. Also be aware that several vendors talk
+  about 'Microsoft busmouse' and actually mean PS/2 busmouse -- so
+  count the pins on the connector.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called msbusmouse.o.
+
+Apple Desktop Bus mouse support
+CONFIG_ADBMOUSE
+  Say Y here if you have this type of bus mouse (4 pin connector) as
+  is common on Macintoshes.  You may want to read the Busmouse-HOWTO,
+  available from <http://www.tldp.org/docs.html#howto>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called adbmouse.o.
+
+ATIXL busmouse support
+CONFIG_ATIXL_BUSMOUSE
+  This is a rare type of busmouse that is connected to the back of an
+  ATI video card.  Say Y if you have one of those. Note however that
+  most mice by ATI are actually Microsoft busmice; you should say Y to
+  "Microsoft busmouse support" above if you have one of those.  Read
+  the Busmouse-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called atixlmouse.o.
+
+  If you are unsure, say N and read the HOWTO nevertheless: it will
+  tell you what you have.
+
+QIC-02 tape support
+CONFIG_QIC02_TAPE
+  If you have a non-SCSI tape drive like that, say Y. Or, if you want
+  to compile this driver as a module ( = code which can be inserted in
+  and removed from the running kernel whenever you want), say M here
+  and read <file:Documentation/modules.txt>. The module will be called
+  tpqic02.o.
+
+iSeries Virtual Tape Support
+CONFIG_VIOTAPE
+  If you are running Linux on an iSeries system and you want Linux
+  to read and/or write a tape drive owned by OS/400, say Y here.
+
+Do you want runtime configuration for QIC-02
+CONFIG_QIC02_DYNCONF
+  You can either configure this driver once and for all by editing a
+  header file (<file:include/linux/tpqic02.h>), in which case you
+  should say N, or you can fetch a program via anonymous FTP which is
+  able to configure this driver during runtime.  The program to do
+  this is called 'qic02conf' and it is part of the
+  tpqic02-support-X.Y.tar.gz support package.
+
+  If you want to use the qic02conf program, say Y.
+
+Floppy tape drive (QIC-80/40/3010/3020/TR-1/TR-2/TR-3) support
+CONFIG_FTAPE
+  If you have a tape drive that is connected to your floppy
+  controller, say Y here.
+
+  Some tape drives (like the Seagate "Tape Store 3200" or the Iomega
+  "Ditto 3200" or the Exabyte "Eagle TR-3") come with a "high speed"
+  controller of their own. These drives (and their companion
+  controllers) are also supported if you say Y here.
+
+  If you have a special controller (such as the CMS FC-10, FC-20,
+  Mountain Mach-II, or any controller that is based on the Intel 82078
+  FDC like the high speed controllers by Seagate and Exabyte and
+  Iomega's "Ditto Dash") you must configure it by selecting the
+  appropriate entries from the "Floppy tape controllers" sub-menu
+  below and possibly modify the default values for the IRQ and DMA
+  channel and the IO base in ftape's configuration menu.
+
+  If you want to use your floppy tape drive on a PCI-bus based system,
+  please read the file <file:drivers/char/ftape/README.PCI>.
+
+  The ftape kernel driver is also available as a runtime loadable
+  module ( = code which can be inserted in and removed from the
+  running kernel whenever you want). If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>. The
+  module will be called ftape.o.
+
+  Note that the Ftape-HOWTO is out of date (sorry) and documents the
+  older version 2.08 of this software but still contains useful
+  information.  There is a web page with more recent documentation at
+  <http://www.instmath.rwth-aachen.de/~heine/ftape/>.  This page
+  always contains the latest release of the ftape driver and useful
+  information (backup software, ftape related patches and
+  documentation, FAQ).  Note that the file system interface has
+  changed quite a bit compared to previous versions of ftape.  Please
+  read <file:Documentation/ftape.txt>.
+
+VFS interface for ftape
+CONFIG_ZFTAPE
+  Normally, you want to say Y or M. DON'T say N here or you
+  WON'T BE ABLE TO USE YOUR FLOPPY TAPE DRIVE.
+
+  The ftape module itself no longer contains the routines necessary
+  to interface with the kernel VFS layer (i.e. to actually write data
+  to and read data from the tape drive).  Instead the file system
+  interface (i.e. the hardware independent part of the driver) has
+  been moved to a separate module.
+
+  If you say M zftape will be compiled as a runtime loadable
+  module ( = code which can be inserted in and removed from the
+  running kernel whenever you want).  In this case you should read
+  <file:Documentation/modules.txt>.  The module will be called
+  zftape.o.
+
+  Regardless of whether you say Y or M here, an additional runtime
+  loadable module called `zft-compressor.o' which contains code to
+  support user transparent on-the-fly compression based on Ross
+  William's lzrw3 algorithm will be produced.  If you have enabled the
+  kernel module loader (i.e. have said Y to "Kernel module loader
+  support", above) then `zft-compressor.o' will be loaded
+  automatically by zftape when needed.
+
+  Despite its name, zftape does NOT use compression by default.  The
+  file <file:Documentation/ftape.txt> contains a short description of
+  the most important changes in the file system interface compared to
+  previous versions of ftape.  The ftape home page
+  <http://www.instmath.rwth-aachen.de/~heine/ftape/> contains
+  further information.
+
+  IMPORTANT NOTE: zftape can read archives created by previous
+  versions of ftape and provide file mark support (i.e. fast skipping
+  between tape archives) but previous version of ftape will lack file
+  mark support when reading archives produced by zftape.
+
+Default block size for zftape
+CONFIG_ZFT_DFLT_BLK_SZ
+  If unsure leave this at its default value, i.e. 10240. Note that
+  you specify only the default block size here. The block size can be
+  changed at run time using the MTSETBLK tape operation with the
+  MTIOCTOP ioctl (i.e. with "mt -f /dev/qft0 setblk #BLKSZ" from the
+  shell command line).
+
+  The probably most striking difference between zftape and previous
+  versions of ftape is the fact that all data must be written or read
+  in multiples of a fixed block size. The block size defaults to
+  10240 which is what GNU tar uses. The values for the block size
+  should be either 1 or multiples of 1024 up to a maximum value of
+  63488 (i.e. 62 K). If you specify `1' then zftape's builtin
+  compression will be disabled.
+
+  Reasonable values are `10240' (GNU tar's default block size),
+  `5120' (afio's default block size), `32768' (default block size some
+  backup programs assume for SCSI tape drives) or `1' (no restriction
+  on block size, but disables builtin compression).
+
+Number of DMA buffers
+CONFIG_FT_NR_BUFFERS
+  Please leave this at `3' unless you REALLY know what you are doing.
+  It is not necessary to change this value. Values below 3 make the
+  proper use of ftape impossible, values greater than 3 are a waste of
+  memory. You can change the amount of DMA memory used by ftape at
+  runtime with "mt -f /dev/qft0 setdrvbuffer #NUMBUFFERS". Each buffer
+  wastes 32 KB of memory. Please note that this memory cannot be
+  swapped out.
+
+Enable procfs status report (+2kb)
+CONFIG_FT_PROC_FS
+  Optional. Saying Y will result in creation of a directory
+  `/proc/ftape' under the /proc file system. The files can be viewed
+  with your favorite pager (i.e. use "more /proc/ftape/history" or
+  "less /proc/ftape/history" or simply "cat /proc/ftape/history"). The
+  file will contain some status information about the inserted
+  cartridge, the kernel driver, your tape drive, the floppy disk
+  controller and the error history for the most recent use of the
+  kernel driver. Saying Y will enlarge the size of the ftape driver
+  by approximately 2 KB.
+
+  WARNING: When compiling ftape as a module (i.e. saying M to "Floppy
+  tape drive") it is dangerous to use ftape's /proc file system
+  interface. Accessing `/proc/ftape' while the module is unloaded will
+  result in a kernel Oops. This cannot be fixed from inside ftape.
+
+# Choice: ftdebug
+Controlling the amount of debugging output of ftape
+CONFIG_FT_NORMAL_DEBUG
+  This option controls the amount of debugging output the ftape driver
+  is ABLE to produce; it does not increase or diminish the debugging
+  level itself. If unsure, leave this at its default setting,
+  i.e. choose "Normal".
+
+  Ftape can print lots of debugging messages to the system console
+  resp. kernel log files. Reducing the amount of possible debugging
+  output reduces the size of the kernel module by some KB, so it might
+  be a good idea to use "None" for emergency boot floppies.
+
+  If you want to save memory then the following strategy is
+  recommended: leave this option at its default setting "Normal" until
+  you know that the driver works as expected, afterwards reconfigure
+  the kernel, this time specifying "Reduced" or "None" and recompile
+  and install the kernel as usual. Note that choosing "Excessive"
+  debugging output does not increase the amount of debugging output
+  printed to the console but only makes it possible to produce
+  "Excessive" debugging output.
+
+  Please read <file:Documentation/ftape.txt> for a short description
+  how to control the amount of debugging output.
+
+Excessive
+CONFIG_FT_FULL_DEBUG
+  Extremely verbose output for driver debugging purposes.
+
+Reduced
+CONFIG_FT_NO_TRACE
+  Reduced tape driver debugging output.
+
+None
+CONFIG_FT_NO_TRACE_AT_ALL
+  Suppress all debugging output from the tape drive.
+
+# Choice: ftcontroller
+The floppy drive controller for ftape
+CONFIG_FT_STD_FDC
+  Only change this setting if you have a special controller. If you
+  didn't plug any add-on card into your computer system but just
+  plugged the floppy tape cable into the already existing floppy drive
+  controller then you don't want to change the default setting,
+  i.e. choose "Standard".
+
+  Choose "MACH-2" if you have a Mountain Mach-2 controller.
+  Choose "FC-10/FC-20" if you have a Colorado FC-10 or FC-20
+  controller.
+  Choose "Alt/82078" if you have another controller that is located at
+  an IO base address different from the standard floppy drive
+  controller's base address of `0x3f0', or uses an IRQ (interrupt)
+  channel different from `6', or a DMA channel different from
+  `2'. This is necessary for any controller card that is based on
+  Intel's 82078 FDC such as Seagate's, Exabyte's and Iomega's "high
+  speed" controllers.
+
+  If you choose something other than "Standard" then please make
+  sure that the settings for the IO base address and the IRQ and DMA
+  channel in the configuration menus below are correct. Use the manual
+  of your tape drive to determine the correct settings!
+
+  If you are already successfully using your tape drive with another
+  operating system then you definitely should use the same settings
+  for the IO base, the IRQ and DMA channel that have proven to work
+  with that other OS.
+
+  Note that this menu lets you specify only the default setting for
+  the hardware setup. The hardware configuration can be changed at
+  boot time (when ftape is compiled into the kernel, i.e. if you
+  have said Y to "Floppy tape drive") or module load time (i.e. if you
+  have said M to "Floppy tape drive").
+
+  Please read also the file <file:Documentation/ftape.txt> which
+  contains a short description of the parameters that can be set at
+  boot or load time. If you want to use your floppy tape drive on a
+  PCI-bus based system, please read the file
+  <file:drivers/char/ftape/README.PCI>.
+
+IO base for the floppy disk controller used with Ftape
+CONFIG_FT_FDC_BASE
+  You don't need to specify a value if the following default
+  settings for the base IO address are correct:
+  <<< MACH-2     : 0x1E0 >>>
+  <<< FC-10/FC-20: 0x180 >>>
+  <<< Secondary  : 0x370 >>>
+  Secondary refers to a secondary FDC controller like the "high speed"
+  controllers delivered by Seagate or Exabyte or Iomega's Ditto Dash.
+  Please make sure that the setting for the IO base address
+  specified here is correct. USE THE MANUAL OF YOUR TAPE DRIVE OR
+  CONTROLLER CARD TO DETERMINE THE CORRECT SETTING. If you are already
+  successfully using the tape drive with another operating system then
+  you definitely should use the same settings for the IO base that has
+  proven to work with that other OS.
+
+  Note that this menu lets you specify only the default setting for
+  the IO base. The hardware configuration can be changed at boot time
+  (when ftape is compiled into the kernel, i.e. if you specified Y to
+  "Floppy tape drive") or module load time (i.e. if you have said M to
+  "Floppy tape drive").
+
+  Please read also the file <file:Documentation/ftape.txt> which
+  contains a short description of the parameters that can be set at
+  boot or load time.
+
+IRQ channel for the floppy disk controller used with Ftape
+CONFIG_FT_FDC_IRQ
+  You don't need to specify a value if the following default
+  settings for the interrupt channel are correct:
+  <<< MACH-2     : 6 >>>
+  <<< FC-10/FC-20: 9 >>>
+  <<< Secondary  : 6 >>>
+  Secondary refers to secondary a FDC controller like the "high speed"
+  controllers delivered by Seagate or Exabyte or Iomega's Ditto Dash.
+  Please make sure that the setting for the IO base address
+  specified here is correct. USE THE MANUAL OF YOUR TAPE DRIVE OR
+  CONTROLLER CARD TO DETERMINE THE CORRECT SETTING. If you are already
+  successfully using the tape drive with another operating system then
+  you definitely should use the same settings for the IO base that has
+  proven to work with that other OS.
+
+  Note that this menu lets you specify only the default setting for
+  the IRQ channel. The hardware configuration can be changed at boot
+  time (when ftape is compiled into the kernel, i.e. if you said Y to
+  "Floppy tape drive") or module load time (i.e. if you said M to
+  "Floppy tape drive").
+
+  Please read also the file <file:Documentation/ftape.txt> which
+  contains a short description of the parameters that can be set at
+  boot or load time.
+
+DMA channel for the floppy disk controller used with Ftape
+CONFIG_FT_FDC_DMA
+  You don't need to specify a value if the following default
+  settings for the DMA channel are correct:
+  <<< MACH-2     : 2 >>>
+  <<< FC-10/FC-20: 3 >>>
+  <<< Secondary  : 2 >>>
+  Secondary refers to a secondary FDC controller like the "high speed"
+  controllers delivered by Seagate or Exabyte or Iomega's Ditto Dash.
+  Please make sure that the setting for the IO base address
+  specified here is correct. USE THE MANUAL OF YOUR TAPE DRIVE OR
+  CONTROLLER CARD TO DETERMINE THE CORRECT SETTING. If you are already
+  successfully using the tape drive with another operating system then
+  you definitely should use the same settings for the IO base that has
+  proven to work with that other OS.
+
+  Note that this menu lets you specify only the default setting for
+  the DMA channel. The hardware configuration can be changed at boot
+  time (when ftape is compiled into the kernel, i.e. if you said Y to
+  "Floppy tape drive") or module load time (i.e. if you said M to
+  "Floppy tape drive").
+
+  Please read also the file <file:Documentation/ftape.txt> which
+  contains a short description of the parameters that can be set at
+  boot or load time.
+
+FDC FIFO Threshold before requesting DMA service
+CONFIG_FT_FDC_THR
+  Set the FIFO threshold of the FDC. If this is higher the DMA
+  controller may serve the FDC after a higher latency time. If this is
+  lower, fewer DMA transfers occur leading to less bus contention.
+  You may try to tune this if ftape annoys you with "reduced data
+  rate because of excessive overrun errors" messages. However, this
+  doesn't seem to have too much effect.
+
+  If unsure, don't touch the initial value, i.e. leave it at "8".
+
+FDC maximum data rate
+CONFIG_FT_FDC_MAX_RATE
+  With some motherboard/FDC combinations ftape will not be able to
+  run your FDC/tape drive combination at the highest available
+  speed. If this is the case you'll encounter "reduced data rate
+  because of excessive overrun errors" messages and lots of retries
+  before ftape finally decides to reduce the data rate.
+
+  In this case it might be desirable to tell ftape beforehand that
+  it need not try to run the tape drive at the highest available
+  speed. If unsure, leave this disabled, i.e. leave it at 2000
+  bits/sec.
+
+Direct Rendering Manager (XFree86 DRI support)
+CONFIG_DRM
+  Kernel-level support for the Direct Rendering Infrastructure (DRI)
+  introduced in XFree86 4.0. If you say Y here, you need to select
+  the module that's right for your graphics card from the list below.
+  These modules provide support for synchronization, security, and
+  DMA transfers. Please see <http://dri.sourceforge.net/> for more
+  details.  You should also select and configure AGP
+  (/dev/agpgart) support.
+
+Build drivers for new (XFree 4.1) DRM
+CONFIG_DRM_NEW
+  If you set this option, the new DRM version needed by XFree86 4.1
+  will be used.  Otherwise, the old DRM version will be used,
+  appropriate for XFree86 4.0.
+
+3dfx Banshee/Voodoo3+
+CONFIG_DRM_TDFX
+  Choose this option if you have a 3dfx Banshee or Voodoo3 (or later),
+  graphics card.  If M is selected, the module will be called tdfx.o.
+
+3dlabs GMX 2000
+CONFIG_DRM_GAMMA
+  Choose this option if you have a 3dlabs GMX 2000 graphics card.
+  If M is selected, the module will be called gamma.o.
+
+ATI Rage 128
+CONFIG_DRM_R128
+  Choose this option if you have an ATI Rage 128 graphics card.  If M
+  is selected, the module will be called r128.o.  AGP support for
+  this card is strongly suggested (unless you have a PCI version).
+
+ATI Radeon
+CONFIG_DRM_RADEON
+  Choose this option if you have an ATI Radeon graphics card.  There
+  are both PCI and AGP versions.  You don't need to choose this to
+  run the Radeon in plain VGA mode.  There is a product page at
+  <http://www.ati.com/na/pages/products/pc/radeon32/index.html>.
+  If M is selected, the module will be called radeon.o.
+
+Intel I810
+CONFIG_DRM_I810
+  Choose this option if you have an Intel I810 graphics card.  If M is
+  selected, the module will be called i810.o.  AGP support is required
+  for this driver to work.
+
+Matrox G200/G400/G450
+CONFIG_DRM_MGA
+  Choose this option if you have a Matrox G200, G400 or G450 graphics
+  card.  If M is selected, the module will be called mga.o.  AGP
+  support is required for this driver to work.
+
+3dfx Banshee/Voodoo3+
+CONFIG_DRM40_TDFX
+  Choose this option if you have a 3dfx Banshee or Voodoo3 (or later),
+  graphics card.  If M is selected, the module will be called tdfx.o.
+
+3dlabs GMX 2000
+CONFIG_DRM40_GAMMA
+  Choose this option if you have a 3dlabs GMX 2000 graphics card.
+  If M is selected, the module will be called gamma.o.
+
+ATI Rage 128
+CONFIG_DRM40_R128
+  Choose this option if you have an ATI Rage 128 graphics card.  If M
+  is selected, the module will be called r128.o.  AGP support for
+  this card is strongly suggested (unless you have a PCI version).
+
+ATI Radeon
+CONFIG_DRM40_RADEON
+  Choose this option if you have an ATI Radeon graphics card.  There
+  are both PCI and AGP versions.  You don't need to choose this to
+  run the Radeon in plain VGA mode.  There is a product page at
+  <http://www.ati.com/na/pages/products/pc/radeon32/index.html>.
+  If M is selected, the module will be called radeon.o.
+
+Intel I810
+CONFIG_DRM40_I810
+  Choose this option if you have an Intel I810 graphics card.  If M is
+  selected, the module will be called i810.o.  AGP support is required
+  for this driver to work.
+
+Matrox G200/G400/G450
+CONFIG_DRM40_MGA
+  Choose this option if you have a Matrox G200, G400 or G450 graphics
+  card.  If M is selected, the module will be called mga.o.  AGP
+  support is required for this driver to work.
+
+Creator/Creator3D/Elite3D
+CONFIG_DRM_FFB
+  Choose this option if you have one of Sun's Creator3D-based graphics
+  and frame buffer cards.  Product page at
+  <http://www.sun.com/desktop/products/Graphics/creator3d.html>.
+
+MTRR (Memory Type Range Register) support
+CONFIG_MTRR
+  On Intel P6 family processors (Pentium Pro, Pentium II and later)
+  the Memory Type Range Registers (MTRRs) may be used to control
+  processor access to memory ranges. This is most useful if you have
+  a video (VGA) card on a PCI or AGP bus. Enabling write-combining
+  allows bus write transfers to be combined into a larger transfer
+  before bursting over the PCI/AGP bus. This can increase performance
+  of image write operations 2.5 times or more. Saying Y here creates a
+  /proc/mtrr file which may be used to manipulate your processor's
+  MTRRs. Typically the X server should use this.
+
+  This code has a reasonably generic interface so that similar
+  control registers on other processors can be easily supported
+  as well:
+
+  The Cyrix 6x86, 6x86MX and M II processors have Address Range
+  Registers (ARRs) which provide a similar functionality to MTRRs. For
+  these, the ARRs are used to emulate the MTRRs.
+  The AMD K6-2 (stepping 8 and above) and K6-3 processors have two
+  MTRRs. The Centaur C6 (WinChip) has 8 MCRs, allowing
+  write-combining. All of these processors are supported by this code
+  and it makes sense to say Y here if you have one of them.
+
+  Saying Y here also fixes a problem with buggy SMP BIOSes which only
+  set the MTRRs for the boot CPU and not for the secondary CPUs. This
+  can lead to all sorts of problems, so it's good to say Y here.
+
+  You can safely say Y even if your machine doesn't have MTRRs, you'll
+  just add about 9 KB to your kernel.
+
+  See <file:Documentation/mtrr.txt> for more information.
+
+CPU clock frequency of your DEC Alpha
+CONFIG_FT_ALPHA_CLOCK
+  On some DEC Alpha machines the CPU clock frequency cannot be
+  determined automatically, so you need to specify it here ONLY if
+  running a DEC Alpha, otherwise this setting has no effect.
+
+Double Talk PC internal speech card support
+CONFIG_DTLK
+  This driver is for the DoubleTalk PC, a speech synthesizer
+  manufactured by RC Systems (<http://www.rcsys.com/>).  It is also
+  called the `internal DoubleTalk'.  If you want to compile this as a
+  module ( = code which can be inserted in and removed from the
+  running kernel whenever you want), say M here and read
+  <file:Documentation/modules.txt>. The module will be called dtlk.o.
+
+Siemens R3964 serial protocol support
+CONFIG_R3964
+  This driver allows synchronous communication with devices using the
+  Siemens R3964 packet protocol. Unless you are dealing with special
+  hardware like PLCs, you are unlikely to need this.
+
+  To compile this driver as a module ( = code which can be inserted in
+  and removed from the running kernel whenever you want), say M here
+  and read <file:Documentation/modules.txt>. The module will be called
+  n_r3964.o.
+
+  If unsure, say N.
+
+Applicom intelligent fieldbus card support
+CONFIG_APPLICOM
+  This driver provides the kernel-side support for the intelligent
+  fieldbus cards made by Applicom International. More information
+  about these cards can be found on the WWW at the address
+  <http://www.applicom-int.com/>, or by email from David Woodhouse
+  <dwmw2@infradead.org>.
+
+  To compile this driver as a module ( = code which can be inserted in
+  and removed from the running kernel whenever you want), say M here
+  and read <file:Documentation/modules.txt>. The module will be called
+  applicom.o.
+
+  If unsure, say N.
+
+Sony Vaio Programmable I/O Control Device support
+CONFIG_SONYPI
+  This driver enables access to the Sony Programmable I/O Control
+  Device which can be found in many (all ?) Sony Vaio laptops.
+
+  If you have one of those laptops, read
+  <file:Documentation/sonypi.txt>, and say Y or M here.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called sonypi.o.
+
+Intel Random Number Generator support
+CONFIG_INTEL_RNG
+  This driver provides kernel-side support for the Random Number
+  Generator hardware found on Intel i8xx-based motherboards.
+
+  Both a character driver, used to read() entropy data, and a timer
+  function which automatically adds entropy directly into the
+  kernel pool, are exported by this driver.
+
+  To compile this driver as a module ( = code which can be inserted in
+  and removed from the running kernel whenever you want), say M here
+  and read <file:Documentation/modules.txt>. The module will be called
+  i810_rng.o.
+
+  If unsure, say N.
+
+Power Management support
+CONFIG_PM
+  "Power Management" means that parts of your computer are shut
+  off or put into a power conserving "sleep" mode if they are not
+  being used.  There are two competing standards for doing this: APM
+  and ACPI.  If you want to use either one, say Y here and then also
+  to the requisite support below.
+
+  Power Management is most important for battery powered laptop
+  computers; if you have a laptop, check out the Linux Laptop home
+  page on the WWW at
+  <http://www.cs.utexas.edu/users/kharker/linux-laptop/> and the
+  Battery Powered Linux mini-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  Note that, even if you say N here, Linux on the x86 architecture
+  will issue the hlt instruction if nothing is to be done, thereby
+  sending the processor to sleep and saving power.
+
+ACPI support
+CONFIG_ACPI
+  ACPI/OSPM support for Linux is currently under development. As such,
+  this support is preliminary and EXPERIMENTAL.  Configuring ACPI
+  support enables kernel interfaces that allow higher level software
+  (OSPM) to manipulate ACPI defined hardware and software interfaces,
+  including the evaluation of ACPI control methods.  If unsure, choose
+  N here.  Note, this option will enlarge your kernel by about 120K.
+
+  This support requires an ACPI compliant platform (hardware/firmware).
+  If both ACPI and Advanced Power Management (APM) support are
+  configured, whichever is loaded first shall be used.
+
+  This code DOES NOT currently provide a complete OSPM implementation
+  -- it has not yet reached APM's level of functionality.  When fully
+  implemented, Linux ACPI/OSPM will provide a more robust functional
+  replacement for legacy configuration and power management
+  interfaces, including the Plug-and-Play BIOS specification (PnP
+  BIOS), the Multi-Processor Specification (MPS), and the Advanced
+  Power Management specification (APM).
+
+  Linux support for ACPI/OSPM is based on Intel Corporation's ACPI
+  Component Architecture (ACPI CA). The latest ACPI CA source code,
+  documentation, debug builds, and implementation status information
+  can be downloaded from:
+  <http://developer.intel.com/technology/iapc/acpi/downloads.htm>.
+
+  The ACPI Sourceforge project may also be of interest:
+  <http://sf.net/projects/acpi/>
+
+ACPI Processor Enumeration for HT
+CONFIG_ACPI_HT_ONLY
+  ACPI enumerates both logical (a.k.a. Hyper-Threaded -- HT)
+  and physical processors.  It is designed to obsolete several older
+  specifications, including the MultiProcessor Specification (MPS),
+  which supported only physical processors.
+
+  CONFIG_ACPI_HT_ONLY includes just the minimal ACPI boot-time code
+  necessary to enumerate logical processors and enable HT.
+
+  CONFIG_ACPI includes this code, plus IO APIC enumeration,
+  and the hooks to run the ACPI AML interpreter for run-time events.
+
+  When CONFIG_ACPI is selected, the command-line option "acpi=ht"
+  is available to run just the ACPI boot-time code -- just as if
+  only CONFIG_ACPI_HT_ONLY were selected.
+
+  Note that "acpi=off" can be used to disable all ACPI code in the kernel.
+
+Enable ACPI 2.0 with errata 1.3
+CONFIG_ACPI20
+  Enable support for the 2.0 version of the ACPI interpreter.  See the
+  help for ACPI for caveats and discussion.
+
+ACPI kernel configuration manager
+CONFIG_ACPI_KERNEL_CONFIG
+  If you say `Y' here, Linux's ACPI support will use the
+  hardware-level system descriptions found on IA64 machines.
+
+ACPI Debug Statements
+CONFIG_ACPI_DEBUG
+  The ACPI driver can optionally report errors with a great deal
+  of verbosity. Saying Y enables these statements. This will increase
+  your kernel size by around 50K.
+
+ACPI Relaxed AML Checking
+CONFIG_ACPI_RELAXED_AML
+  If you say `Y' here, the ACPI interpreter will relax its checking
+  for valid AML and will ignore some AML mistakes, such as off-by-one
+  errors in region sizes.  Some laptops may require this option.  In
+  particular, many Toshiba laptops require this for correct operation
+  of the AC module.
+
+ACPI Bus Manager
+CONFIG_ACPI_BUSMGR
+  The ACPI Bus Manager enumerates devices in the ACPI namespace, and
+  handles PnP messages.  All ACPI devices use its services, so using
+  them requires saying Y here.
+
+ACPI System Driver
+CONFIG_ACPI_SYS
+  This driver will enable your system to shut down using ACPI, and
+  dump your ACPI DSDT table using /proc/acpi/dsdt.
+
+ACPI Processor Driver
+CONFIG_ACPI_CPU
+  This driver installs ACPI as the idle handler for Linux, and uses
+  ACPI C2 and C3 processor states to save power, on systems that
+  support it.
+
+ACPI Button
+CONFIG_ACPI_BUTTON
+  This driver registers for events based on buttons, such as the
+  power, sleep, and lid switch.  In the future, a daemon will read
+  /proc/acpi/event and perform user-defined actions such as shutting
+  down the system.  Until then, you can cat it, and see output when
+  a button is pressed.
+
+CONFIG_ACPI_BATTERY
+  This driver adds support for battery information through
+  /proc/acpi/battery. If you have a mobile system with a battery, 
+  say Y.
+
+CONFIG_ACPI_FAN
+  This driver adds support for ACPI fan devices, allowing user-mode 
+  applications to perform basic fan control (on, off, status).
+
+CONFIG_ACPI_PROCESSOR
+  This driver installs ACPI as the idle handler for Linux, and uses
+  ACPI C2 and C3 processor states to save power, on systems that
+  support it.
+
+ACPI AC Adapter
+CONFIG_ACPI_AC
+  This driver adds support for the AC Adapter object, which indicates
+  whether a system is on AC, or not.  Typically, only laptops have
+  this object, since desktops are always on AC.
+
+ACPI Embedded Controller
+CONFIG_ACPI_EC
+  This driver is required on some systems for the proper operation of
+  the battery and thermal drivers.  If you are compiling for a laptop,
+  say Y.
+
+ACPI Control Method Battery
+CONFIG_ACPI_CMBATT
+  This driver adds support for battery information through
+  /proc/acpi/battery. If you have a laptop with a battery, say Y.
+
+ACPI Thermal
+CONFIG_ACPI_THERMAL
+  This driver handles overheating conditions on laptops. It is HIGHLY
+  recommended, as your laptop CPU may be damaged without it.
+
+ACPI ASUS/Medion Laptop Extras
+CONFIG_ACPI_ASUS
+  This driver provides support for extra features of ACPI-compatible
+  ASUS laptops. As some of Medion laptops are made by ASUS, it may also
+  support some Medion laptops (such as 9675 for example).  It makes all
+  the extra buttons generate standard ACPI events that go through
+  /proc/acpi/events, and (on some models) adds support for changing the
+  display brightness and output, switching the LCD backlight on and off,
+  and most importantly, allows you to blink those fancy LEDs intended
+  for reporting mail and wireless status.
+  
+  All settings are changed via /proc/acpi/asus directory entries. Owner
+  and group for these entries can be set with asus_uid and asus_gid
+  parameters.
+  
+  More information and a userspace daemon for handling the extra buttons
+  at <http://sourceforge.net/projects/acpi4asus/>.
+  
+  If you have an ACPI-compatible ASUS laptop, say Y or M here. This
+  driver is still under development, so if your laptop is unsupported or
+  something works not quite as expected, please use the mailing list
+  available on the above page (acpi4asus-user@lists.sourceforge.net)
+  
+ACPI Toshiba Laptop Extras
+CONFIG_ACPI_TOSHIBA
+  This driver adds support for access to certain system settings
+  on "legacy free" Toshiba laptops.  These laptops can be recognized by
+  their lack of a BIOS setup menu and APM support.
+
+  On these machines, all system configuration is handled through the
+  ACPI.  This driver is required for access to controls not covered
+  by the general ACPI drivers, such as LCD brightness, video output,
+  etc.
+
+  This driver differs from the non-ACPI Toshiba laptop driver (located
+  under "Processor type and features") in several aspects.
+  Configuration is accessed by reading and writing text files in the
+  /proc tree instead of by program interface to /dev.  Furthermore, no
+  power management functions are exposed, as those are handled by the
+  general ACPI drivers.
+
+  More information about this driver is available at
+  <http://memebeam.org/toys/ToshibaAcpiDriver>.
+
+  If you have a legacy free Toshiba laptop (such as the Libretto L1
+  series), say Y.
+
+Advanced Power Management BIOS support
+CONFIG_APM
+  APM is a BIOS specification for saving power using several different
+  techniques. This is mostly useful for battery powered laptops with
+  APM compliant BIOSes. If you say Y here, the system time will be
+  reset after a RESUME operation, the /proc/apm device will provide
+  battery status information, and user-space programs will receive
+  notification of APM "events" (e.g. battery status change).
+
+  If you select "Y" here, you can disable actual use of the APM
+  BIOS by passing the "apm=off" option to the kernel at boot time.
+
+  Note that the APM support is almost completely disabled for
+  machines with more than one CPU.
+
+  In order to use APM, you will need supporting software. For location
+  and more information, read <file:Documentation/pm.txt> and the
+  Battery Powered Linux mini-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>.
+
+  This driver does not spin down disk drives (see the hdparm(8)
+  manpage ("man 8 hdparm") for that), and it doesn't turn off
+  VESA-compliant "green" monitors.
+
+  This driver does not support the TI 4000M TravelMate and the ACER
+  486/DX4/75 because they don't have compliant BIOSes. Many "green"
+  desktop machines also don't have compliant BIOSes, and this driver
+  may cause those machines to panic during the boot phase.
+
+  Generally, if you don't have a battery in your machine, there isn't
+  much point in using this driver and you should say N. If you get
+  random kernel OOPSes or reboots that don't seem to be related to
+  anything, try disabling/enabling this option (or disabling/enabling
+  APM in your BIOS).
+
+  Some other things you should try when experiencing seemingly random,
+  "weird" problems:
+
+   1) make sure that you have enough swap space and that it is
+      enabled.
+   2) pass the "no-hlt" option to the kernel
+   3) switch on floating point emulation in the kernel and pass
+      the "no387" option to the kernel
+   4) pass the "floppy=nodma" option to the kernel
+   5) pass the "mem=4M" option to the kernel (thereby disabling
+      all but the first 4 MB of RAM)
+   6) make sure that the CPU is not over clocked.
+   7) read the sig11 FAQ at <http://www.bitwizard.nl/sig11/>
+   8) disable the cache from your BIOS settings
+   9) install a fan for the video card or exchange video RAM
+   10) install a better fan for the CPU
+   11) exchange RAM chips
+   12) exchange the motherboard.
+
+  To compile this driver as a module ( = code which can be inserted in
+  and removed from the running kernel whenever you want), say M here
+  and read <file:Documentation/modules.txt>. The module will be called
+  apm.o.
+
+Ignore USER SUSPEND
+CONFIG_APM_IGNORE_USER_SUSPEND
+  This option will ignore USER SUSPEND requests. On machines with a
+  compliant APM BIOS, you want to say N. However, on the NEC Versa M
+  series notebooks, it is necessary to say Y because of a BIOS bug.
+
+Enable APM at boot time
+CONFIG_APM_DO_ENABLE
+  Enable APM features at boot time. From page 36 of the APM BIOS
+  specification: "When disabled, the APM BIOS does not automatically
+  power manage devices, enter the Standby State, enter the Suspend
+  State, or take power saving steps in response to CPU Idle calls."
+  This driver will make CPU Idle calls when Linux is idle (unless this
+  feature is turned off -- see "Do CPU IDLE calls", below). This
+  should always save battery power, but more complicated APM features
+  will be dependent on your BIOS implementation. You may need to turn
+  this option off if your computer hangs at boot time when using APM
+  support, or if it beeps continuously instead of suspending. Turn
+  this off if you have a NEC UltraLite Versa 33/C or a Toshiba
+  T400CDT. This is off by default since most machines do fine without
+  this feature.
+
+Make CPU Idle calls when idle
+CONFIG_APM_CPU_IDLE
+  Enable calls to APM CPU Idle/CPU Busy inside the kernel's idle loop.
+  On some machines, this can activate improved power savings, such as
+  a slowed CPU clock rate, when the machine is idle. These idle calls
+  are made after the idle loop has run for some length of time (e.g.,
+  333 mS). On some machines, this will cause a hang at boot time or
+  whenever the CPU becomes idle. (On machines with more than one CPU,
+  this option does nothing.)
+
+Enable console blanking using APM
+CONFIG_APM_DISPLAY_BLANK
+  Enable console blanking using the APM. Some laptops can use this to
+  turn off the LCD backlight when the screen blanker of the Linux
+  virtual console blanks the screen. Note that this is only used by
+  the virtual console screen blanker, and won't turn off the backlight
+  when using the X Window system. This also doesn't have anything to
+  do with your VESA-compliant power-saving monitor. Further, this
+  option doesn't work for all laptops -- it might not turn off your
+  backlight at all, or it might print a lot of errors to the console,
+  especially if you are using gpm.
+
+RTC stores time in GMT
+CONFIG_APM_RTC_IS_GMT
+  Say Y here if your RTC (Real Time Clock a.k.a. hardware clock)
+  stores the time in GMT (Greenwich Mean Time). Say N if your RTC
+  stores localtime.
+
+  It is in fact recommended to store GMT in your RTC, because then you
+  don't have to worry about daylight savings time changes. The only
+  reason not to use GMT in your RTC is if you also run a broken OS
+  that doesn't understand GMT.
+
+Allow interrupts during APM BIOS calls
+CONFIG_APM_ALLOW_INTS
+  Normally we disable external interrupts while we are making calls to
+  the APM BIOS as a measure to lessen the effects of a badly behaving
+  BIOS implementation.  The BIOS should reenable interrupts if it
+  needs to.  Unfortunately, some BIOSes do not -- especially those in
+  many of the newer IBM Thinkpads.  If you experience hangs when you
+  suspend, try setting this to Y.  Otherwise, say N.
+
+Use real mode APM BIOS call to power off
+CONFIG_APM_REAL_MODE_POWER_OFF
+  Use real mode APM BIOS calls to switch off the computer. This is
+  a work-around for a number of buggy BIOSes. Switch this option on if
+  your computer crashes instead of powering off properly.
+
+Watchdog Timer Support
+CONFIG_WATCHDOG
+  If you say Y here (and to one of the following options) and create a
+  character special file /dev/watchdog with major number 10 and minor
+  number 130 using mknod ("man mknod"), you will get a watchdog, i.e.:
+  subsequently opening the file and then failing to write to it for
+  longer than 1 minute will result in rebooting the machine. This
+  could be useful for a networked machine that needs to come back
+  online as fast as possible after a lock-up. There's both a watchdog
+  implementation entirely in software (which can sometimes fail to
+  reboot the machine) and a driver for hardware watchdog boards, which
+  are more robust and can also keep track of the temperature inside
+  your computer. For details, read <file:Documentation/watchdog.txt>
+  in the kernel source.
+
+  The watchdog is usually used together with the watchdog daemon
+  which is available from
+  <ftp://ibiblio.org/pub/Linux/system/daemons/watchdog/>. This daemon can
+  also monitor NFS connections and can reboot the machine when the process
+  table is full.
+
+  If unsure, say N.
+
+Disable watchdog shutdown on close
+CONFIG_WATCHDOG_NOWAYOUT
+  The default watchdog behaviour (which you get if you say N here) is
+  to stop the timer if the process managing it closes the file
+  /dev/watchdog. It's always remotely possible that this process might
+  get killed. If you say Y here, the watchdog cannot be stopped once
+  it has been started.
+
+WDT Watchdog timer
+CONFIG_WDT
+  If you have a WDT500P or WDT501P watchdog board, say Y here,
+  otherwise N. It is not possible to probe for this board, which means
+  that you have to inform the kernel about the IO port and IRQ using
+  the "wdt=" kernel option (try "man bootparam" or see the
+  documentation of your boot loader (lilo or loadlin) about how to
+  pass options to the kernel at boot time).
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called wdt.o.
+
+WDT PCI Watchdog timer
+CONFIG_WDTPCI
+  If you have a PCI WDT500/501 watchdog board, say Y here, otherwise
+  N.  It is not possible to probe for this board, which means that you
+  have to inform the kernel about the IO port and IRQ using the "wdt="
+  kernel option (try "man bootparam" or see the documentation of your
+  boot loader (lilo or loadlin) about how to pass options to the
+  kernel at boot time).
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called wdt_pci.o.
+
+WDT501 features
+CONFIG_WDT_501
+  Saying Y here and creating a character special file /dev/temperature
+  with major number 10 and minor number 131 ("man mknod") will give
+  you a thermometer inside your computer: reading from
+  /dev/temperature yields one byte, the temperature in degrees
+  Fahrenheit. This works only if you have a WDT501P watchdog board
+  installed.
+
+Fan Tachometer
+CONFIG_WDT_501_FAN
+  Enable the Fan Tachometer on the WDT501. Only do this if you have a
+  fan tachometer actually set up.
+
+Software Watchdog
+CONFIG_SOFT_WATCHDOG
+  A software monitoring watchdog. This will fail to reboot your system
+  from some situations that the hardware watchdog will recover
+  from. Equally it's a lot cheaper to install.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+   softdog.o.
+
+Berkshire Products PC Watchdog
+CONFIG_PCWATCHDOG
+  This is the driver for the Berkshire Products PC Watchdog card.
+  This card simply watches your kernel to make sure it doesn't freeze,
+  and if it does, it reboots your computer after a certain amount of
+  time. This driver is like the WDT501 driver but for different
+  hardware. Please read <file:Documentation/pcwd-watchdog.txt>. The PC
+  watchdog cards can be ordered from <http://www.berkprod.com/>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called pcwd.o. If you want to compile it as a module,
+  say M here and read <file:Documentation/modules.txt>.
+
+  Most people will say N.
+
+Acquire SBC Watchdog Timer
+CONFIG_ACQUIRE_WDT
+  This is the driver for the hardware watchdog on the PSC-6x86 Single
+  Board Computer produced by Acquire Inc (and others).  This watchdog
+  simply watches your kernel to make sure it doesn't freeze, and if
+  it does, it reboots your computer after a certain amount of time.
+
+  This driver is like the WDT501 driver but for different hardware.
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called pscwdt.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.  Most
+  people will say N.
+
+Advantech SBC Watchdog Timer
+CONFIG_ADVANTECH_WDT
+  If you are configuring a Linux kernel for the Advantech single-board
+  computer, say `Y' here to support its built-in watchdog timer
+  feature.  See the help for CONFIG_WATCHDOG for discussion.
+
+ALi M7101 Watchdog Timer
+CONFIG_ALIM7101_WDT
+  This is the driver for the hardware watchdog on the ALi M7101 PMU
+  as used in the x86 Cobalt servers.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called alim7101_wdt.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.  Most
+  people will say N.
+
+IB700 SBC Watchdog Timer
+CONFIG_IB700_WDT
+  This is the driver for the hardware watchdog on the IB700 Single
+  Board Computer produced by TMC Technology (www.tmc-uk.com). This watchdog
+  simply watches your kernel to make sure it doesn't freeze, and if
+  it does, it reboots your computer after a certain amount of time.
+
+  This driver is like the WDT501 driver but for slightly different hardware.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called ib700wdt.o. If you want to compile it as a
+  module, say M here and read Documentation/modules.txt. Most people
+  will say N.
+
+Mixcom Watchdog
+CONFIG_MIXCOMWD
+  This is a driver for the Mixcom hardware watchdog cards.  This
+  watchdog simply watches your kernel to make sure it doesn't freeze,
+  and if it does, it reboots your computer after a certain amount of
+  time.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called mixcomwd.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.  Most
+  people will say N.
+
+ZF MachZ Watchdog
+CONFIG_MACHZ_WDT
+  If you are using a ZF Micro MachZ processor, say Y here, otherwise
+  N.  This is the driver for the watchdog timer builtin on that
+  processor using ZF-Logic interface.  This watchdog simply watches
+  your kernel to make sure it doesn't freeze, and if it does, it
+  reboots your computer after a certain amount of time.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called machzwd.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+CONFIG_SC1200_WDT
+  This is a driver for National Semiconductor PC87307/PC97307 hardware
+  watchdog cards as found on the SC1200. This watchdog is mainly used
+  for power management purposes and can be used to power down the device
+  during inactivity periods (includes interrupt activity monitoring).
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called sc1200wdt.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.  Most
+  people will say N.
+
+SuperH Watchdog
+CONFIG_SH_WDT
+  This driver adds watchdog support for the integrated watchdog in the
+  SuperH 3, 4 and 5 processors. If you have one of these processors, say
+  Y, otherwise say N.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called shwdt.o. If you want to compile it as a module,
+  say M here and read Documentation/modules.txt.
+
+Wafer 5823 Watchdog
+CONFIG_WAFER_WDT
+  This is a driver for the hardware watchdog on the ICP Wafer 5823
+  Single Board Computer (and probably other similar models).
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  wafer5823wdt.o
+             
+Machine Check Exception
+CONFIG_X86_MCE
+  Machine Check Exception support allows the processor to notify the
+  kernel if it detects a problem (e.g. overheating, component failure).
+  The action the kernel takes depends on the severity of the problem, 
+  ranging from a warning message on the console, to halting the machine.
+  You can safely select this on machines that do not support this feature.
+
+  For pentium machines the mce support defaults to off as the mainboard
+  support is not always present. You must activate it as a boot option.
+
+Toshiba Laptop support
+CONFIG_TOSHIBA
+  This adds a driver to safely access the System Management Mode of
+  the CPU on Toshiba portables with a genuine Toshiba BIOS. It does
+  not work on models with a Phoenix BIOS. The System Management Mode
+  is used to set the BIOS and power saving options on Toshiba portables.
+
+  For information on utilities to make use of this driver see the
+  Toshiba Linux utilities web site at:
+  <http://www.buzzard.org.uk/toshiba/>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  toshiba.o
+
+  Say Y if you intend to run this kernel on a Toshiba portable.
+  Say N otherwise.
+
+Dell laptop support
+CONFIG_I8K
+  This adds a driver to safely access the System Management Mode
+  of the CPU on the Dell Inspiron and Latitude laptops. The System
+  Management Mode is used to read cpu temperature, cooling fan
+  status and Fn-keys status on Dell laptops. It can also be used
+  to switch the fans on and off.
+
+  The driver has been developed and tested on an Inspiron 8000
+  but it should work on any Dell Inspiron or Latitude laptop.
+  You can force loading on unsupported models by passing the
+  parameter `force=1' to the module. Use at your own risk.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  i8k.o
+
+  For more information on this driver and for utilities that make
+  use of the module see the I8K Linux Utilities web site at:
+  <http://www.debian.org/~dz/i8k/>.
+
+  Say Y if you intend to run this kernel on a Dell laptop.
+  Say N otherwise.
+
+/dev/cpu/microcode - Intel IA32 CPU microcode support
+CONFIG_MICROCODE
+  If you say Y here and also to "/dev file system support" in the
+  'File systems' section, you will be able to update the microcode on
+  Intel processors in the IA32 family, e.g. Pentium Pro, Pentium II,
+  Pentium III, Pentium 4, Xeon etc.  You will obviously need the
+  actual microcode binary data itself which is not shipped with the
+  Linux kernel.
+
+  For latest news and information on obtaining all the required
+  ingredients for this driver, check:
+  <http://www.urbanmyth.org/microcode/>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called microcode.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.  If
+  you use modprobe or kmod you may also want to add the line
+  'alias char-major-10-184 microcode' to your /etc/modules.conf file.
+
+/dev/cpu/*/msr - Model-specific register support
+CONFIG_X86_MSR
+  This device gives privileged processes access to the x86
+  Model-Specific Registers (MSRs).  It is a character device with
+  major 202 and minors 0 to 31 for /dev/cpu/0/msr to /dev/cpu/31/msr.
+  MSR accesses are directed to a specific CPU on multi-processor
+  systems.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  msr.o
+
+/dev/cpu/*/cpuid - CPU information support
+CONFIG_X86_CPUID
+  This device gives processes access to the x86 CPUID instruction to
+  be executed on a specific processor.  It is a character device
+  with major 203 and minors 0 to 31 for /dev/cpu/0/cpuid to
+  /dev/cpu/31/cpuid.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  cpuid.o
+
+SBC-60XX Watchdog Timer
+CONFIG_60XX_WDT
+ This driver can be used with the watchdog timer found on some
+ single board computers, namely the 6010 PII based computer.
+ It may well work with other cards.  It reads port 0x443 to enable
+ and re-set the watchdog timer, and reads port 0x45 to disable
+ the watchdog.  If you have a card that behave in similar ways,
+ you can probably make this driver work with your card as well.
+
+ You can compile this driver directly into the kernel, or use
+ it as a module.  The module will be called sbc60xxwdt.o.
+
+Eurotech CPU-1220/1410 Watchdog Timer
+CONFIG_EUROTECH_WDT
+  Enable support for the watchdog timer on the Eurotech CPU-1220 and 
+  CPU-1410 cards.  These are PC/104 SBCs. Spec sheets and product 
+  information are at <http://www.eurotech.it/>.
+
+W83877F Watchdog Timer
+CONFIG_W83877F_WDT
+ This is the driver for the hardware watchdog on the W83877F chipset
+ as used in EMACS PC-104 motherboards (and may work on others). This
+ watchdog simply watches your kernel to make sure it doesn't freeze,
+ and if it does, it reboots your computer after a certain amount of
+ time.
+
+ You can compile this driver directly into the kernel, or use
+ it as a module.  The module will be called w83877f_wdt.o.
+
+SC520 (AMD Elan) Watchdog Timer
+CONFIG_SC520_WDT
+ This is the driver for the hardware watchdog built in to the
+ AMD "Elan" SC520 microcomputer commonly used in embedded systems.
+ This watchdog simply watches your kernel to make sure it doesn't
+ freeze, and if it does, it reboots your computer after a certain
+ amount of time.
+
+ You can compile this driver directly into the kernel, or use
+ it as a module.  The module will be called sc520_wdt.o.
+
+Enhanced Real Time Clock Support
+CONFIG_RTC
+  If you say Y here and create a character special file /dev/rtc with
+  major number 10 and minor number 135 using mknod ("man mknod"), you
+  will get access to the real time clock (or hardware clock) built
+  into your computer.
+
+  Every PC has such a clock built in. It can be used to generate
+  signals from as low as 1Hz up to 8192Hz, and can also be used
+  as a 24 hour alarm. It reports status information via the file
+  /proc/driver/rtc and its behaviour is set by various ioctls on
+  /dev/rtc.
+
+  If you run Linux on a multiprocessor machine and said Y to
+  "Symmetric Multi Processing" above, you should say Y here to read
+  and set the RTC in an SMP compatible fashion.
+
+  If you think you have a use for such a device (such as periodic data
+  sampling), then say Y here, and read <file:Documentation/rtc.txt>
+  for details.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called rtc.o. If you want to compile it as a module,
+  say M here and read <file:Documentation/modules.txt>.
+
+Generic MIPS RTC Support
+CONFIG_MIPS_RTC
+
+  If your machine is a MIPS machine, this option provides a simple,
+  generic RTC driver for /dev/rtc device.  It only implements two IOCTL 
+  operations of the standard PC RTC driver: RTC_RD_TIME and RTC_SET_TIME.
+  It is sufficient to run hwclock program. 
+
+  You should say Y here if there is no machine-specific RTC driver for your
+  MIPS machine but you do want a simple RTC driver for your RTC device.
+
+Generic Real Time Clock Support
+CONFIG_GEN_RTC
+  If you say Y here and create a character special file /dev/rtc with
+  major number 10 and minor number 135 using mknod ("man mknod"), you
+  will get access to the real time clock (or hardware clock) built
+  into your computer.
+
+  In 2.4 and later kernels this is the only way to set and get rtc
+  time on m68k systems so it is highly recommended.
+
+  It reports status information via the file /proc/driver/rtc and its 
+  behaviour is set by various ioctls on /dev/rtc. If you enable the
+  "extended RTC operation" below it will also provide an emulation
+  for RTC_UIE which is required by some programs and may improve
+  precision in some cases.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called genrtc.o. If you want to compile it as a module,
+  say M here and read <file:Documentation/modules.txt>. To load the
+  module automatically add 'alias char-major-10-135 genrtc' to your
+  /etc/modules.conf
+
+Extended RTC operation
+CONFIG_GEN_RTC_X
+  Provides an emulation for RTC_UIE which is required by some programs 
+  and may improve precision of the generic RTC support in some cases.
+
+Tadpole ANA H8 Support
+CONFIG_H8
+  The Hitachi H8/337 is a microcontroller used to deal with the power
+  and thermal environment. If you say Y here, you will be able to
+  communicate with it via a character special device.
+
+  If unsure, say N.
+
+/dev/nvram support
+CONFIG_NVRAM
+  If you say Y here and create a character special file /dev/nvram
+  with major number 10 and minor number 144 using mknod ("man mknod"),
+  you get read and write access to the extra bytes of non-volatile
+  memory in the real time clock (RTC), which is contained in every PC
+  and most Ataris.  The actual number of bytes varies, depending on the
+  nvram in the system, but is usually 114 (128-14 for the RTC).
+
+  This memory is conventionally called "CMOS RAM" on PCs and "NVRAM"
+  on Ataris. /dev/nvram may be used to view settings there, or to
+  change them (with some utility). It could also be used to frequently
+  save a few bits of very important data that may not be lost over
+  power-off and for which writing to disk is too insecure. Note
+  however that most NVRAM space in a PC belongs to the BIOS and you
+  should NEVER idly tamper with it. See Ralf Brown's interrupt list
+  for a guide to the use of CMOS bytes by your BIOS.
+
+  On Atari machines, /dev/nvram is always configured and does not need
+  to be selected.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called nvram.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Joystick support
+CONFIG_JOYSTICK
+  If you have a joystick, 6dof controller, gamepad, steering wheel,
+  weapon control system or something like that you can say Y here to
+  enable generic support for these controllers. You will also need to
+  say Y or M to at least one of the hardware specific drivers. This
+  will make the controllers available as /dev/input/jsX devices.
+  Please read the file <file:Documentation/input/joystick.txt> which
+  contains more information and the location of the joystick package
+  that you'll need.
+
+Game port support
+CONFIG_INPUT_GAMEPORT
+  Gameport support is for the standard 15-pin PC gameport.  If you
+  have a joystick, gamepad, gameport card, a soundcard with a gameport
+  or anything else that uses the gameport, say Y or M here and also to
+  at least one of the hardware specific drivers.
+  Please read the file <file:Documentation/input/joystick.txt> which
+  contains more information and the location of the joystick package
+  that you'll need if you use the gameport with a joystick.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called gameport.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+Classic ISA/PnP gameports
+CONFIG_INPUT_NS558
+  Say Y here if you have an ISA or PnP gameport.
+  For more information on how to use the driver please read
+  <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ns558.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+PDPI Lightning 4 gamecard
+CONFIG_INPUT_LIGHTNING
+  Say Y here if you have a PDPI Lightning 4 gamecard. For more
+  information on how to use the driver please read
+  <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called lightning.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+Crystal SoundFusion gameports
+CONFIG_INPUT_CS461X
+  Say Y here if you have a Cirrus CS461x aka "Crystal SoundFusion"
+  PCI audio accelerator.  A product page for the CS4614 is at
+  <http://www.cirrus.com/design/products/overview/index.cfm?ProductID=40>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called cs461x.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Aureal Vortex, Trident 4DWave, and ALi 5451 gameports
+CONFIG_INPUT_PCIGAME
+  Say Y here if you have a Trident 4DWave DX/NX or Aureal Vortex 1/2
+  card or an ALi 5451 chip on your motherboard. For more information
+  on how to use the driver please read
+  <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called pcigame.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+SoundBlaster Live! gameports
+CONFIG_INPUT_EMU10K1
+  Say Y here if you have a SoundBlaster Live! card and want to use
+  its gameport.  For more information on how to use the driver
+  please read <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called emu10k1-gp.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+Classic PC analog joysticks and gamepads
+CONFIG_INPUT_ANALOG
+  Say Y here if you have a controller that connects to the PC
+  gameport.  This supports many different types, including joysticks
+  with throttle control, with rudders, or with extensions like
+  additional hats and buttons compatible with CH Flightstick Pro,
+  ThrustMaster FCS, 6 and 8 button gamepads, or Saitek Cyborg
+  joysticks.  For more information on how to use the driver please
+  read <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called analog.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Assassin 3D and MadCatz Panther devices
+CONFIG_INPUT_A3D
+  Say Y here if you have an FPGaming or MadCatz controller using the
+  A3D protocol over the PC gameport.  For more information on how to
+  use the driver please read <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called a3d.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Logitech ADI digital joysticks and gamepads
+CONFIG_INPUT_ADI
+  Say Y here if you have a Logitech controller using the ADI
+  protocol over the PC gameport. For more information on how to use
+  the driver please read <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called adi.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Creative Labs Blaster Cobra gamepad
+CONFIG_INPUT_COBRA
+  Say Y here if you have a Creative Labs Blaster Cobra gamepad.
+  For more information on how to use the driver please read
+  <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called cobra.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Genius Flight2000 Digital joysticks and gamepads
+CONFIG_INPUT_GF2K
+  Say Y here if you have a Genius Flight2000 or MaxFighter digitally
+  communicating joystick or gamepad.  For more information on how to
+  use the driver please read <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called gf2k.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Gravis GrIP joysticks and gamepads
+CONFIG_INPUT_GRIP
+  Say Y here if you have a Gravis controller using the GrIP protocol
+  over the PC gameport.  For more information on how to use the driver
+  please read <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called grip.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+InterAct digital joysticks and gamepads
+CONFIG_INPUT_INTERACT
+  Say Y hereif you have an InterAct gameport or joystick
+  communicating digitally over the gameport.  For more information on
+  how to use the driver please read <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called interact.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+ThrustMaster DirectConnect joysticks and gamepads
+CONFIG_INPUT_TMDC
+  Say Y here if you have a ThrustMaster controller using the
+  DirectConnect (BSP) protocol over the PC gameport.  For more
+  information on how to use the driver please read
+  <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called tmdc.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Microsoft SideWinder digital joysticks and gamepads
+CONFIG_INPUT_SIDEWINDER
+  Say Y here if you have a Microsoft controller using the Digital
+  Overdrive protocol over PC gameport.  For more information on how to
+  use the driver please read <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called sidewinder.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+Serial port device support
+CONFIG_INPUT_SERIO
+  Say Y here and to the Serial port input line discipline option if
+  you plan to use a joystick that communicates over the serial (COM)
+  port.  For more information on how to use the driver please read
+  <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called sidewinder.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+Serial port input line discipline
+CONFIG_INPUT_SERPORT
+  Say Y here if you plan to use a joystick that communicates over the
+  serial (COM) port.  For more information on how to use the driver
+  please read <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called serport.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Logitech WingMan Warrior joystick
+CONFIG_INPUT_WARRIOR
+  Say Y here if you have a Logitech WingMan Warrior joystick connected
+  to your computer's serial port.  For more information on how to use
+  the driver please read <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called warrior.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+LogiCad3d Magellan/SpaceMouse 6dof controller
+CONFIG_INPUT_MAGELLAN
+  Say Y here if you have a Magellan or Space Mouse 6DOF controller
+  connected to your computer's serial port.  For more information on
+  how to use the driver please read <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called magellan.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+SpaceTec SpaceOrb/Avenger 6dof controller
+CONFIG_INPUT_SPACEORB
+  Say Y here if you have a SpaceOrb 360 or SpaceBall Avenger 6DOF
+  controller connected to your computer's serial port.  For more
+  information on how to use the driver please read
+  <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called spaceorb.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+SpaceTec SpaceBall 4000 FLX 6dof controller
+CONFIG_INPUT_SPACEBALL
+  Say Y here if you have a SpaceTec SpaceBall 4000 FLX controller
+  connected to your computer's serial port.  For more information on
+  how to use the driver please read <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called spaceball.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+Gravis Stinger gamepad
+CONFIG_INPUT_STINGER
+  Say Y here if you have a Gravis Stinger connected to one of your
+  serial ports.  For more information on how to use the driver please
+  read <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called stinger.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+I-Force joysticks/wheels
+CONFIG_INPUT_IFORCE_232
+  Say Y here if you have an I-Force joystick or steering wheel
+  connected to your serial (COM) port.  For more information on how
+  to use the driver please read <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called iforce.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+I-Force joysticks/wheels
+CONFIG_INPUT_IFORCE_USB
+  Say Y here if you have an I-Force joystick or steering wheel
+  connected to your USB port.  For more information on how to use the
+  driver please read <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called iforce.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Multisystem, Sega Genesis, Saturn joysticks and gamepads
+CONFIG_INPUT_DB9
+  Say Y here if you have a Sega Master System gamepad, Sega Genesis
+  gamepad, Sega Saturn gamepad, or a Multisystem -- Atari, Amiga,
+  Commodore, Amstrad CPC joystick connected to your parallel port.
+  For more information on how to use the driver please read
+  <file:Documentation/input/joystick.txt> and
+  <file:Documentation/input/joystick-parport.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called db9.o.  If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Multisystem, NES, SNES, N64, PSX joysticks and gamepads
+CONFIG_INPUT_GAMECON
+  Say Y here if you have a Nintendo Entertainment System gamepad,
+  Super Nintendo Entertainment System gamepad, Nintendo 64 gamepad,
+  Sony PlayStation gamepad or a Multisystem -- Atari, Amiga,
+  Commodore, Amstrad CPC joystick connected to your parallel port.
+  For more information on how to use the driver please read
+  <file:Documentation/input/joystick.txt> and
+  <file:Documentation/input/joystick-parport.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called gamecon.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Multisystem joysticks via TurboGraFX device
+CONFIG_INPUT_TURBOGRAFX
+  Say Y here if you have the TurboGraFX interface by Steffen Schwenke,
+  and want to use it with Multisystem -- Atari, Amiga, Commodore,
+  Amstrad CPC joystick.  For more information on how to use the driver
+  please read <file:Documentation/input/joystick.txt> and
+  <file:Documentation/input/joystick-parport.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called turbografx.o.  If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+Amiga joysticks
+CONFIG_INPUT_AMIJOY
+  Say Y here if you have an Amiga with a digital joystick connected
+  to it.  For more information on how to use the driver please read
+  <file:Documentation/input/joystick.txt>.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called joy-amiga.o.  If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+Atomwide serial port support
+CONFIG_ATOMWIDE_SERIAL
+  If you have an Atomwide Serial card for an Acorn system, say Y to
+  this option.  The driver can handle 1, 2, or 3 port cards.
+  If unsure, say N.
+
+Dual serial port support
+CONFIG_DUALSP_SERIAL
+  If you have the Serial Port's dual serial card for an Acorn system,
+  say Y to this option.  If unsure, say N.
+
+NetWinder Button
+CONFIG_NWBUTTON
+  If you say Y here and create a character device node /dev/nwbutton
+  with major and minor numbers 10 and 158 ("man mknod"), then every
+  time the orange button is pressed a number of times, the number of
+  times the button was pressed will be written to that device.
+
+  This is most useful for applications, as yet unwritten, which
+  perform actions based on how many times the button is pressed in a
+  row.
+
+  Do not hold the button down for too long, as the driver does not
+  alter the behaviour of the hardware reset circuitry attached to the
+  button; it will still execute a hard reset if the button is held
+  down for longer than approximately five seconds.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called
+  nwbutton.o.
+
+  Most people will answer Y to this question and "Reboot Using Button"
+  below to be able to initiate a system shutdown from the button.
+
+Reboot Using Button
+CONFIG_NWBUTTON_REBOOT
+  If you say Y here, then you will be able to initiate a system
+  shutdown and reboot by pressing the orange button a number of times.
+  The number of presses to initiate the shutdown is two by default,
+  but this can be altered by modifying the value of NUM_PRESSES_REBOOT
+  in nwbutton.h and recompiling the driver or, if you compile the
+  driver as a module, you can specify the number of presses at load
+  time with "insmod button reboot_count=<something>".
+
+Sound card support
+CONFIG_SOUND
+  If you have a sound card in your computer, i.e. if it can say more
+  than an occasional beep, say Y.  Be sure to have all the information
+  about your sound card and its configuration down (I/O port,
+  interrupt and DMA channel), because you will be asked for it.
+
+  You want to read the Sound-HOWTO, available from
+  <http://www.tldp.org/docs.html#howto>. General information about
+  the modular sound system is contained in the files
+  <file:Documentation/sound/Introduction>.  The file
+  <file:Documentation/sound/README.OSS> contains some slightly
+  outdated but still useful information as well.
+
+  If you have a PnP sound card and you want to configure it at boot
+  time using the ISA PnP tools (read
+  <http://www.roestock.demon.co.uk/isapnptools/>), then you need to
+  compile the sound card support as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want)
+  and load that module after the PnP configuration is finished.  To do
+  this, say M here and read <file:Documentation/modules.txt> as well
+  as <file:Documentation/sound/README.modules>; the module will be
+  called soundcore.o.
+
+  I'm told that even without a sound card, you can make your computer
+  say more than an occasional beep, by programming the PC speaker.
+  Kernel patches and supporting utilities to do that are in the pcsp
+  package, available at <ftp://ftp.infradead.org/pub/pcsp/>.
+
+OSS sound modules
+CONFIG_SOUND_OSS
+  OSS is the Open Sound System suite of sound card drivers.  They make
+  sound programming easier since they provide a common API.  Say Y or
+  M here (the module will be called sound.o) if you haven't found a
+  driver for your sound card above, then pick your driver from the
+  list below.
+
+Persistent DMA buffers
+CONFIG_SOUND_DMAP
+  Linux can often have problems allocating DMA buffers for ISA sound
+  cards on machines with more than 16MB of RAM. This is because ISA
+  DMA buffers must exist below the 16MB boundary and it is quite
+  possible that a large enough free block in this region cannot be
+  found after the machine has been running for a while. If you say Y
+  here the DMA buffers (64Kb) will be allocated at boot time and kept
+  until the shutdown. This option is only useful if you said Y to
+  "OSS sound modules", above. If you said M to "OSS sound modules"
+  then you can get the persistent DMA buffer functionality by passing
+  the command-line argument "dmabuf=1" to the sound.o module.
+
+  Say Y unless you have 16MB or less RAM or a PCI sound card.
+
+Support for Aztech Sound Galaxy (non-PnP) cards
+CONFIG_SOUND_SGALAXY
+  This module initializes the older non Plug and Play sound galaxy
+  cards from Aztech. It supports the Waverider Pro 32 - 3D and the
+  Galaxy Washington 16.
+
+  If you compile the driver into the kernel, you have to add
+  "sgalaxy=<io>,<irq>,<dma>,<dma2>,<sgbase>" to the kernel command
+  line.
+
+Support for AD1816(A) based cards
+CONFIG_SOUND_AD1816
+  Say M here if you have a sound card based on the Analog Devices
+  AD1816(A) chip.
+
+  If you compile the driver into the kernel, you have to add
+  "ad1816=<io>,<irq>,<dma>,<dma2>" to the kernel command line.
+
+Yamaha OPL3-SA1 audio controller
+CONFIG_SOUND_OPL3SA1
+  Say Y or M if you have a Yamaha OPL3-SA1 sound chip, which is
+  usually built into motherboards. Read
+  <file:Documentation/sound/OPL3-SA> for details.
+
+  If you compile the driver into the kernel, you have to add
+  "opl3sa=<io>,<irq>,<dma>,<dma2>,<mpuio>,<mpuirq>" to the kernel
+  command line.
+
+ProAudioSpectrum 16 support
+CONFIG_SOUND_PAS
+  Answer Y only if you have a Pro Audio Spectrum 16, ProAudio Studio
+  16 or Logitech SoundMan 16 sound card. Answer N if you have some
+  other card made by Media Vision or Logitech since those are not
+  PAS16 compatible. Please read <file:Documentation/sound/PAS16>.
+  It is not necessary to add Sound Blaster support separately; it
+  is included in PAS support.
+
+  If you compile the driver into the kernel, you have to add
+  "pas2=<io>,<irq>,<dma>,<dma2>,<sbio>,<sbirq>,<sbdma>,<sbdma2>
+  to the kernel command line.
+
+Enable PAS16 joystick port
+CONFIG_PAS_JOYSTICK
+  Say Y here to enable the Pro Audio Spectrum 16's auxiliary joystick
+  port.
+
+100% Sound Blaster compatibles (SB16/32/64, ESS, Jazz16) support
+CONFIG_SOUND_SB
+  Answer Y if you have an original Sound Blaster card made by Creative
+  Labs or a 100% hardware compatible clone (like the Thunderboard or
+  SM Games). For an unknown card you may answer Y if the card claims
+  to be Sound Blaster-compatible.
+
+  Please read the file <file:Documentation/sound/Soundblaster>.
+
+  You should also say Y here for cards based on the Avance Logic
+  ALS-007 and ALS-1X0 chips (read <file:Documentation/sound/ALS>) and
+  for cards based on ESS chips (read
+  <file:Documentation/sound/ESS1868> and
+  <file:Documentation/sound/ESS>). If you have an SB AWE 32 or SB AWE
+  64, say Y here and also to "AWE32 synth" below and read
+  <file:Documentation/sound/INSTALL.awe>. If you have an IBM Mwave
+  card, say Y here and read <file:Documentation/sound/mwave>.
+
+  If you compile the driver into the kernel and don't want to use
+  isapnp, you have to add "sb=<io>,<irq>,<dma>,<dma2>" to the kernel
+  command line.
+
+  You can say M here to compile this driver as a module; the module is
+  called sb.o.
+
+Gravis Ultrasound support
+CONFIG_SOUND_GUS
+  Say Y here for any type of Gravis Ultrasound card, including the GUS
+  or GUS MAX.  See also <file:Documentation/sound/ultrasound> for more
+  information on configuring this card with modules.
+
+  If you compile the driver into the kernel, you have to add
+  "gus=<io>,<irq>,<dma>,<dma2>" to the kernel command line.
+
+MPU-401 support (NOT for SB16)
+CONFIG_SOUND_MPU401
+  Be careful with this question.  The MPU401 interface is supported by
+  all sound cards.  However, some natively supported cards have their
+  own driver for MPU401.  Enabling this MPU401 option with these cards
+  will cause a conflict.  Also, enabling MPU401 on a system that
+  doesn't really have a MPU401 could cause some trouble.  If your card
+  was in the list of supported cards, look at the card specific
+  instructions in the <file:Documentation/sound/README.OSS> file.  It
+  is safe to answer Y if you have a true MPU401 MIDI interface card.
+
+  If you compile the driver into the kernel, you have to add
+  "mpu401=<io>,<irq>" to the kernel command line.
+
+6850 UART support
+CONFIG_SOUND_UART6850
+  This option enables support for MIDI interfaces based on the 6850
+  UART chip. This interface is rarely found on sound cards. It's safe
+  to answer N to this question.
+
+  If you compile the driver into the kernel, you have to add
+  "uart6850=<io>,<irq>" to the kernel command line.
+
+PSS (AD1848, ADSP-2115, ESC614) support
+CONFIG_SOUND_PSS
+  Answer Y or M if you have an Orchid SW32, Cardinal DSP16, Beethoven
+  ADSP-16 or some other card based on the PSS chipset (AD1848 codec +
+  ADSP-2115 DSP chip + Echo ESC614 ASIC CHIP). For more information on
+  how to compile it into the kernel or as a module see the file
+  <file:Documentation/sound/PSS>.
+
+  If you compile the driver into the kernel, you have to add
+  "pss=<io>,<mssio>,<mssirq>,<mssdma>,<mpuio>,<mpuirq>" to the kernel
+  command line.
+
+Enable PSS mixer (Beethoven ADSP-16 and other compatible)
+CONFIG_PSS_MIXER
+  Answer Y for Beethoven ADSP-16. You may try to say Y also for other
+  cards if they have master volume, bass, treble, and you can't
+  control it under Linux. If you answer N for Beethoven ADSP-16, you
+  can't control master volume, bass, treble and synth volume.
+
+  If you said M to "PSS support" above, you may enable or disable this
+  PSS mixer with the module parameter pss_mixer. For more information
+  see the file <file:Documentation/sound/PSS>.
+
+Have DSPxxx.LD firmware file
+CONFIG_PSS_HAVE_BOOT
+  If you have the DSPxxx.LD file or SYNTH.LD file for you card, say Y
+  to include this file. Without this file the synth device (OPL) may
+  not work.
+
+Full pathname of DSPxxx.LD firmware file
+CONFIG_PSS_BOOT_FILE
+  Enter the full pathname of your DSPxxx.LD file or SYNTH.LD file,
+  starting from /.
+
+Microsoft Sound System support
+CONFIG_SOUND_MSS
+  Again think carefully before answering Y to this question.  It's
+  safe to answer Y if you have the original Windows Sound System card
+  made by Microsoft or Aztech SG 16 Pro (or NX16 Pro).  Also you may
+  say Y in case your card is NOT among these:
+
+     ATI Stereo F/X, AdLib, Audio Excell DSP16, Cardinal DSP16,
+     Ensoniq SoundScape (and compatibles made by Reveal and Spea),
+     Gravis Ultrasound, Gravis Ultrasound ACE, Gravis Ultrasound Max,
+     Gravis Ultrasound with 16 bit option, Logitech Sound Man 16,
+     Logitech SoundMan Games, Logitech SoundMan Wave, MAD16 Pro (OPTi
+     82C929), Media Vision Jazz16, MediaTriX AudioTriX Pro, Microsoft
+     Windows Sound System (MSS/WSS), Mozart (OAK OTI-601), Orchid
+     SW32, Personal Sound System (PSS), Pro Audio Spectrum 16, Pro
+     Audio Studio 16, Pro Sonic 16, Roland MPU-401 MIDI interface,
+     Sound Blaster 1.0, Sound Blaster 16, Sound Blaster 16ASP, Sound
+     Blaster 2.0, Sound Blaster AWE32, Sound Blaster Pro, TI TM4000M
+     notebook, ThunderBoard, Turtle Beach Tropez, Yamaha FM
+     synthesizers (OPL2, OPL3 and OPL4), 6850 UART MIDI Interface.
+
+  For cards having native support in VoxWare, consult the card
+  specific instructions in <file:Documentation/sound/README.OSS>.
+  Some drivers have their own MSS support and saying Y to this option
+  will cause a conflict.
+
+  If you compile the driver into the kernel, you have to add
+  "ad1848=<io>,<irq>,<dma>,<dma2>[,<type>]" to the kernel command
+  line.
+
+SGI Visual Workstation on-board audio
+CONFIG_SOUND_VWSND
+  Say Y or M if you have an SGI Visual Workstation and you want to be
+  able to use its on-board audio.  Read
+  <file:Documentation/sound/vwsnd> for more info on this driver's
+  capabilities.
+
+NEC Vrc5477 AC97 sound
+CONFIG_SOUND_VRC5477
+  Say Y here to enable sound support for the NEC Vrc5477 chip, an
+  integrated, multi-function controller chip for MIPS CPUs.  Works
+  with the AC97 codec.
+
+Ensoniq SoundScape support
+CONFIG_SOUND_SSCAPE
+  Answer Y if you have a sound card based on the Ensoniq SoundScape
+  chipset. Such cards are being manufactured at least by Ensoniq, Spea
+  and Reveal (Reveal makes also other cards).
+
+  If you compile the driver into the kernel, you have to add
+  "sscape=<io>,<irq>,<dma>,<mpuio>,<mpuirq>" to the kernel command
+  line.
+
+MediaTriX AudioTriX Pro support
+CONFIG_SOUND_TRIX
+  Answer Y if you have the AudioTriX Pro sound card manufactured
+  by MediaTrix.
+
+Have TRXPRO.HEX firmware file
+CONFIG_TRIX_HAVE_BOOT
+  The MediaTrix AudioTrix Pro has an on-board microcontroller which
+  needs to be initialized by downloading the code from the file
+  TRXPRO.HEX in the DOS driver directory. If you don't have the
+  TRXPRO.HEX file handy you may skip this step. However, the SB and
+  MPU-401 modes of AudioTrix Pro will not work without this file!
+
+Full pathname of TRXPRO.HEX firmware file
+CONFIG_TRIX_BOOT_FILE
+  Enter the full pathname of your TRXPRO.HEX file, starting from /.
+
+Support for OPTi MAD16 and/or Mozart based cards
+CONFIG_SOUND_MAD16
+  Answer Y if your card has a Mozart (OAK OTI-601) or MAD16 (OPTi
+  82C928 or 82C929 or 82C931) audio interface chip. These chips are
+  quite common so it's possible that many no-name cards have one of
+  them. In addition the MAD16 chip is used in some cards made by known
+  manufacturers such as Turtle Beach (Tropez), Reveal (some models)
+  and Diamond (latest ones). Note however that the Tropez sound cards
+  have their own driver; if you have one of those, say N here and Y or
+  M to "Full support for Turtle Beach WaveFront", below.
+
+  If you compile the driver into the kernel, you have to add
+  "mad16=<io>,<irq>,<dma>,<dma2>,<mpuio>,<mpuirq>" to the
+  kernel command line.
+
+  See also <file:Documentation/sound/Opti> and
+  <file:Documentation/sound/MAD16> for more information on setting
+  these cards up as modules.
+
+Full support for Turtle Beach WaveFront (Tropez Plus, Tropez, Maui) synth/sound cards
+CONFIG_SOUND_WAVEFRONT
+  Answer Y or M if you have a Tropez Plus, Tropez or Maui sound card
+  and read the files <file:Documentation/sound/Wavefront> and
+  <file:Documentation/sound/Tropez+>.
+
+Support MIDI in older MAD16 based cards (requires SB)
+CONFIG_MAD16_OLDCARD
+  Answer Y (or M) if you have an older card based on the C928 or
+  Mozart chipset and you want to have MIDI support. If you enable this
+  option you also need to enable support for Sound Blaster.
+
+Support for Crystal CS4232 based (PnP) cards
+CONFIG_SOUND_CS4232
+  Say Y here if you have a card based on the Crystal CS4232 chip set,
+  which uses its own Plug and Play protocol.
+
+  If you compile the driver into the kernel, you have to add
+  "cs4232=<io>,<irq>,<dma>,<dma2>,<mpuio>,<mpuirq>" to the kernel
+  command line.
+
+  See <file:Documentation/sound/CS4232> for more information on
+  configuring this card.
+
+Support for Crystal CS4297a on SiByte syncser
+CONFIG_SOUND_BCM_CS4297A
+  The BCM91250A has a Crystal CS4297a on synchronous serial port B (in
+  addition to the DB-9 serial port).  Say Y or M here to enable the
+  sound chip instead of the UART.  Also note that CONFIG_KGDB should
+  not be enabled at the same time, since it also attempts to use this
+  UART port.
+
+Support for Yamaha OPL3-SA2 and SA3 based PnP cards
+CONFIG_SOUND_OPL3SA2
+  Say Y or M if you have a card based on one of these Yamaha sound
+  chipsets or the "SAx", which is actually a SA3. Read
+  <file:Documentation/sound/OPL3-SA2> for more information on
+  configuring these cards.
+
+  If you compile the driver into the kernel and do not also
+  configure in the optional ISA PnP support, you will have to add
+  "opl3sa2=<io>,<irq>,<dma>,<dma2>,<mssio>,<mpuio>" to the kernel
+  command line.
+
+Support for Turtle Beach Wave Front (Maui, Tropez) synthesizers
+CONFIG_SOUND_MAUI
+  Say Y here if you have a Turtle Beach Wave Front, Maui, or Tropez
+  sound card.
+
+  If you compile the driver into the kernel, you have to add
+  "maui=<io>,<irq>" to the kernel command line.
+
+Have OSWF.MOT firmware file
+CONFIG_MAUI_HAVE_BOOT
+  Turtle Beach Maui and Tropez sound cards have a microcontroller
+  which needs to be initialized prior to use. OSWF.MOT is a file
+  distributed with the card's DOS/Windows drivers. Answer Y if you
+  have this file.
+
+Full pathname of OSWF.MOT firmware file
+CONFIG_MAUI_BOOT_FILE
+  Enter the full pathname of your OSWF.MOT file, starting from /.
+
+Support for Turtle Beach MultiSound Classic, Tahiti, Monterey
+CONFIG_SOUND_MSNDCLAS
+  Say M here if you have a Turtle Beach MultiSound Classic, Tahiti or
+  Monterey (not for the Pinnacle or Fiji).
+
+  See <file:Documentation/sound/MultiSound> for important information
+  about this driver.  Note that it has been discontinued, but the
+  Voyetra Turtle Beach knowledge base entry for it is still available
+  at <http://www.voyetra-turtle-beach.com/site/kb_ftp/790.asp>.
+
+MSND Classic I/O
+CONFIG_MSNDCLAS_IO
+  I/O port address for the MultiSound Classic and related cards.
+
+MSND Classic IRQ
+CONFIG_MSNDCLAS_IRQ
+  Interrupt Request line for the MultiSound Classic and related cards.
+
+MSND Classic memory address
+CONFIG_MSNDCLAS_MEM
+  Memory-mapped I/O base address for the MultiSound Classic and
+  related cards.
+
+Full pathname of MSNDINIT.BIN firmware file
+CONFIG_MSNDCLAS_INIT_FILE
+  The MultiSound cards have two firmware files which are required for
+  operation, and are not currently included. These files can be
+  obtained from Turtle Beach. See
+  <file:Documentation/sound/MultiSound> for information on how to
+  obtain this.
+
+Full pathname of MSNDPERM.BIN firmware file
+CONFIG_MSNDCLAS_PERM_FILE
+  The MultiSound cards have two firmware files which are required for
+  operation, and are not currently included. These files can be
+  obtained from Turtle Beach. See
+  <file:Documentation/sound/MultiSound> for information on how to
+  obtain this.
+
+Support for Turtle Beach MultiSound Pinnacle, Fiji
+CONFIG_SOUND_MSNDPIN
+  Say M here if you have a Turtle Beach MultiSound Pinnacle or Fiji.
+  See <file:Documentation/sound/MultiSound> for important information
+  about this driver. Note that it has been discontinued, but the
+  Voyetra Turtle Beach knowledge base entry for it is still available
+  at <http://www.voyetra-turtle-beach.com/site/kb_ftp/600.asp>.
+
+MSND Pinnacle IDE I/O 0
+CONFIG_MSNDPIN_IDE_IO0
+  CD-ROM drive 0 memory-mapped I/O base address for the MultiSound
+  Pinnacle and Fiji sound cards.
+
+MSND Pinnacle IDE I/O 1
+CONFIG_MSNDPIN_IDE_IO1
+  CD-ROM drive 1 memory-mapped I/O base address for the MultiSound
+  Pinnacle and Fiji sound cards.
+
+MSND Pinnacle IDE IRQ
+CONFIG_MSNDPIN_IDE_IRQ
+  Interrupt request number for the IDE CD-ROM interface on the
+  MultiSound Pinnacle and Fiji sound cards.
+
+MSND Pinnacle I/O
+CONFIG_MSNDPIN_IO
+  Memory-mapped I/O base address for the primary synthesizer on
+  MultiSound Pinnacle and Fiji sound cards.
+
+MSND Pinnacle MPU I/O
+CONFIG_MSNDPIN_MPU_IO
+  Memory-mapped I/O base address for the Kurzweil daughterboard
+  synthesizer on MultiSound Pinnacle and Fiji sound cards.
+
+MSND Pinnacle MPU IRQ
+CONFIG_MSNDPIN_MPU_IRQ
+  Iinterrupt request number for the Kurzweil daughterboard
+  synthesizer on MultiSound Pinnacle and Fiji sound cards.
+
+MSND Pinnacle IRQ
+CONFIG_MSNDPIN_IRQ
+  Interrupt request line for the primary synthesizer on MultiSound
+  Pinnacle and Fiji sound cards.
+
+MSND Pinnacle joystick I/O
+CONFIG_MSNDPIN_JOYSTICK_IO
+  Memory-mapped I/O base address for the joystick port on MultiSound
+  Pinnacle and Fiji sound cards.
+
+MSND Pinnacle memory
+CONFIG_MSNDPIN_MEM
+  Memory-mapped I/O base address for the primary synthesizer on
+  MultiSound Pinnacle and Fiji sound cards.
+
+Full pathname of PNDSPINI.BIN firmware file
+CONFIG_MSNDPIN_INIT_FILE
+  The MultiSound cards have two firmware files which are required
+  for operation, and are not currently included. These files can be
+  obtained from Turtle Beach. See
+  <file:Documentation/sound/MultiSound> for information on how to
+  obtain this.
+
+Full pathname of PNDSPERM.BIN firmware file
+CONFIG_MSNDPIN_PERM_FILE
+  The MultiSound cards have two firmware files which are required for
+  operation, and are not currently included. These files can be
+  obtained from Turtle Beach. See
+  <file:Documentation/sound/MultiSound> for information on how to
+  obtain this.
+
+MSND Pinnacle has S/PDIF I/O
+CONFIG_MSNDPIN_DIGITAL
+  If you have the S/PDIF daughter board for the Pinnacle or Fiji,
+  answer Y here; otherwise, say N. If you have this, you will be able
+  to play and record from the S/PDIF port (digital signal). See
+  <file:Documentation/sound/MultiSound> for information on how to make
+  use of this capability.
+
+MSND Pinnacle non-PnP Mode
+CONFIG_MSNDPIN_NONPNP
+  The Pinnacle and Fiji card resources can be configured either with
+  PnP, or through a configuration port. Say Y here if your card is NOT
+  in PnP mode. For the Pinnacle, configuration in non-PnP mode allows
+  use of the IDE and joystick peripherals on the card as well; these
+  do not show up when the card is in PnP mode. Specifying zero for any
+  resource of a device will disable the device. If you are running the
+  card in PnP mode, you must say N here and use isapnptools to
+  configure the card's resources.
+
+MSND Pinnacle config port
+CONFIG_MSNDPIN_CFG
+  This is the port which the Pinnacle and Fiji uses to configure the
+  card's resources when not in PnP mode. If your card is in PnP mode,
+  then be sure to say N to the previous option, "MSND Pinnacle Non-PnP
+  Mode".
+
+MSND buffer size (kB)
+CONFIG_MSND_FIFOSIZE
+  Configures the size of each audio buffer, in kilobytes, for
+  recording and playing in the MultiSound drivers (both the Classic
+  and Pinnacle). Larger values reduce the chance of data overruns at
+  the expense of overall latency. If unsure, use the default.
+
+Yamaha FM synthesizer (YM3812/OPL-3) support
+CONFIG_SOUND_YM3812
+  Answer Y if your card has a FM chip made by Yamaha (OPL2/OPL3/OPL4).
+  Answering Y is usually a safe and recommended choice, however some
+  cards may have software (TSR) FM emulation. Enabling FM support with
+  these cards may cause trouble (I don't currently know of any such
+  cards, however). Please read the file
+  <file:Documentation/sound/OPL3> if your card has an OPL3 chip.
+
+  If you compile the driver into the kernel, you have to add
+  "opl3=<io>" to the kernel command line.
+
+  If unsure, say Y.
+
+ACI mixer (miroSOUND PCM1-pro/PCM12/PCM20 radio)
+CONFIG_SOUND_ACI_MIXER
+  ACI (Audio Command Interface) is a protocol used to communicate with
+  the microcontroller on some sound cards produced by miro and
+  Cardinal Technologies.  The main function of the ACI is to control
+  the mixer and to get a product identification.
+
+  This VoxWare ACI driver currently supports the ACI functions on the
+  miroSOUND PCM1-pro, PCM12 and PCM20 radio. On the PCM20 radio, ACI
+  also controls the radio tuner. This is supported in the video4linux
+  miropcm20 driver (say M or Y here and go back to "Multimedia
+  devices" -> "Radio Adapters").
+
+  This driver is also available as a module and will be called aci.o.
+
+SB32/AWE support
+CONFIG_SOUND_AWE32_SYNTH
+  Say Y here if you have a Sound Blaster SB32, AWE32-PnP, SB AWE64 or
+  similar sound card. See <file:Documentation/sound/README.awe>,
+  <file:Documentation/sound/AWE32> and the Soundblaster-AWE
+  mini-HOWTO, available from <http://www.tldp.org/docs.html#howto>
+  for more info.
+
+Gallant Audio Cards (SC-6000 and SC-6600 based)
+CONFIG_SOUND_AEDSP16
+  Answer Y if you have a Gallant's Audio Excel DSP 16 card. This
+  driver supports Audio Excel DSP 16 but not the III nor PnP versions
+  of this card.
+
+  The Gallant's Audio Excel DSP 16 card can emulate either an SBPro or
+  a Microsoft Sound System card, so you should have said Y to either
+  "100% Sound Blaster compatibles (SB16/32/64, ESS, Jazz16) support"
+  or "Microsoft Sound System support", above, and you need to answer
+  the "MSS emulation" and "SBPro emulation" questions below
+  accordingly. You should say Y to one and only one of these two
+  questions.
+
+  Read the <file:Documentation/sound/README.OSS> file and the head of
+  <file:drivers/sound/aedsp16.c> as well as
+  <file:Documentation/sound/AudioExcelDSP16> to get more information
+  about this driver and its configuration.
+
+Audio Excel DSP 16 (SBPro emulation)
+CONFIG_AEDSP16_SBPRO
+  Answer Y if you want your audio card to emulate Sound Blaster Pro.
+  You should then say Y to "100% Sound Blaster compatibles
+  (SB16/32/64, ESS, Jazz16) support" and N to "Audio Excel DSP 16 (MSS
+  emulation)".
+
+  If you compile the driver into the kernel, you have to add
+  "aedsp16=<io>,<irq>,<dma>,<mssio>,<mpuio>,<mouirq>" to the kernel
+  command line.
+
+Audio Excel DSP 16 (MSS emulation)
+CONFIG_AEDSP16_MSS
+  Answer Y if you want your audio card to emulate Microsoft Sound
+  System. You should then say Y to "Microsoft Sound System support"
+  and say N to "Audio Excel DSP 16 (SBPro emulation)".
+
+SC-6600 based audio cards (new Audio Excel DSP 16)
+CONFIG_SC6600
+  The SC6600 is the new version of DSP mounted on the Audio Excel DSP
+  16 cards. Find in the manual the FCC ID of your audio card and
+  answer Y if you have an SC6600 DSP.
+
+SC-6600 Joystick Interface
+CONFIG_SC6600_JOY
+  Say Y here in order to use the joystick interface of the Audio Excel
+  DSP 16 card.
+
+SC-6600 CD-ROM Interface
+CONFIG_SC6600_CDROM  (4=None, 3=IDE, 1=Panasonic, 0=Sony)
+  This is used to activate the CD-ROM interface of the Audio Excel
+  DSP 16 card. Enter: 0 for Sony, 1 for Panasonic, 2 for IDE, 4 for no
+  CD-ROM present.
+
+SC-6600 CD-ROM Interface I/O Address
+CONFIG_SC6600_CDROMBASE
+  Base I/O port address for the CD-ROM interface of the Audio Excel
+  DSP 16 card.
+
+Audio Excel DSP 16 (MPU401 emulation)
+CONFIG_AEDSP16_MPU401
+  Answer Y if you want your audio card to emulate the MPU-401 midi
+  interface. You should then also say Y to "MPU-401 support".
+
+  Note that the I/O base for MPU-401 support of aedsp16 is the same
+  you have selected for "MPU-401 support". If you are using this
+  driver as a module you have to specify the MPU I/O base address with
+  the parameter 'mpu_base=0xNNN'.
+
+SC-6600 CDROM Interface (4=None, 3=IDE, 1=Panasonic, 0=?Sony?)
+CONFIG_SC6600_CDROM
+  This is used to activate the CD-ROM interface of the Audio Excel
+  DSP 16 card. Enter: 0 for Sony, 1 for Panasonic, 2 for IDE, 4 for no
+  CD-ROM present.
+
+C-Media PCI (CMI8338/8378)
+CONFIG_SOUND_CMPCI
+  Say Y or M if you have a PCI sound card using the CMI8338
+  or the CMI8378 chipset.  Data on these chips are available at
+  <http://www.cmedia.com.tw/>.
+
+  A userspace utility to control some internal registers of these
+  chips is available at
+  <http://member.nifty.ne.jp/Breeze/softwares/unix/cmictl-e.html>.
+
+Support CMI8738 based audio cards
+CONFIG_SOUND_CMPCI_CM8738
+  Say Y or M if you have a PCI sound card using the CMI8338
+  or the CMI8378 chipset.  Data on this chip is available at
+  <http://www.cmedia.com.tw/doc8738.htm>.
+
+  A userspace utility to control some internal registers of these
+  chips is available at
+  <http://member.nifty.ne.jp/Breeze/softwares/unix/cmictl-e.html>.
+
+Enable joystick
+CONFIG_SOUND_CMPCI_JOYSTICK
+  Say here in order to enable the joystick port on a sound crd using
+  the CMI8338 or the CMI8738 chipset.  Data on these chips are
+  available at <http://www.cmedia.com.tw/>.
+
+Number of speakers (2, 4, 5, 6)
+CONFIG_SOUND_CMPCI_SPEAKERS
+  Specify the number of speaker channels you want the card to drive,
+  as an integer.
+
+Enable S/PDIF loop for CMI8738
+CONFIG_SOUND_CMPCI_SPDIFLOOP
+  Enable loopback from SPDIF in to SPDIF out.  For discussion, see
+  "The 8738 Audio SPDIF In/Out Technical Data" on the technical
+  support page at <http://www.cmedia.com.tw/>.
+
+  A userspace utility to control even more internal registers of these
+  chips is available at
+  <http://member.nifty.ne.jp/Breeze/softwares/unix/cmictl-e.html>.
+  This package will among other things help you enable SPDIF 
+  out/in/loop/monitor.
+
+Enable legacy FM
+CONFIG_SOUND_CMPCI_FM
+  Say Y here to enable the legacy FM (frequency-modulation) synthesis
+  support on a card using the CMI8338 or CMI8378 chipset.
+
+FM I/O 388, 3C8, 3E0, 3E8
+CONFIG_SOUND_CMPCI_FMIO
+  Set the base I/O address for FM synthesis control on a card using
+  the CMI8338 or CMI8378 chipset.
+
+Enable legacy MPU-401
+CONFIG_SOUND_CMPCI_MIDI
+  Say Y here to enable the legacy MP401 MIDI synthesis support on a
+  card using the CMI8338 or CMI8378 chipset.
+
+MPU-401 I/O 330, 320, 310, 300
+CONFIG_SOUND_CMPCI_MPUIO
+  Set the base I/O address for MP401 MIDI synthesis control on a card
+  using the CMI8338 or CMI8378 chipset.
+
+Inverse S/PDIF in for CMI8738
+CONFIG_SOUND_CMPCI_SPDIFINVERSE
+  Say Y here to have the driver invert the signal presented on SPDIF IN
+  of a card using the CMI8338 or CMI8378 chipset.
+
+Use Line-in as Read-out
+CONFIG_SOUND_CMPCI_LINE_REAR
+  Say Y here to enable using line-in jack as an output jack for a rear
+  speaker.
+
+Use Line-in as Bass
+CONFIG_SOUND_CMPCI_LINE_BASS
+  Say Y here to enable using line-in jack as an output jack for a bass
+  speaker.
+
+Creative SBLive! (EMU10K1) based PCI sound cards
+CONFIG_SOUND_EMU10K1
+  Say Y or M if you have a PCI sound card using the EMU10K1 chipset,
+  such as the Creative SBLive!, SB PCI512 or Emu-APS.
+
+  For more information on this driver and the degree of support for
+  the different card models please check:
+
+       <http://sourceforge.net/projects/emu10k1/>
+
+  It is now possible to load dsp microcode patches into the EMU10K1
+  chip.  These patches are used to implement real time sound
+  processing effects which include for example: signal routing,
+  bass/treble control, AC3 passthrough, ...
+  Userspace tools to create new patches and load/unload them can be
+  found in the emu-tools package at the above URL.
+
+Creative SBLive! (EMU10K1) MIDI
+CONFIG_MIDI_EMU10K1
+  Say Y if you want to be able to use the OSS /dev/sequencer
+  interface.  This code is still experimental.
+
+Crystal SoundFusion (CS4280/461x)
+CONFIG_SOUND_FUSION
+  This module drives the Crystal SoundFusion devices (CS4280/46xx
+  series) when wired as native sound drivers with AC97 codecs.  If
+  this driver does not work try the CS4232 driver.
+
+Ensoniq AudioPCI (ES1370) based PCI sound cards
+CONFIG_SOUND_ES1370
+  Say Y or M if you have a PCI sound card utilizing the Ensoniq
+  ES1370 chipset, such as Ensoniq's AudioPCI (non-97). To find
+  out if your sound card uses an ES1370 without removing your
+  computer's cover, use lspci -n and look for the PCI ID
+  1274:5000. Since Ensoniq was bought by Creative Labs,
+  Sound Blaster 64/PCI models are either ES1370 or ES1371 based.
+  This driver differs slightly from OSS/Free, so PLEASE READ
+  <file:Documentation/sound/es1370>.
+
+Ensoniq AudioPCI 97 (ES1371) based sound cards
+CONFIG_SOUND_ES1371
+  Say Y or M if you have a PCI sound card utilizing the Ensoniq
+  ES1371 chipset, such as Ensoniq's AudioPCI97. To find out if
+  your sound card uses an ES1371 without removing your computer's
+  cover, use lspci -n and look for the PCI ID 1274:1371. Since
+  Ensoniq was bought by Creative Labs, Sound Blaster 64/PCI
+  models are either ES1370 or ES1371 based. This driver differs
+  slightly from OSS/Free, so PLEASE READ
+  <file:Documentation/sound/es1371>.
+
+ESS Solo1 based PCI sound cards (eg. SC1938)
+CONFIG_SOUND_ESSSOLO1
+  Say Y or M if you have a PCI sound card utilizing the ESS Technology
+  Solo1 chip. To find out if your sound card uses a
+  Solo1 chip without removing your computer's cover, use
+  lspci -n and look for the PCI ID 125D:1969. This driver
+  differs slightly from OSS/Free, so PLEASE READ
+  <file:Documentation/sound/solo1>.
+
+S3 SonicVibes based PCI sound cards
+CONFIG_SOUND_SONICVIBES
+  Say Y or M if you have a PCI sound card utilizing the S3
+  SonicVibes chipset. To find out if your sound card uses a
+  SonicVibes chip without removing your computer's cover, use
+  lspci -n and look for the PCI ID 5333:CA00. This driver
+  differs slightly from OSS/Free, so PLEASE READ
+  <file:Documentation/sound/sonicvibes>.
+
+Trident 4DWave DX/NX, SiS 7018 or ALi 5451 PCI Audio Core
+CONFIG_SOUND_TRIDENT
+  Say Y or M if you have a PCI sound card utilizing the Trident
+  4DWave-DX/NX chipset or your mother board chipset has SiS 7018
+  or ALi 5451 built-in. The SiS 7018 PCI Audio Core is embedded
+  in SiS960 Super South Bridge and SiS540/630 Single Chipset.
+  The ALi 5451 PCI Audio Core is embedded in ALi M1535, M1535D,
+  M1535+ or M1535D+ South Bridge.
+
+  Use lspci -n to find out if your sound card or chipset uses
+  Trident 4DWave or SiS 7018. PCI ID 1023:2000 or 1023:2001 stands
+  for Trident 4Dwave. PCI ID 1039:7018 stands for SiS7018. PCI ID
+  10B9:5451 stands for ALi5451.
+
+  This driver supports S/PDIF in/out (record/playback) for ALi 5451
+  embedded in ALi M1535+ and M1535D+. Note that they aren't all
+  enabled by default; you can enable them by saying Y to "/proc file
+  system support" and "Sysctl support", and after the /proc file
+  system has been mounted, executing the command
+
+       command                 what is enabled
+
+  echo 0>/proc/ALi5451 pcm out is also set to S/PDIF out. (Default).
+
+  echo 1>/proc/ALi5451 use S/PDIF out to output pcm data.
+
+  echo 2>/proc/ALi5451 use S/PDIF out to output non-pcm data.
+                        (AC3...).
+
+  echo 3>/proc/ALi5451 record from Ac97 in(MIC, Line in...).
+                        (Default).
+
+  echo 4>/proc/ALi5451 no matter Ac97 settings, record from S/PDIF
+                        in.
+
+
+  This driver differs slightly from OSS/Free, so PLEASE READ the
+  comments at the top of <file:drivers/sound/trident.c>.
+
+Rockwell WaveArtist
+CONFIG_SOUND_WAVEARTIST
+  Say Y here to include support for the Rockwell WaveArtist sound
+  system.  This driver is mainly for the NetWinder.
+
+VIA 82Cxxx Audio Codec
+CONFIG_SOUND_VIA82CXXX
+  Say Y here to include support for the audio codec found on VIA
+  82Cxxx-based chips. Typically these are built into a motherboard.
+
+  DO NOT select Sound Blaster or Adlib with this driver, unless
+  you have a Sound Blaster or Adlib card in addition to your VIA
+  audio chip.
+
+VIA 82C686 MIDI
+CONFIG_MIDI_VIA82CXXX
+  Answer Y to use the MIDI interface of the Via686. You may need to
+  enable this in the BIOS before it will work. This is for connection
+  to external MIDI hardware, and is not required for software playback
+  of MIDI files.
+
+NeoMagic 256AV/256ZX sound chipsets
+CONFIG_SOUND_NM256
+  Say M here to include audio support for the NeoMagic 256AV/256ZX
+  chipsets. These are the audio chipsets found in the Sony
+  Z505S/SX/DX, some Sony F-series, and the Dell Latitude CPi and CPt
+  laptops. It includes support for an AC97-compatible mixer and an
+  apparently proprietary sound engine.
+
+  See <file:Documentation/sound/NM256> for further information.
+
+ESS Maestro, Maestro2, Maestro2E driver
+CONFIG_SOUND_MAESTRO
+  Say Y or M if you have a sound system driven by ESS's Maestro line
+  of PCI sound chips.  These include the Maestro 1, Maestro 2, and
+  Maestro 2E.  See <file:Documentation/sound/Maestro> for more
+  details.
+
+ESS Maestro3/Allegro driver
+CONFIG_SOUND_MAESTRO3
+  Say Y or M if you have a sound system driven by ESS's Maestro 3
+  PCI sound chip.
+
+ForteMedia FM801 driver
+CONFIG_SOUND_FORTE
+  Say Y or M if you want driver support for the ForteMedia FM801 PCI
+  audio controller (Abit AU10, Genius Sound Maker, HP Workstation
+  zx2000, and others).
+
+Adlib Cards
+CONFIG_SOUND_ADLIB
+  Includes ASB 64 4D. Information on programming AdLib cards is
+  available at <http://www.itsnet.com/home/ldragon/Specs/adlib.html>.
+
+Crystal Sound CS4281
+CONFIG_SOUND_CS4281
+  Picture and feature list at
+  <http://www.pcbroker.com/crystal4281.html>.
+
+16 bit sampling option of GUS (_NOT_ GUS MAX)
+CONFIG_SOUND_GUS16
+  Support for Gravis Ulstrasound (GUS) cards (other than the GUS),
+  sampling at 16-bit width.
+
+GUS MAX support
+CONFIG_SOUND_GUSMAX
+  Support for Gravis Ulstrasound MAX.
+
+Intel ICH audio support
+CONFIG_SOUND_ICH
+  Supports the following chipsets:
+  
+  Intel ICH 82801AA
+  Intel ICH 82901AB
+  Intel 440 MX
+  Intel ICH2
+  Intel ICH3
+  SiS 7012
+  NVidia nForce
+  AMD 768
+  
+  These are audio drivers for integral audio in chipsets of motherboards.
+  
+  Intel's I/O Controller Hub (ICH) is used on 810/815/820/840/845/845D/850 motherboards.
+  SiS 7012 is used on 645/735/745 motherboards.
+
+Verbose initialization
+CONFIG_SOUND_TRACEINIT
+  Verbose soundcard initialization -- affects the format of autoprobe
+  and initialization messages at boot time.
+
+TV card (bt848) mixer support
+CONFIG_SOUND_TVMIXER
+  Support for audio mixer facilities on the BT848 TV frame-grabber
+  card.
+
+VIDC 16-bit sound
+CONFIG_SOUND_VIDC
+  16-bit support for the VIDC onboard sound hardware found on Acorn
+  machines.
+
+Loopback MIDI device support
+CONFIG_SOUND_VMIDI
+  Support for MIDI loopback on port 1 or 2.
+
+Yamaha YMF7xx PCI audio (native mode)
+CONFIG_SOUND_YMFPCI
+  Support for Yamaha cards with the following chipsets: YMF724,
+  YMF724F, YMF740, YMF740C, YMF744, and YMF754.
+
+  Two common cards that use this type of chip are Waveforce 192XG,
+  and Waveforce 192 Digital.
+
+Yamaha PCI legacy ports support
+CONFIG_SOUND_YMFPCI_LEGACY
+  Support for YMF7xx PCI cards emulating an MP401.
+
+RME Hammerfall (RME96XX) support
+CONFIG_SOUND_RME96XX
+  Say Y or M if you have a Hammerfall or Hammerfall light multichannel card 
+  from RME. If you want to acess advanced features of the card, read
+  Documentation/sound/rme96xx.
+
+Are you using a crosscompiler
+CONFIG_CROSSCOMPILE
+  Say Y here if you are compiling the kernel on a different
+  architecture than the one it is intended to run on.
+
+Kernel support for Linux/MIPS 32-bit binary compatibility
+CONFIG_MIPS32_COMPAT
+  Select this option if you want Linux/MIPS 32-bit binary
+  compatibility. Since all software available for Linux/MIPS is
+  currently 32-bit you should say Y here.
+
+Kernel support for o32 binaries
+CONFIG_MIPS32_O32
+  Select this option if you want to run o32 binaries.  These are pure
+  32-bit binaries as used by the 32-bit Linux/MIPS port.  Most of
+  existing binaries are in this format.
+
+  If unsure, say Y.
+
+Kernel support for n32 binaries
+CONFIG_MIPS32_N32
+  Select this option if you want to run n32 binaries.  These are
+  64-bit binaries using 32-bit quantities for addressing and certain
+  data that would normally be 64-bit.  They are used in special
+  cases.
+
+  If unsure, say N.
+
+Build fp exception handler module
+CONFIG_MIPS_FPE_MODULE
+  Build the floating point exception handler module. This option is
+  only useful for people working on the floating point exception
+  handler. If you don't, say N.
+
+Galileo EV64120 Evaluation board
+CONFIG_MIPS_EV64120
+  This is an evaluation board based on the Galileo GT-64120
+  single-chip system controller that contains a MIPS R5000 compatible
+  core running at 75/100MHz.  Their website is located at
+  <http://www.galileot.com/>.  Say Y here if you wish to build a
+  kernel for this platform.
+
+Galileo EV96100 Evaluation board
+CONFIG_MIPS_EV96100
+  This is an evaluation board based on the Galielo GT-96100 LAN/WAN
+  communications controllers containing a MIPS R5000 compatible core
+  running at 83MHz. Their website is <http://www.galileot.com/>. Say Y
+  here if you wish to build a kernel for this platform.
+
+Support for ITE 8172G board
+CONFIG_MIPS_ITE8172
+  Ths is an evaluation board made by ITE <http://www.ite.com.tw/>
+  with ATX form factor that utilizes a MIPS R5000 to work with its
+  ITE8172G companion internet appliance chip. The MIPS core can be
+  either a NEC Vr5432 or QED RM5231. Say Y here if you wish to build
+  a kernel for this platform.
+
+Support for Globespan IVR board
+CONFIG_MIPS_IVR
+  This is an evaluation board built by Globespan to showcase their
+  iVR (Internet Video Recorder) design. It utilizes a QED RM5231
+  R5000 MIPS core. More information can be found out their website
+  located at <http://www.globespan.net/products/product4.html>P. Say Y
+  here if you wish to build a kernel for this platform.
+
+Support for Alchemy Semi PB1000 board
+CONFIG_MIPS_PB1000
+  This is an evaluation board built by Alchemy Semiconductor to
+  showcase their Au1000 Internet Edge Processor. It is SOC design
+  containing a MIPS32 core running at 266/400/500MHz with many
+  integrated peripherals. Further information can be found at their
+  website, <http://www.alchemysemi.com/>. Say Y here if you wish to
+  build a kernel for this platform.
+
+Support for Philips Nino
+CONFIG_NINO
+  Say Y here to select a kernel for the Philips Nino Palm PC. The
+  website at <http://www.realitydiluted.com/projects/nino/index.html>
+  will have more information.
+
+# Choice: nino_model
+CONFIG_NINO_4MB
+  Say Y here to build a kernel specifically for Nino Palm PCs with
+  4MB of memory. These include models 300/301/302/319.
+
+Model-200/210/312/320/325/350/390
+CONFIG_NINO_8MB
+  Say Y here to build a kernel specifically for Nino Palm PCs with
+  8MB of memory. These include models 200/210/312/320/325/350/390.
+
+Model-500/510
+CONFIG_NINO_16MB
+  Say Y here to build a kernel specifically for Nino 500/501 color
+  Palm PCs from Philips (INCOMPLETE).
+Model-300/301/302/319
+
+Enable run-time debugging
+CONFIG_RUNTIME_DEBUG
+  If you say Y here, some debugging macros will do run-time checking.
+  If you say N here, those macros will mostly turn to no-ops.  Currently
+  supported by MIPS arch.  See include/asm-mips/debug.h for debuging macros.
+  If unsure, say N.
+
+Run uncached
+CONFIG_MIPS_UNCACHED
+  If you say Y here there kernel will disable all CPU caches.  This will
+  reduce the system's performance dramatically but can help finding
+  otherwise hard to track bugs.  It can also useful if you're doing
+  hardware debugging with a logic analyzer and need to see all traffic
+  on the bus.
+
+AU1000 ethernet controller on SGI MIPS system
+CONFIG_MIPS_AU1000_ENET
+  If you have an Alchemy Semi AU1000 ethernet controller
+  on an SGI MIPS system, say Y.  Otherwise, say N.
+
+WD93 SCSI Controller on SGI MIPS system
+CONFIG_SGIWD93_SCSI
+  If you have a Western Digital WD93 SCSI controller on
+  an SGI MIPS system, say Y.  Otherwise, say N.
+
+Magic System Request Key support
+CONFIG_MAGIC_SYSRQ
+  If you say Y here, you will have some control over the system even
+  if the system crashes for example during kernel debugging (e.g., you
+  will be able to flush the buffer cache to disk, reboot the system
+  immediately or dump some status information). This is accomplished
+  by pressing various keys while holding SysRq (Alt+PrintScreen). It
+  also works on a serial console (on PC hardware at least), if you
+  send a BREAK and then within 5 seconds a command keypress. The
+  keys are documented in <file:Documentation/sysrq.txt>. Don't say Y
+  unless you really know what this hack does.
+
+ISDN support
+CONFIG_ISDN
+  ISDN ("Integrated Services Digital Networks", called RNIS in France)
+  is a special type of fully digital telephone service; it's mostly
+  used to connect to your Internet service provider (with SLIP or
+  PPP).  The main advantage is that the speed is higher than ordinary
+  modem/telephone connections, and that you can have voice
+  conversations while downloading stuff.  It only works if your
+  computer is equipped with an ISDN card and both you and your service
+  provider purchased an ISDN line from the phone company.  For
+  details, read <http://alumni.caltech.edu/~dank/isdn/> on the WWW.
+
+  This driver allows you to use an ISDN-card for networking
+  connections and as dialin/out device.  The isdn-tty's have a built
+  in AT-compatible modem emulator.  Network devices support autodial,
+  channel-bundling, callback and caller-authentication without having
+  a daemon running.  A reduced T.70 protocol is supported with tty's
+  suitable for German BTX.  On D-Channel, the protocols EDSS1
+  (Euro-ISDN) and 1TR6 (German style) are supported.  See
+  <file:Documentation/isdn/README> for more information.
+
+  If you want to compile the ISDN code as a module ( = code which can
+  be inserted in and removed from the running kernel whenever you
+  want), say M here and read <file:Documentation/modules.txt>.  The
+  module will be called isdn.o. If unsure, say N.
+
+Support synchronous PPP
+CONFIG_ISDN_PPP
+  Over digital connections such as ISDN, there is no need to
+  synchronize sender and recipient's clocks with start and stop bits
+  as is done over analog telephone lines. Instead, one can use
+  "synchronous PPP". Saying Y here will include this protocol. This
+  protocol is used by Cisco and Sun for example. So you want to say Y
+  here if the other end of your ISDN connection supports it. You will
+  need a special version of pppd (called ipppd) for using this
+  feature. See <file:Documentation/isdn/README.syncppp> and
+  <file:Documentation/isdn/syncPPP.FAQ> for more information.
+
+PPP filtering for ISDN
+CONFIG_IPPP_FILTER
+  Say Y here if you want to be able to filter the packets passing over
+  IPPP interfaces.  This allows you to control which packets count as
+  activity (i.e. which packets will reset the idle timer or bring up
+  a demand-dialled link) and which packets are to be dropped entirely.
+  You need to say Y here if you wish to use the pass-filter and
+  active-filter options to ipppd.
+
+  If unsure, say N.
+
+Support generic MP (RFC 1717)
+CONFIG_ISDN_MPP
+  With synchronous PPP enabled, it is possible to increase throughput
+  by bundling several ISDN-connections, using this protocol. See
+  <file:Documentation/isdn/README.syncppp> for more information.
+
+Use VJ-compression with synchronous PPP
+CONFIG_ISDN_PPP_VJ
+  This enables Van Jacobson header compression for synchronous PPP.
+  Say Y if the other end of the connection supports it.
+
+Support BSD compression
+CONFIG_ISDN_PPP_BSDCOMP
+  Support for the BSD-Compress compression method for PPP, which uses
+  the LZW compression method to compress each PPP packet before it is
+  sent over the wire. The machine at the other end of the PPP link
+  (usually your ISP) has to support the BSD-Compress compression
+  method as well for this to be useful. Even if they don't support it,
+  it is safe to say Y here.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called isdn_bsdcomp.o.
+
+Support audio via ISDN
+CONFIG_ISDN_AUDIO
+  If you say Y here, the modem-emulator will support a subset of the
+  EIA Class 8 Voice commands. Using a getty with voice-support
+  (mgetty+sendfax by gert@greenie.muc.de with an extension, available
+  with the ISDN utility package for example), you will be able to use
+  your Linux box as an ISDN-answering machine. Of course, this must be
+  supported by the lowlevel driver also. Currently, the HiSax driver
+  is the only voice-supporting driver. See
+  <file:Documentation/isdn/README.audio> for more information.
+
+X.25 PLP on top of ISDN
+CONFIG_ISDN_X25
+  This feature provides the X.25 protocol over ISDN connections.
+  See <file:Documentation/isdn/README.x25> for more information
+  if you are thinking about using this.
+
+ISDN diversion services support
+CONFIG_ISDN_DIVERSION
+  This option allows you to use some supplementary diversion
+  services in conjunction with the HiSax driver on an EURO/DSS1
+  line.
+
+  Supported options are CD (call deflection), CFU (Call forward
+  unconditional), CFB (Call forward when busy) and CFNR (call forward
+  not reachable). Additionally the actual CFU, CFB and CFNR state may
+  be interrogated.
+
+  The use of CFU, CFB, CFNR and interrogation may be limited to some
+  countries. The keypad protocol is still not implemented. CD should
+  work in all countries if the service has been subscribed to.
+
+  Please read the file <file:Documentation/isdn/README.diversion>.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called dss1_divert.o.
+
+ICN 2B and 4B support
+CONFIG_ISDN_DRV_ICN
+  This enables support for two kinds of ISDN-cards made by a German
+  company called ICN.  2B is the standard version for a single ISDN
+  line with two B-channels, 4B supports two ISDN lines.  For running
+  this card, additional firmware is necessary, which has to be
+  downloaded into the card using a utility which is distributed
+  separately.  See <file:Documentation/isdn/README> and
+  <file:Documentation/isdn/README.icn> for more
+  information.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called icn.o.
+
+isdnloop support
+CONFIG_ISDN_DRV_LOOP
+  This driver provides a virtual ISDN card. Its primary purpose is
+  testing of linklevel features or configuration without getting
+  charged by your service-provider for lots of phone calls.
+  You need will need the loopctrl utility from the latest isdn4k-utils
+  package to set up this driver.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called isdnloop.o.
+
+HiSax SiemensChipSet driver support
+CONFIG_ISDN_DRV_HISAX
+  This is a driver supporting the Siemens chipset on various
+  ISDN-cards (like AVM A1, Elsa ISDN cards, Teles S0-16.0, Teles
+  S0-16.3, Teles S0-8, Teles/Creatix PnP, ITK micro ix1 and many
+  compatibles).
+
+  HiSax is just the name of this driver, not the name of any hardware.
+
+  If you have a card with such a chipset, you should say Y here and
+  also to the configuration option of the driver for your particular
+  card, below.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called hisax.o.  See <file:Documentation/isdn/README.HiSax>
+  for more information on using this driver.
+
+HiSax Support for EURO/DSS1
+CONFIG_HISAX_EURO
+  Say Y or N according to the D-channel protocol which your local
+  telephone service company provides.
+
+  The call control protocol E-DSS1 is used in most European countries.
+  If unsure, say Y.
+
+Support for German chargeinfo
+CONFIG_DE_AOC
+  If you want that the HiSax hardware driver sends messages to the
+  upper level of the isdn code on each AOCD (Advice Of Charge, During
+  the call -- transmission of the fee information during a call) and
+  on each AOCE (Advice Of Charge, at the End of the call --
+  transmission of fee information at the end of the call), say Y here.
+  This works only in Germany.
+
+Disable sending complete
+CONFIG_HISAX_NO_SENDCOMPLETE
+  If you have trouble with some ugly exchanges or you live in
+  Australia select this option.
+
+Disable sending low layer compatibility
+CONFIG_HISAX_NO_LLC
+  If you have trouble with some ugly exchanges try to select this
+  option.
+
+Disable keypad protocol option
+CONFIG_HISAX_NO_KEYPAD
+  If you like to send special dial strings including * or # without
+  using the keypad protocol, select this option.
+
+HiSax Support for German 1TR6
+CONFIG_HISAX_1TR6
+  Say Y or N according to the D-channel protocol which your local
+  telephone service company provides.
+
+  1TR6 is an old call control protocol which was used in Germany
+  before E-DSS1 was established. Nowadays, all new lines in Germany
+  use E-DSS1.
+
+HiSax Support for US NI1
+CONFIG_HISAX_NI1
+  Enable this if you like to use ISDN in US on a NI1 basic rate
+  interface.
+
+Maximum number of cards supported by HiSax
+CONFIG_HISAX_MAX_CARDS
+  This is used to allocate a driver-internal structure array with one
+  entry for each HiSax card on your system.
+
+Teles 16.0/8.0
+CONFIG_HISAX_16_0
+  This enables HiSax support for the Teles ISDN-cards S0-16.0, S0-8
+  and many compatibles.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using the different cards, a different D-channel protocol, or
+  non-standard IRQ/port/shmem settings.
+
+Teles 16.3 or PNP or PCMCIA
+CONFIG_HISAX_16_3
+  This enables HiSax support for the Teles ISDN-cards S0-16.3 the
+  Teles/Creatix PnP and the Teles PCMCIA.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using the different cards, a different D-channel protocol, or
+  non-standard IRQ/port settings.
+
+Teles PCI
+CONFIG_HISAX_TELESPCI
+  This enables HiSax support for the Teles PCI.
+  See <file:Documentation/isdn/README.HiSax> on how to configure it.
+
+Teles S0Box
+CONFIG_HISAX_S0BOX
+  This enables HiSax support for the Teles/Creatix parallel port
+  S0BOX.  See <file:Documentation/isdn/README.HiSax> on how to
+  configure it.
+
+AVM A1 (Fritz)
+CONFIG_HISAX_AVM_A1
+  This enables HiSax support for the AVM A1 (aka "Fritz").
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using the different cards, a different D-channel protocol, or
+  non-standard IRQ/port settings.
+
+AVM PnP/PCI (Fritz!PnP/PCI)
+CONFIG_HISAX_FRITZPCI
+  This enables HiSax support for the AVM "Fritz!PnP" and "Fritz!PCI".
+  See <file:Documentation/isdn/README.HiSax> on how to configure it.
+
+AVM A1 PCMCIA (Fritz)
+CONFIG_HISAX_AVM_A1_PCMCIA
+  This enables HiSax support for the AVM A1 "Fritz!PCMCIA").
+  See <file:Documentation/isdn/README.HiSax> on how to configure it.
+
+Elsa cards
+CONFIG_HISAX_ELSA
+  This enables HiSax support for the Elsa Mircolink ISA cards, for the
+  Elsa Quickstep series cards and Elsa PCMCIA.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using the different cards, a different D-channel protocol, or
+  non-standard IRQ/port settings.
+
+ITK ix1-micro Revision 2
+CONFIG_HISAX_IX1MICROR2
+  This enables HiSax support for the ITK ix1-micro Revision 2 card.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using the different cards, a different D-channel protocol, or
+  non-standard IRQ/port settings.
+
+Eicon.Diehl Diva cards
+CONFIG_HISAX_DIEHLDIVA
+  This enables HiSax support for the Eicon.Diehl Diva none PRO
+  versions passive ISDN cards.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using the different cards, a different D-channel protocol, or
+  non-standard IRQ/port settings.
+
+ASUSCOM ISA cards
+CONFIG_HISAX_ASUSCOM
+  This enables HiSax support for the AsusCom and their OEM versions
+  passive ISDN ISA cards.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using the different cards, a different D-channel protocol, or
+  non-standard IRQ/port settings.
+
+TELEINT cards
+CONFIG_HISAX_TELEINT
+  This enables HiSax support for the TELEINT SA1 semiactiv ISDN card.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using the different cards, a different D-channel protocol, or
+  non-standard IRQ/port settings.
+
+HFC-S based cards
+CONFIG_HISAX_HFCS
+  This enables HiSax support for the HFC-S 2BDS0 based cards, like
+  teles 16.3c.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using the different cards, a different D-channel protocol, or
+  non-standard IRQ/port settings.
+
+Sedlbauer cards
+CONFIG_HISAX_SEDLBAUER
+  This enables HiSax support for the Sedlbauer passive ISDN cards.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using the different cards, a different D-channel protocol, or
+  non-standard IRQ/port settings.
+
+USR Sportster internal TA
+CONFIG_HISAX_SPORTSTER
+  This enables HiSax support for the USR Sportster internal TA card.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
+
+MIC card
+CONFIG_HISAX_MIC
+  This enables HiSax support for the ITH MIC card.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
+
+NETjet card
+CONFIG_HISAX_NETJET
+  This enables HiSax support for the NetJet from Traverse
+  Technologies.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
+
+NETspider U card
+CONFIG_HISAX_NETJET_U
+  This enables HiSax support for the Netspider U interface ISDN card
+  from Traverse Technologies.
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
+
+Niccy PnP/PCI card
+CONFIG_HISAX_NICCY
+  This enables HiSax support for the Dr. Neuhaus Niccy PnP or PCI.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
+
+Siemens I-Surf card
+CONFIG_HISAX_ISURF
+  This enables HiSax support for the Siemens I-Talk/I-Surf card with
+  ISAR chip.
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
+
+HST Saphir card
+CONFIG_HISAX_HSTSAPHIR
+  This enables HiSax support for the HST Saphir card.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
+
+Telekom A4T card
+CONFIG_HISAX_BKM_A4T
+  This enables HiSax support for the Telekom A4T card.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
+
+Scitel Quadro card
+CONFIG_HISAX_SCT_QUADRO
+  This enables HiSax support for the Scitel Quadro card.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
+
+Gazel cards
+CONFIG_HISAX_GAZEL
+  This enables HiSax support for the Gazel cards.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
+
+HFC PCI-Bus cards
+CONFIG_HISAX_HFC_PCI
+  This enables HiSax support for the HFC-S PCI 2BDS0 based cards.
+
+  For more informations see under
+  <file:Documentation/isdn/README.hfc-pci>.
+
+Winbond W6692 based cards
+CONFIG_HISAX_W6692
+  This enables HiSax support for Winbond W6692 based PCI ISDN cards.
+
+  See <file:Documentation/isdn/README.HiSax> on how to configure it
+  using a different D-channel protocol, or non-standard IRQ/port
+  settings.
+
+HFC-S+, HFC-SP, HFC-PCMCIA cards
+CONFIG_HISAX_HFC_SX
+  This enables HiSax support for the HFC-S+, HFC-SP and HFC-PCMCIA
+  cards. This code is not finished yet.
+
+Am7930
+CONFIG_HISAX_AMD7930
+  This enables HiSax support for the AMD7930 chips on some SPARCs.
+  This code is not finished yet.
+
+HiSax debugging
+CONFIG_HISAX_DEBUG
+  This enables debugging code in the new-style HiSax drivers, i.e.
+  the ST5481 USB driver currently. 
+  If in doubt, say yes.
+
+ELSA PCMCIA MicroLink cards
+CONFIG_HISAX_ELSA_CS
+  This enables the PCMCIA client driver for the Elsa PCMCIA MicroLink
+  card.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called elsa_cs.o.
+
+Sedlbauer PCMCIA cards
+CONFIG_HISAX_SEDLBAUER_CS
+  This enables the PCMCIA client driver for the Sedlbauer Speed Star
+  and Speed Star II cards.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called sedlbauer_cs.o.
+
+CONFIG_HISAX_AVM_A1_CS
+  This enables the PCMCIA client driver for the AVM A1 / Fritz!Card
+  PCMCIA cards.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called avma1_cs.o.
+
+ST5481 USB ISDN modem
+CONFIG_HISAX_ST5481
+  This enables the driver for ST5481 based USB ISDN adapters,
+  e.g. the BeWan Gazel 128 USB
+
+PCBIT-D support
+CONFIG_ISDN_DRV_PCBIT
+  This enables support for the PCBIT ISDN-card.  This card is
+  manufactured in Portugal by Octal.  For running this card,
+  additional firmware is necessary, which has to be downloaded into
+  the card using a utility which is distributed separately.  See
+  <file:Documentation/isdn/README> and
+  <file:Documentation/isdn/README.pcbit> for more information.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called pcbit.o.
+
+Spellcaster support
+CONFIG_ISDN_DRV_SC
+  This enables support for the Spellcaster BRI ISDN boards.  This
+  driver currently builds only in a modularized version ( = code which
+  can be inserted in and removed from the running kernel whenever you
+  want, details in <file:Documentation/modules.txt>); the module will
+  be called sc.o.  See <file:Documentation/isdn/README.sc> and
+  <http://www.spellcast.com/> for more information.
+
+Eicon active card support
+CONFIG_ISDN_DRV_EICON
+  Say Y here if you have an Eicon active ISDN card. In order to use
+  this card, additional firmware is necessary, which has to be loaded
+  into the card using the eiconctrl utility which is part of the
+  latest isdn4k-utils package. Please read the file
+  <file:Documentation/isdn/README.eicon> for more information.
+
+Legacy Eicon driver
+CONFIG_ISDN_DRV_EICON_OLD
+  Say Y here to use your Eicon active ISDN card with ISDN4Linux
+  isdn module.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called eicon.o.
+
+Eicon PCI DIVA Server BRI/PRI/4BRI support
+CONFIG_ISDN_DRV_EICON_PCI
+  Say Y here if you have an Eicon Diva Server (BRI/PRI/4BRI) ISDN
+  card.  Please read <file:Documentation/isdn/README.eicon> for more
+  information.
+
+Eicon old-type (S,SX,SCOM,Quadro,S2M) card support
+CONFIG_ISDN_DRV_EICON_ISA
+  Say Y here if you have an old-type Eicon active ISDN card. In order
+  to use this card, additional firmware is necessary, which has to be
+  loaded into the card using the eiconctrl utility which is part of
+  the latest isdn4k-utils package. Please read the file
+  <file:Documentation/isdn/README.eicon> for more information.
+
+Eicon driver type standalone
+CONFIG_ISDN_DRV_EICON_DIVAS
+  Enable this option if you want the eicon driver as standalone
+  version with no interface to the ISDN4Linux isdn module. If you
+  say Y here, the eicon module only supports the Diva Server PCI
+  cards and will provide its own IDI interface. You should say N
+  here.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called divas.o.
+
+Support AT-Fax Class 1 and 2 commands
+CONFIG_ISDN_TTY_FAX
+  If you say Y here, the modem-emulator will support a subset of the
+  Fax Class 1 and 2 commands. Using a getty with fax-support
+  (mgetty+sendfax, hylafax), you will be able to use your Linux box as
+  an ISDN-fax-machine. This must be supported by the lowlevel driver
+  also. See <file:Documentation/isdn/README.fax> for more information.
+
+CAPI2.0 support
+CONFIG_ISDN_CAPI
+  This provides the CAPI (Common ISDN Application Programming
+  Interface, a standard making it easy for programs to access ISDN
+  hardware, see <http://www.capi.org/>.  This is needed for AVM's set
+  of active ISDN controllers like B1, T1, M1.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The modules will be called capi.o and kernelcapi.o. If you want to
+  compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+CAPI2.0 /dev/capi20 support
+CONFIG_ISDN_CAPI_CAPI20
+  This option will provide the CAPI 2.0 interface to userspace
+  applications via /dev/capi20. Applications should use the
+  standardized libcapi20 to access this functionality.  You should say
+  Y/M here.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called capi.o.
+
+CAPI2.0 Middleware support
+CONFIG_ISDN_CAPI_MIDDLEWARE
+  This option will enhance the capabilities of the /dev/capi20
+  interface.  It will provide a means of moving a data connection,
+  established via the usual /dev/capi20 interface to a special tty
+  device.  If you want to use pppd with pppdcapiplugin to dial up to
+  your ISP, say Y here.
+
+CAPI2.0 filesystem support
+CONFIG_ISDN_CAPI_CAPIFS
+  This option provides a special file system, similar to /dev/pts with
+  device nodes for the special ttys established by using the
+  middleware extension above. If you want to use pppd with
+  pppdcapiplugin to dial up to your ISP, say Y here.
+
+CAPI2.0 capidrv interface support
+CONFIG_ISDN_CAPI_CAPIDRV
+  This option provides the glue code to hook up CAPI driven cards to
+  the legacy isdn4linux link layer.  If you have a card which is
+  supported by a CAPI driver, but still want to use old features like
+  ippp interfaces or ttyI emulation, say Y/M here.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called capidrv.o.
+
+AVM B1 ISA support
+CONFIG_ISDN_DRV_AVMB1_B1ISA
+  Enable support for the ISA version of the AVM B1 card.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called b1isa.o.
+
+AVM B1 PCI support
+CONFIG_ISDN_DRV_AVMB1_B1CICI
+  Enable support for the PCI version of the AVM B1 card.
+
+AVM B1 PCI V4 support
+CONFIG_ISDN_DRV_AVMB1_B1PCIV4
+  Enable support for the V4 version of AVM B1 PCI card.
+
+AVM T1/T1-B ISA support
+CONFIG_ISDN_DRV_AVMB1_T1ISA
+  Enable support for the AVM T1 T1B card.
+  Note: This is a PRI card and handle 30 B-channels.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called t1isa.o.
+
+AVM B1/M1/M2 PCMCIA support
+CONFIG_ISDN_DRV_AVMB1_B1PCMCIA
+  Enable support for the PCMCIA version of the AVM B1 card.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called b1pcmcia.o.
+
+AVM B1/M1/M2 PCMCIA cs module
+CONFIG_ISDN_DRV_AVMB1_AVM_CS
+  Enable the PCMCIA client driver for the AVM B1/M1/M2
+  PCMCIA cards.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called avm_cs.o.
+
+AVM T1/T1-B PCI support
+CONFIG_ISDN_DRV_AVMB1_T1PCI
+  Enable support for the AVM T1 T1B card.
+  Note: This is a PRI card and handle 30 B-channels.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called t1pci.o.
+
+AVM C4/C2 support
+CONFIG_ISDN_DRV_AVMB1_C4
+  Enable support for the AVM C4/C2 PCI cards.
+  These cards handle 4/2 BRI ISDN lines (8/4 channels).
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called c4.o.
+
+Verbose reason code reporting (kernel size +=7K)
+CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON
+  If you say Y here, the AVM B1 driver will give verbose reasons for
+  disconnecting. This will increase the size of the kernel by 7 KB. If
+  unsure, say Y.
+
+IBM Active 2000 support
+CONFIG_ISDN_DRV_ACT2000
+  Say Y here if you have an IBM Active 2000 ISDN card. In order to use
+  this card, additional firmware is necessary, which has to be loaded
+  into the card using a utility which is part of the latest
+  isdn4k-utils package. Please read the file
+  <file:Documentation/isdn/README.act2000> for more information.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called act2000.o.
+
+Auvertech TurboPAM support
+CONFIG_ISDN_DRV_TPAM
+  This enables support for the Auvertech TurboPAM ISDN-card.
+  For running this card, additional firmware is necessary, which has
+  to be downloaded into the card using a utility which is distributed
+  separately from the Auvertech's web site: <http://www.auvertech.fr/>.
+
+  Please redirect all support questions to support@auvertech.fr.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called tpam.o.
+
+Hypercope HYSDN cards (Champ, Ergo, Metro) support (module)
+CONFIG_HYSDN
+  Say Y here if you have one of Hypercope's active PCI ISDN cards
+  Champ, Ergo and Metro. You will then get a module called hysdn.o.
+  Please read the file <file:Documentation/isdn/README.hysdn> for more
+  information.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called hysdn.o.
+
+HYSDN CAPI 2.0 support
+CONFIG_HYSDN_CAPI
+  Say Y here if you like to use Hypercope's CAPI 2.0 interface.
+
+Support for SUN4 machines (disables SUN4[CDM] support)
+CONFIG_SUN4
+  Say Y here if, and only if, your machine is a Sun4. Note that
+  a kernel compiled with this option will run only on Sun4.
+  (And the current version will probably work only on sun4/330.)
+
+SPARC ESP SCSI support
+CONFIG_SCSI_SUNESP
+  This is the driver for the Sun ESP SCSI host adapter. The ESP
+  chipset is present in most SPARC SBUS-based computers.
+
+  This support is also available as a module called esp.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+PTI Qlogic, ISP Driver
+CONFIG_SCSI_QLOGICPTI
+  This driver supports SBUS SCSI controllers from PTI or QLogic. These
+  controllers are known under Solaris as qpti and in the openprom as
+  PTI,ptisp or QLGC,isp. Note that PCI QLogic SCSI controllers are
+  driven by a different driver.
+
+  This support is also available as a module called qlogicpti.o ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Sun PROM console
+CONFIG_PROM_CONSOLE
+  Say Y to build a console driver for Sun machines that uses the
+  terminal emulation built into their console PROMS.
+
+/dev/openprom device support
+CONFIG_SUN_OPENPROMIO
+  This driver provides user programs with an interface to the SPARC
+  PROM device tree. The driver implements a SunOS-compatible
+  interface and a NetBSD-compatible interface.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M and read <file:Documentation/modules.txt>. If unsure, say Y.
+
+Openprom tree appears in /proc/openprom
+CONFIG_SUN_OPENPROMFS
+  If you say Y, the OpenPROM device tree will be available as a
+  virtual file system, which you can mount to /proc/openprom by "mount
+  -t openpromfs none /proc/openprom".
+
+  If you want to compile the /proc/openprom support as a module ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want), say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called openpromfs.o.  If unsure, say M.
+
+Kernel support for Linux/Sparc 32bit binary compatibility
+CONFIG_SPARC32_COMPAT
+  This allows you to run 32-bit binaries on your Ultra.
+  Everybody wants this; say Y.
+
+Kernel support for 32-bit ELF binaries
+CONFIG_BINFMT_ELF32
+  This allows you to run 32-bit Linux/ELF binaries on your machine.
+  Everybody wants this; say Y.
+
+Kernel support for 32-bit (ie. SunOS) a.out binaries
+CONFIG_BINFMT_AOUT32
+  This allows you to run 32-bit a.out format binaries on your Ultra.
+  If you want to run SunOS binaries (see SunOS binary emulation below)
+  or other a.out binaries, say Y. If unsure, say N.
+
+SunOS binary emulation
+CONFIG_SUNOS_EMUL
+  This allows you to run most SunOS binaries.  If you want to do this,
+  say Y here and place appropriate files in /usr/gnemul/sunos. See
+  <http://www.ultralinux.org/faq.html> for more information.  If you
+  want to run SunOS binaries on an Ultra you must also say Y to
+  "Kernel support for 32-bit a.out binaries" above.
+
+Mostek real time clock support
+CONFIG_SUN_MOSTEK_RTC
+  The Mostek RTC chip is used on all known Sun computers except
+  some JavaStations. For a JavaStation you need to say Y both here
+  and to "Enhanced Real Time Clock Support".
+
+  Say Y here unless you are building a special purpose kernel.
+
+OBP Flash Device support
+CONFIG_OBP_FLASH
+  The OpenBoot PROM on Ultra systems is flashable. If you want to be
+  able to upgrade the OBP firmware, say Y here.
+
+JavaStation OS Flash SIMM
+CONFIG_SUN_JSFLASH
+  If you say Y here, you will be able to boot from your JavaStation's
+  Flash memory.
+
+Siemens SAB82532 serial support
+CONFIG_SAB82532
+  This driver supports the serial ports on newer (PCI) Ultra systems.
+  Say Y if you want to be able to use your serial ports.
+
+Videopix Frame Grabber
+CONFIG_SUN_VIDEOPIX
+  Say Y here to support the Videopix Frame Grabber from Sun
+  Microsystems, commonly found on SPARCstations.  This card, which is
+  based on the Phillips SAA9051, can handle NTSC and PAL/SECAM and
+  SVIDEO signals.
+
+Sun bidirectional parallel port support
+CONFIG_SUN_BPP
+  Say Y here to support Sun's obsolete variant of IEEE1284
+  bidirectional parallel port protocol as /dev/bppX.  Can be built on
+  x86 machines.
+
+Aurora Multiboard 1600se
+CONFIG_SUN_AURORA
+  The Aurora Multiboard is a multi-port high-speed serial controller.
+  If you have one of these, say Y.
+
+Tadpole TS102 Microcontroller support
+CONFIG_TADPOLE_TS102_UCTRL
+  Say Y here to directly support the TS102 Microcontroller interface
+  on the Tadpole Sparcbook 3.  This device handles power-management
+  events, and can also notice the attachment/detachment of external
+  monitors and mice.
+
+Audio support
+CONFIG_SPARCAUDIO
+  This driver provides support for the build-in sound devices on most
+  Sun machines. If you want to be able to use this, select this option
+  and one or more of the lowlevel drivers below. See
+  <http://www.dementia.org/~shadow/sparcaudio.html> for more
+  information.
+
+AMD7930 Lowlevel Driver
+CONFIG_SPARCAUDIO_AMD7930
+  This driver supports the AMD 7930 chip found on sun4c, 4/6xx, and
+  SparcClassic systems.
+
+CS4231 Lowlevel Driver
+CONFIG_SPARCAUDIO_CS4231
+  This driver supports the Crystal Semiconductor CS4231 chip found on
+  the SS4, SS5, and Ultras.
+
+DBRI Lowlevel Driver
+CONFIG_SPARCAUDIO_DBRI
+  This driver supports the DBRI audio interface found on the SS10,
+  SS20, LX, Sparcbook 3, and Voyager systems.
+
+Dummy Lowlevel Driver
+CONFIG_SPARCAUDIO_DUMMY
+  This is a pseudo-driver used for debugging and testing the
+  sparcaudio subsystem. Say N unless you want to work on this
+  subsystem.
+
+Sparc hardware
+CONFIG_PARPORT_SUNBPP
+  This driver provides support for the bidirectional parallel port
+  found on many Sun machines. Note that many of the newer Ultras
+  actually have pc style hardware instead.
+
+SPARC power management support
+CONFIG_SUN_PM
+  Enable power management and CPU standby features on supported 
+  SPARC platforms. 
+
+/proc/hardware support
+CONFIG_PROC_HARDWARE
+  Say Y here to support the /proc/hardware file, which gives you
+  access to information about the machine you're running on,
+  including the model, CPU, MMU, clock speed, BogoMIPS rating,
+  and memory size.
+
+Bluetooth subsystem support
+CONFIG_BLUEZ
+  Bluetooth is low-cost, low-power, short-range wireless technology.
+  It was designed as a replacement for cables and other short-range
+  technologies like IrDA.  Bluetooth operates in personal area range
+  that typically extends up to 10 meters.  More information about
+  Bluetooth can be found at <http://www.bluetooth.com/>.
+
+  Linux Bluetooth subsystem consist of several layers:
+               BlueZ Core (HCI device and connection manager, scheduler)
+               HCI Device drivers (interface to the hardware)
+               L2CAP Module (L2CAP protocol)
+               SCO Module (SCO links)
+               RFCOMM Module (RFCOMM protocol)
+               BNEP Module (BNEP protocol)
+               CMTP Module (CMTP protocol)
+
+  Say Y here to enable Linux Bluetooth support and to build BlueZ Core
+  layer.
+
+  To use Linux Bluetooth subsystem, you will need several user-space
+  utilities like hciconfig and hcid.  These utilities and updates to
+  Bluetooth kernel modules are provided in the BlueZ package.
+  For more information, see <http://bluez.sourceforge.net/>.
+
+  If you want to compile BlueZ Core as module (bluez.o) say M here.
+
+L2CAP protocol support
+CONFIG_BLUEZ_L2CAP
+  L2CAP (Logical Link Control and Adaptation Protocol) provides
+  connection oriented and connection-less data transport.  L2CAP
+  support is required for most Bluetooth applications.
+
+  Say Y here to compile L2CAP support into the kernel or say M to
+  compile it as module (l2cap.o).
+
+SCO links support
+CONFIG_BLUEZ_SCO
+  SCO link provides voice transport over Bluetooth. SCO support is
+  required for voice applications like Headset and Audio.
+
+  Say Y here to compile SCO support into the kernel or say M to
+  compile it as module (sco.o).
+
+RFCOMM protocol support
+CONFIG_BLUEZ_RFCOMM
+  RFCOMM provides connection oriented stream transport. RFCOMM
+  support is required for Dialup Networking, OBEX and other Bluetooth
+  applications.
+
+  Say Y here to compile RFCOMM support into the kernel or say M to
+  compile it as module (rfcomm.o).
+
+RFCOMM TTY emulation support
+CONFIG_BLUEZ_RFCOMM_TTY
+  This option enables TTY emulation support for RFCOMM channels.
+
+BNEP protocol support
+CONFIG_BLUEZ_BNEP
+  BNEP (Bluetooth Network Encapsulation Protocol) is Ethernet
+  emulation layer on top of Bluetooth. BNEP is required for Bluetooth
+  PAN (Personal Area Network).
+
+  To use BNEP, you will need user-space utilities provided in the 
+  BlueZ-PAN package.
+  For more information, see <http://bluez.sourceforge.net>.
+
+  Say Y here to compile BNEP support into the kernel or say M to
+  compile it as module (bnep.o).
+
+CMTP protocol support
+CONFIG_BLUEZ_CMTP
+  CMTP (CAPI Message Transport Protocol) is a transport layer
+  for CAPI messages. CMTP is required for the Bluetooth Common
+  ISDN Access Profile.
+
+  Say Y here to compile CMTP support into the kernel or say M to
+  compile it as module (cmtp.o).
+
+BNEP multicast filter support
+CONFIG_BLUEZ_BNEP_MC_FILTER
+  This option enables the multicast filter support for BNEP.
+
+BNEP protocol filter support
+CONFIG_BLUEZ_BNEP_PROTO_FILTER
+  This option enables the protocol filter support for BNEP.
+
+HCI UART driver
+CONFIG_BLUEZ_HCIUART
+  Bluetooth HCI UART driver.
+  This driver is required if you want to use Bluetooth devices with
+  serial port interface. You will also need this driver if you have 
+  UART based Bluetooth PCMCIA and CF devices like Xircom Credit Card 
+  adapter and BrainBoxes Bluetooth PC Card.
+
+  Say Y here to compile support for Bluetooth UART devices into the
+  kernel or say M to compile it as module (hci_uart.o).
+
+HCI UART (H4) protocol support 
+CONFIG_BLUEZ_HCIUART_H4
+  UART (H4) is serial protocol for communication between Bluetooth 
+  device and host. This protocol is required for most Bluetooth devices 
+  with UART interface, including PCMCIA and CF cards. 
+
+  Say Y here to compile support for HCI UART (H4) protocol.
+
+HCI BCSP protocol support 
+CONFIG_BLUEZ_HCIUART_BCSP
+  BCSP (BlueCore Serial Protocol) is serial protocol for communication 
+  between Bluetooth device and host. This protocol is required for non
+  USB Bluetooth devices based on CSR BlueCore chip, including PCMCIA and 
+  CF cards.
+
+  Say Y here to compile support for HCI BCSP protocol.
+
+HCI BCSP transmit CRC with every BCSP packet
+CONFIG_BLUEZ_HCIUART_BCSP_TXCRC
+  If you say Y here, a 16-bit CRC checksum will be transmitted along with
+  every BCSP (BlueCore Serial Protocol) packet sent to the Bluetooth chip.
+  This increases reliability, but slightly reduces efficiency.
+
+HCI USB driver
+CONFIG_BLUEZ_HCIUSB
+  Bluetooth HCI USB driver.
+  This driver is required if you want to use Bluetooth devices with
+  USB interface.
+
+  Say Y here to compile support for Bluetooth USB devices into the
+  kernel or say M to compile it as module (hci_usb.o).
+
+HCI USB SCO (voice) support
+CONFIG_BLUEZ_USB_SCO
+  This option enables the SCO support in the HCI USB driver. You need this
+  to transmit voice data with your Bluetooth USB device. And your device
+  must also support sending SCO data over the HCI layer, because some of
+  them sends the SCO data to an internal PCM adapter.
+  Say Y here to compile support for HCI SCO data.
+HCI USB zero packet support
+CONFIG_BLUEZ_USB_ZERO_PACKET
+  This option is provided only as a work around for buggy Bluetooth USB 
+  devices. Do NOT enable it unless you know for sure that your device 
+  requires zero packets.
+  Most people should say N here.
+
+HCI VHCI Virtual HCI device driver
+CONFIG_BLUEZ_HCIVHCI
+  Bluetooth Virtual HCI device driver.
+  This driver is required if you want to use HCI Emulation software.
+
+  Say Y here to compile support for virtual HCI devices into the
+  kernel or say M to compile it as module (hci_vhci.o).
+
+HCI BFUSB device driver
+CONFIG_BLUEZ_HCIBFUSB
+  Bluetooth HCI BlueFRITZ! USB driver.
+  This driver provides support for Bluetooth USB devices with AVM
+  interface:
+     AVM BlueFRITZ! USB
+
+  Say Y here to compile support for HCI BFUSB devices into the
+  kernel or say M to compile it as module (bfusb.o).
+
+HCI DTL1 (PC Card) device driver
+CONFIG_BLUEZ_HCIDTL1
+  Bluetooth HCI DTL1 (PC Card) driver.
+  This driver provides support for Bluetooth PCMCIA devices with
+  Nokia DTL1 interface:
+     Nokia Bluetooth Card
+     Socket Bluetooth CF Card
+
+  Say Y here to compile support for HCI DTL1 devices into the
+  kernel or say M to compile it as module (dtl1_cs.o).
+
+HCI BT3C (PC Card) device driver
+CONFIG_BLUEZ_HCIBT3C
+  Bluetooth HCI BT3C (PC Card) driver.
+  This driver provides support for Bluetooth PCMCIA devices with
+  3Com BT3C interface:
+     3Com Bluetooth Card (3CRWB6096)
+     HP Bluetooth Card
+
+  The HCI BT3C driver uses external firmware loader program provided in
+  the BlueFW package. For more information, see <http://bluez.sf.net>.
+
+  Say Y here to compile support for HCI BT3C devices into the
+  kernel or say M to compile it as module (bt3c_cs.o).
+
+HCI BlueCard (PC Card) device driver
+CONFIG_BLUEZ_HCIBLUECARD
+  Bluetooth HCI BlueCard (PC Card) driver.
+  This driver provides support for Bluetooth PCMCIA devices with
+  Anycom BlueCard interface:
+     Anycom Bluetooth PC Card
+     Anycom Bluetooth CF Card
+
+  Say Y here to compile support for HCI BlueCard devices into the
+  kernel or say M to compile it as module (bluecard_cs.o).
+
+HCI UART (PC Card) device driver
+CONFIG_BLUEZ_HCIBTUART
+  Bluetooth HCI UART (PC Card) driver.
+  This driver provides support for Bluetooth PCMCIA devices with
+  an UART interface:
+     Xircom CreditCard Bluetooth Adapter
+     Xircom RealPort2 Bluetooth Adapter
+     Sphinx PICO Card
+     H-Soft blue+Card
+     Cyber-blue Compact Flash Card
+
+  Say Y here to compile support for HCI UART devices into the
+  kernel or say M to compile it as module (btuart_cs.o).
+
+# The following options are for Linux when running on the Hitachi
+# SuperH family of RISC microprocessors.
+
+SuperH RTC support
+CONFIG_SH_RTC
+  Selecting this option will allow the Linux kernel to emulate
+  PC's RTC.
+
+  If unsure, say N.
+
+SuperH peripheral clock frequency
+CONFIG_SH_PCLK_FREQ
+  Set this value or add "sh_pclk=" command line option to tell
+  peripheral clock frequency to kernel, if your system has no RTC.
+  Otherwise leave it 0, and kernel measures peripheral clock frequency
+  using TMU and RTC while system startup.
+
+  If unsure, set 0.
+
+Wakeup UBC on startup
+CONFIG_UBC_WAKEUP
+  Selecting this option will wakeup the User Break Controller (UBC) on
+  startup. Although the UBC is left in an awake state when the processor
+  comes up, some boot loaders misbehave by putting the UBC to sleep in a
+  power saving state, which causes issues with things like ptrace().
+
+  If unsure, say N.
+
+SuperH DMAC support
+CONFIG_SH_DMA
+  Selecting this option will provide same API as PC's Direct Memory
+  Access Controller(8237A) for SuperH DMAC.
+
+  If unsure, say N.
+
+# Choice: cf_area
+CompactFlash Connection Area
+CONFIG_CF_AREA5
+  If your board has "Directly Connected" CompactFlash, You should
+  select the area where your CF is connected to.
+  
+  - "Area5" if CompactFlash is connected to Area 5 (0x14000000)
+  - "Area6" if it is connected to Area 6 (0x18000000)
+
+  "Area6" will work for most boards. For ADX, select "Area5".
+
+Disable data cache
+CONFIG_DCACHE_DISABLE
+  This option allows you to run the kernel with data cache disabled.
+  Say Y if you experience CPM lock-ups.
+
+#
+# m68k-specific kernel options
+# Documented by Chris Lawrence <mailto:quango@themall.net> et al.
+#
+Amiga support
+CONFIG_AMIGA
+  This option enables support for the Amiga series of computers. If
+  you plan to use this kernel on an Amiga, say Y here and browse the
+  material available in <file:Documentation/m68k>; otherwise say N.
+
+Commodore A2232 serial support
+CONFIG_A2232
+  This option supports the 2232 7-port serial card shipped with the
+  Amiga 2000 and other Zorro-bus machines, dating from 1989.  At
+  a max of 19,200 bps, the ports are served by a 6551 ACIA UART chip
+  each, plus a 8520 CIA, and a master 6502 CPU and buffer as well. The
+  ports were connected with 8 pin DIN connectors on the card bracket,
+  for which 8 pin to DB25 adapters were supplied. The card also had
+  jumpers internally to toggle various pinning configurations.
+
+  This driver can be built as a module; but then "generic_serial.o"
+  will also be built as a module. This has to be loaded before
+  "ser_a2232.o". If you want to do this, answer M here and read
+  "<file:Documentation/modules.txt>".
+
+A4000T SCSI support
+CONFIG_A4000T_SCSI
+  Support for the NCR53C710 SCSI controller on the Amiga 4000T.
+
+A4091 SCSI support
+CONFIG_A4091_SCSI
+  Support for the NCR53C710 chip on the Amiga 4091 Z3 SCSI2 controller
+  (1993).  Very obscure -- the 4091 was part of an Amiga 4000 upgrade
+  plan at the time the Amiga business was sold to DKB.
+
+Atari support
+CONFIG_ATARI
+  This option enables support for the 68000-based Atari series of
+  computers (including the TT, Falcon and Medusa). If you plan to use
+  this kernel on an Atari, say Y here and browse the material
+  available in <file:Documentation/m68k>; otherwise say N.
+
+Hades support
+CONFIG_HADES
+  This option enables support for the Hades Atari clone. If you plan
+  to use this kernel on a Hades, say Y here; otherwise say N.
+
+Macintosh support
+CONFIG_MAC
+  This option enables support for the Apple Macintosh series of
+  computers (yes, there is experimental support now, at least for part
+  of the series).
+
+  Say N unless you're willing to code the remaining necessary support.
+  ;)
+
+HP9000/300 support
+CONFIG_HP300
+  This option enables support for the HP9000/300 series of
+  workstations. Support for these machines is still very experimental.
+  If you plan to try to use the kernel on such a machine say Y here.
+  Everybody else says N.
+
+Q40/Q60 support
+CONFIG_Q40
+  The Q40 is a Motorola 68040-based successor to the Sinclair QL
+  manufactured in Germany.  There is an official Q40 home page at
+  <http://www.q40.de/>.  This option enables support for the Q40 and
+  Q60. Select your CPU below.  For 68LC060 don't forget to enable FPU
+  emulation.
+
+Q40/Q60 IDE interface support
+CONFIG_BLK_DEV_Q40IDE
+  Enable the on-board IDE controller in the Q40/Q60.  This should
+  normally be on; disable it only if you are running a custom hard
+  drive subsystem through an expansion card.
+
+Sun 3 support
+CONFIG_SUN3
+  This option enables support for the Sun 3 series of workstations.
+  Note that if this option is enabled, support for all other m68k 
+  platforms above must be disabled in order to produce a working 
+  kernel.
+
+  Also, you will want to enable 68020 support below, and disable 
+  all other CPU types.  General Linux information on the Sun 3x series
+  (now discontinued) is at
+  <http://www.angelfire.com/ca2/tech68k/sun3.html>.
+
+  If you don't want to compile a kernel for a Sun 3, say N.
+
+Sun 3X support
+CONFIG_SUN3X
+  This option enables support for the Sun 3x series of workstations.
+  Currently, only the Sun 3/80 is supported within the Sun 3x family.
+  You will also want to enable 68030 support below  
+  General Linux information on the Sun 3x series (now discontinued)
+  is at <http://www.angelfire.com/ca2/tech68k/sun3.html>.
+
+  If you don't want to compile a kernel for a Sun 3x, say N.
+
+Sun3x builtin serial support
+CONFIG_SUN3X_ZS
+  ZS refers to a type of asynchronous serial port built in to the Sun3
+  and Sun3x workstations; if you have a Sun 3, you probably have
+  these.  Say 'Y' to support ZS ports directly.  This option must be
+  enabled in order to support the keyboard and mouse ports.
+
+Sun keyboard support
+CONFIG_SUN_KEYBOARD
+  Say Y here to support the keyboard found on Sun 3 and 3x
+  workstations.  It can also be used support Sun Type-5 keyboards
+  through an adaptor.  See
+  <http://www.suse.cz/development/input/adapters.html> and
+  <http://sourceforge.net/projects/linuxconsole/> for details on the
+  latter.
+
+68020 support
+CONFIG_M68020
+  If you anticipate running this kernel on a computer with a MC68020
+  processor, say Y. Otherwise, say N. Note that the 68020 requires a
+  68851 MMU (Memory Management Unit) to run Linux/m68k, except on the
+  Sun 3, which provides its own version.
+
+68030 support
+CONFIG_M68030
+  If you anticipate running this kernel on a computer with a MC68030
+  processor, say Y. Otherwise, say N. Note that a MC68EC030 will not
+  work, as it does not include an MMU (Memory Management Unit).
+
+68040 support
+CONFIG_M68040
+  If you anticipate running this kernel on a computer with a MC68LC040
+  or MC68040 processor, say Y. Otherwise, say N. Note that an
+  MC68EC040 will not work, as it does not include an MMU (Memory
+  Management Unit).
+
+68060 support
+CONFIG_M68060
+  If you anticipate running this kernel on a computer with a MC68060
+  processor, say Y. Otherwise, say N.
+
+Math emulation support
+CONFIG_M68KFPU_EMU
+  At some point in the future, this will cause floating-point math
+  instructions to be emulated by the kernel on machines that lack a
+  floating-point math coprocessor.  Thrill-seekers and chronically
+  sleep-deprived psychotic hacker types can say Y now, everyone else
+  should probably wait a while.
+
+Math emulation only kernel
+CONFIG_M68KFPU_EMU_ONLY
+  This option prevents any floating-point instructions from being
+  compiled into the kernel, thereby the kernel doesn't save any
+  floating point context anymore during task switches, so this
+  kernel will only be usable on machines without a floating-point
+  math coprocessor. This makes the kernel a bit faster as no tests
+  needs to be executed whether a floating-point instruction in the
+  kernel should be executed or not.
+
+Math emulation extra precision
+CONFIG_M68KFPU_EMU_EXTRAPREC
+  The fpu uses normally a few bit more during calculations for
+  correct rounding, the emulator can (often) do the same but this
+  extra calculation can cost quite some time, so you can disable
+  it here. The emulator will then "only" calculate with a 64 bit
+  mantissa and round slightly incorrect, what is more then enough
+  for normal usage.
+
+Advanced configuration options
+CONFIG_ADVANCED
+  This gives you access to some advanced options for the CPU. The
+  defaults should be fine for most users, but these options may make
+  it possible for you to improve performance somewhat if you know what
+  you are doing.
+
+  Note that the answer to this question won't directly affect the
+  kernel: saying N will just cause the configurator to skip all
+  the questions about these options.
+
+  Most users should say N to this question.
+
+Use one physical chunk of memory only
+CONFIG_SINGLE_MEMORY_CHUNK
+  Ignore all but the first contiguous chunk of physical memory for VM
+  purposes.  This will save a few bytes kernel size and may speed up
+  some operations.  Say N if not sure.
+
+Use read-modify-write instructions
+CONFIG_RMW_INSNS
+  This allows to use certain instructions that work with indivisible
+  read-modify-write bus cycles. While this is faster than the
+  workaround of disabling interrupts, it can conflict with DMA
+  ( = direct memory access) on many Amiga systems, and it is also said
+  to destabilize other machines. It is very likely that this will
+  cause serious problems on any Amiga or Atari Medusa if set. The only
+  configuration where it should work are 68030-based Ataris, where it
+  apparently improves performance. But you've been warned! Unless you
+  really know what you are doing, say N. Try Y only if you're quite
+  adventurous.
+
+Amiga Zorro (AutoConfig) bus support
+CONFIG_ZORRO
+  This enables support for the Zorro bus in the Amiga. If you have
+  expansion cards in your Amiga that conform to the Amiga
+  AutoConfig(tm) specification, say Y, otherwise N. Note that even
+  expansion cards that do not fit in the Zorro slots but fit in e.g.
+  the CPU slot may fall in this category, so you have to say Y to let
+  Linux use these.
+
+Zorro device name database
+CONFIG_ZORRO_NAMES
+  By default, the kernel contains a database of all known Zorro device
+  names to make the information in /proc/iomem comprehensible to the
+  user. This database increases the size of the kernel image by about
+  15KB, but it gets freed after the system boots up, so it doesn't
+  take up kernel memory. Anyway, if you are building an installation
+  floppy or kernel for an embedded system where kernel image size
+  really matters, you can disable this feature and you'll get device
+  ID numbers instead of names.
+
+  When in doubt, say Y.
+
+Amiga 1200/600 PCMCIA support
+CONFIG_AMIGA_PCMCIA
+  Include support in the kernel for pcmcia on Amiga 1200 and Amiga
+  600. If you intend to use pcmcia cards say Y; otherwise say N.
+
+Hisoft Whippet PCMCIA serial support
+CONFIG_WHIPPET_SERIAL
+  HiSoft has a web page at <http://www.hisoft.co.uk/>, but there
+  is no listing for the Whippet in their Amiga section.
+
+Amiga Zorro II ramdisk support
+CONFIG_AMIGA_Z2RAM
+  This enables support for using Chip RAM and Zorro II RAM as a
+  ramdisk or as a swap partition. Say Y if you want to include this
+  driver in the kernel. This driver is also available as a module
+  ( = code which can be inserted in and removed from the running
+  kernel whenever you want). The module is called z2ram.o. If you want
+  to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+Support for ST-RAM as swap space
+CONFIG_STRAM_SWAP
+  Some Atari 68k machines (including the 520STF and 1020STE) divide
+  their addressable memory into ST and TT sections.  The TT section
+  (up to 512MB) is the main memory; the ST section (up to 4MB) is
+  accessible to the built-in graphics board, runs slower, and is
+  present mainly for backward compatibility with older machines.
+
+  This enables support for using (parts of) ST-RAM as swap space,
+  instead of as normal system memory. This can first enhance system
+  performance if you have lots of alternate RAM (compared to the size
+  of ST-RAM), because executable code always will reside in faster
+  memory. ST-RAM will remain as ultra-fast swap space. On the other
+  hand, it allows much improved dynamic allocations of ST-RAM buffers
+  for device driver modules (e.g. floppy, ACSI, SLM printer, DMA
+  sound). The probability that such allocations at module load time
+  fail is drastically reduced.
+
+ST-RAM statistics in /proc
+CONFIG_STRAM_PROC
+  Say Y here to report ST-RAM usage statistics in /proc/stram.  See
+  the help for CONFIG_STRAM_SWAP for discussion of ST-RAM and its
+  uses.
+
+Atari ACSI support
+CONFIG_ATARI_ACSI
+  This enables support for the Atari ACSI interface. The driver
+  supports hard disks and CD-ROMs, which have 512-byte sectors, or can
+  be switched to that mode. Due to the ACSI command format, only disks
+  up to 1 GB are supported. Special support for certain ACSI to SCSI
+  adapters, which could relax that, isn't included yet. The ACSI
+  driver is also the basis for certain other drivers for devices
+  attached to the ACSI bus: Atari SLM laser printer, BioNet-100
+  Ethernet, and PAMsNet Ethernet. If you want to use one of these
+  devices, you need ACSI support, too.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called acsi.o.
+
+Probe all LUNs on each ACSI device
+CONFIG_ACSI_MULTI_LUN
+  If you have a ACSI device that supports more than one LUN (Logical
+  Unit Number), e.g. a CD jukebox, you should say Y here so that all
+  will be found by the ACSI driver. An ACSI device with multiple LUNs
+  acts logically like multiple ACSI devices. The vast majority of ACSI
+  devices have only one LUN, and so most people can say N here and
+  should in fact do so, because it is safer.
+
+Atari SLM laser printer support
+CONFIG_ATARI_SLM
+  If you have an Atari SLM laser printer, say Y to include support for
+  it in the kernel. Otherwise, say N. This driver is also available as
+  a module ( = code which can be inserted in and removed from the
+  running kernel whenever you want). The module will be called
+  acsi_slm.o. Be warned: the driver needs much ST-RAM and can cause
+  problems due to that fact!
+
+A3000 WD33C93A support
+CONFIG_A3000_SCSI
+  If you have an Amiga 3000 and have SCSI devices connected to the
+  built-in SCSI controller, say Y. Otherwise, say N. This driver is
+  also available as a module ( = code which can be inserted in and
+  removed from the running kernel whenever you want). The module is
+  called wd33c93.o. If you want to compile it as a module, say M here
+  and read <file:Documentation/modules.txt>.
+
+A2091 WD33C93A support
+CONFIG_A2091_SCSI
+  If you have a Commodore A2091 SCSI controller, say Y. Otherwise,
+  say N. This driver is also available as a module ( = code which can
+  be inserted in and removed from the running kernel whenever you
+  want). The module is called wd33c93.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+GVP Series II WD33C93A support
+CONFIG_GVP11_SCSI
+  If you have a Great Valley Products Series II SCSI controller,
+  answer Y. Also say Y if you have a later model of GVP SCSI
+  controller (such as the GVP A4008 or a Combo board). Otherwise,
+  answer N. This driver does NOT work for the T-Rex series of
+  accelerators from TekMagic and GVP-M.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you
+  want). The module will be called gvp11.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+CyberStorm SCSI support
+CONFIG_CYBERSTORM_SCSI
+  If you have an Amiga with an original (MkI) Phase5 Cyberstorm
+  accelerator board and the optional Cyberstorm SCSI controller,
+  answer Y. Otherwise, say N.
+
+CyberStorm II SCSI support
+CONFIG_CYBERSTORMII_SCSI
+  If you have an Amiga with a Phase5 Cyberstorm MkII accelerator board
+  and the optional Cyberstorm SCSI controller, say Y. Otherwise,
+  answer N.
+
+Blizzard 2060 SCSI support
+CONFIG_BLZ2060_SCSI
+  If you have an Amiga with a Phase5 Blizzard 2060 accelerator board
+  and want to use the onboard SCSI controller, say Y. Otherwise,
+  answer N.
+
+Blizzard 1230IV/1260 SCSI support
+CONFIG_BLZ1230_SCSI
+  If you have an Amiga 1200 with a Phase5 Blizzard 1230IV or Blizzard
+  1260 accelerator, and the optional SCSI module, say Y. Otherwise,
+  say N.
+
+Blizzard PowerUP 603e+ SCSI support
+CONFIG_BLZ603EPLUS_SCSI
+  If you have an Amiga 1200 with a Phase5 Blizzard PowerUP 603e+
+  accelerator, say Y. Otherwise, say N.
+
+Fastlane SCSI support
+CONFIG_FASTLANE_SCSI
+  If you have the Phase5 Fastlane Z3 SCSI controller, or plan to use
+  one in the near future, say Y to this question. Otherwise, say N.
+
+BSC Oktagon SCSI support
+CONFIG_OKTAGON_SCSI
+  If you have the BSC Oktagon SCSI disk controller for the Amiga, say
+  Y to this question.  If you're in doubt about whether you have one,
+  see the picture at
+  <http://amiga.multigraph.com/photos/oktagon.html>.
+
+Atari native SCSI support
+CONFIG_ATARI_SCSI
+  If you have an Atari with built-in NCR5380 SCSI controller (TT,
+  Falcon, ...) say Y to get it supported. Of course also, if you have
+  a compatible SCSI controller (e.g. for Medusa).  This driver is also
+  available as a module ( = code which can be inserted in and removed
+  from the running kernel whenever you want).  The module is called
+  atari_scsi.o.  If you want to compile it as a module, say M here and
+  read <file:Documentation/modules.txt>.  This driver supports both
+  styles of NCR integration into the system: the TT style (separate
+  DMA), and the Falcon style (via ST-DMA, replacing ACSI).  It does
+  NOT support other schemes, like in the Hades (without DMA).
+
+Long delays for Toshiba CD-ROMs
+CONFIG_ATARI_SCSI_TOSHIBA_DELAY
+  This option increases the delay after a SCSI arbitration to
+  accommodate some flaky Toshiba CD-ROM drives. Say Y if you intend to
+  use a Toshiba CD-ROM drive; otherwise, the option is not needed and
+  would impact performance a bit, so say N.
+
+Reset SCSI-devices at boottime
+CONFIG_ATARI_SCSI_RESET_BOOT
+  Reset the devices on your Atari whenever it boots.  This makes the
+  boot process fractionally longer but may assist recovery from errors
+  that leave the devices with SCSI operations partway completed.
+
+Hades SCSI DMA emulator
+CONFIG_TT_DMA_EMUL
+  This option enables code which emulates the TT SCSI DMA chip on the
+  Hades. This increases the SCSI transfer rates at least ten times
+  compared to PIO transfers.
+
+Sun3x ESP SCSI
+CONFIG_SUN3X_ESP
+  This option will enable support for the ESP SCSI controller found
+  onboard the Sun 3/80.
+
+Ariadne support
+CONFIG_ARIADNE
+  If you have a Village Tronic Ariadne Ethernet adapter, say Y.
+  Otherwise, say N.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you
+  want). The module is called ariadne.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+Ariadne II and X-Surf support
+CONFIG_ARIADNE2
+  This driver is for the Village Tronic Ariadne II and the Individual
+  Computers X-Surf Ethernet cards. If you have such a card, say Y.
+  Otherwise, say N.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called ariadne2.o. If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+A2065 support
+CONFIG_A2065
+  If you have a Commodore A2065 Ethernet adapter, say Y. Otherwise,
+  say N.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you
+  want). The module is called a2065.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Hydra support
+CONFIG_HYDRA
+  If you have a Hydra Ethernet adapter, say Y. Otherwise, say N.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you
+  want). The module is called hydra.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Sun3 NCR5380 SCSI
+CONFIG_SUN3_SCSI
+  This option will enable support for the OBIO (onboard io) NCR5380
+  SCSI controller found in the Sun 3/50 and 3/60, as well as for
+  "Sun3" type VME scsi controllers also based on the NCR5380.
+  General Linux information on the Sun 3 series (now discontinued)
+  is at <http://www.angelfire.com/ca2/tech68k/sun3.html>.
+
+PCMCIA NE2000 and compatibles support
+CONFIG_APNE
+  If you have a PCMCIA NE2000 compatible adapter, say Y.  Otherwise,
+  say N.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you
+  want). The module is called apne.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Atari Lance support
+CONFIG_ATARILANCE
+  Say Y to include support for several Atari Ethernet adapters based
+  on the AMD Lance chipset: RieblCard (with or without battery), or
+  PAMCard VME (also the version by Rhotron, with different addresses).
+
+BioNet-100 support
+CONFIG_ATARI_BIONET
+  Say Y to include support for BioData's BioNet-100 Ethernet adapter
+  for the ACSI port. The driver works (has to work...) with a polled
+  I/O scheme, so it's rather slow :-(
+
+PAMsNet support
+CONFIG_ATARI_PAMSNET
+  Say Y to include support for the PAMsNet Ethernet adapter for the
+  ACSI port ("ACSI node"). The driver works (has to work...) with a
+  polled I/O scheme, so it's rather slow :-(
+
+Amiga mouse support
+CONFIG_AMIGAMOUSE
+  If you want to be able to use an Amiga mouse in Linux, say Y.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called amigamouse.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Atari mouse support
+CONFIG_ATARIMOUSE
+  If you want to be able to use an Atari mouse in Linux, say Y.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module is called atarimouse.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+Atari MFP serial support
+CONFIG_ATARI_MFPSER
+  If you like to use the MFP serial ports ("Modem1", "Serial1") under
+  Linux, say Y. The driver equally supports all kinds of MFP serial
+  ports and automatically detects whether Serial1 is available.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+  Note for Falcon users: You also have an MFP port, it's just not
+  wired to the outside... But you could use the port under Linux.
+
+Atari SCC serial support
+CONFIG_ATARI_SCC
+  If you have serial ports based on a Zilog SCC chip (Modem2, Serial2,
+  LAN) and like to use them under Linux, say Y. All built-in SCC's are
+  supported (TT, MegaSTE, Falcon), and also the ST-ESCC. If you have
+  two connectors for channel A (Serial2 and LAN), they are visible as
+  two separate devices.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+Atari SCC serial DMA support
+CONFIG_ATARI_SCC_DMA
+  This enables DMA support for receiving data on channel A of the SCC.
+  If you have a TT you may say Y here and read
+  drivers/char/atari_SCC.README. All other users should say N here,
+  because only the TT has SCC-DMA, even if your machine keeps claiming
+  so at boot time.
+
+Atari MIDI serial support
+CONFIG_ATARI_MIDI
+  If you want to use your Atari's MIDI port in Linux, say Y.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you
+  want). If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+Atari DSP56k Digital Signal Processor support
+CONFIG_ATARI_DSP56K
+  If you want to be able to use the DSP56001 in Falcons, say Y. This
+  driver is still experimental, and if you don't know what it is, or
+  if you don't have this processor, just say N.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+Support for early boot text console
+CONFIG_BOOTX_TEXT
+  Say Y here to see progress messages from the boot firmware in text
+  mode. Requires either BootX or Open Firmware.
+
+Amiga builtin serial support
+CONFIG_AMIGA_BUILTIN_SERIAL
+  If you want to use your Amiga's built-in serial port in Linux,
+  answer Y.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you
+  want). If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+GVP IO-Extender support
+CONFIG_GVPIOEXT
+  If you want to use a GVP IO-Extender serial card in Linux, say Y.
+  Otherwise, say N.
+
+GVP IO-Extender parallel printer support
+CONFIG_GVPIOEXT_LP
+  Say Y to enable driving a printer from the parallel port on your
+  GVP IO-Extender card, N otherwise.
+
+GVP IO-Extender PLIP support
+CONFIG_GVPIOEXT_PLIP
+  Say Y to enable doing IP over the parallel port on your GVP
+  IO-Extender card, N otherwise.
+
+Multiface Card III serial support
+CONFIG_MULTIFACE_III_TTY
+  If you want to use a Multiface III card's serial port in Linux,
+  answer Y.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+Amiga/Atari/PowerMac DMA sound support
+CONFIG_DMASOUND
+  Support built-in audio chips accessible by DMA on various machines
+  that have them.  Note that this symbol does not affect the kernel
+  directly; rather, it controls whether configuration questions
+  enabling DMA sound drivers for various specific machine
+  architectures will be used.
+
+Atari DMA sound support
+CONFIG_DMASOUND_ATARI
+  If you want to use the internal audio of your Atari in Linux, answer
+  Y to this question. This will provide a Sun-like /dev/audio,
+  compatible with the Linux/i386 sound system. Otherwise, say N.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you
+  want). If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+PowerMac DMA sound support
+CONFIG_DMASOUND_PMAC
+  If you want to use the internal audio of your PowerMac in Linux,
+  answer Y to this question. This will provide a Sun-like /dev/audio,
+  compatible with the Linux/i386 sound system. Otherwise, say N.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you
+  want). If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+Amiga DMA sound support
+CONFIG_DMASOUND_PAULA
+  If you want to use the internal audio of your Amiga in Linux, answer
+  Y to this question. This will provide a Sun-like /dev/audio,
+  compatible with the Linux/i386 sound system. Otherwise, say N.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you
+  want). If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+Q40 sound support
+CONFIG_DMASOUND_Q40
+  If you want to use the internal audio of your Q40 in Linux, answer
+  Y to this question. This will provide a Sun-like /dev/audio,
+  compatible with the Linux/i386 sound system. Otherwise, say N.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you
+  want). If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+HP DCA serial support
+CONFIG_HPDCA
+  If you want to use the internal "DCA" serial ports on an HP300
+  machine, say Y here.
+
+HP on-board LANCE support
+CONFIG_HPLANCE
+  If you want to use the builtin "LANCE" Ethernet controller on an
+  HP300 machine, say Y here.
+
+DIO bus support
+CONFIG_DIO
+  Say Y here to enable support for the "DIO" expansion bus used in
+  HP300 machines. If you are using such a system you almost certainly
+  want this.
+
+# Choice: ppctype
+Processor Type
+CONFIG_6xx
+  There are four types of PowerPC chips supported.  The more common
+  types (601, 603, 604, 740, 750, 7400), the Motorola embedded
+  versions (821, 823, 850, 855, 860, 8260), the IBM embedded versions
+  (403 and 405) and the high end 64 bit Power processors (Power 3,
+  Power 4).  Unless you are building a kernel for one of the embedded
+  processor systems, or a 64 bit IBM RS/6000, choose 6xx.  Note that
+  the kernel runs in 32-bit mode even on 64-bit chips.  Also note that
+  because the 82xx family has a 603e core, specific support for that
+  chipset is asked later on.
+
+Motorola MPC8260 CPM support
+CONFIG_8260
+  The MPC8260 CPM (Communications Processor Module) is a typical
+  embedded CPU made by Motorola.  Selecting this option means that
+  you wish to build a kernel for a machine with specifically an 8260
+  for a CPU.
+
+  If in doubt, say N.
+
+# Choice: ppc4xxtype
+Oak
+CONFIG_OAK
+  Select Oak if you have an IBM 403GCX "Oak" Evaluation Board.
+
+  Select Walnut if you have an IBM 405GP "Walnut" Evaluation Board.
+
+  More information on these boards is available at:
+  <http://www.chips.ibm.com/products/powerpc/tools/evk_pn.html#GCX>.
+
+Walnut
+CONFIG_WALNUT
+  Select Walnut if you have an IBM 405GP "Walnut" Evaluation Board.
+
+Workarounds for PPC601 bugs
+CONFIG_PPC601_SYNC_FIX
+  Some versions of the PPC601 (the first PowerPC chip) have bugs which
+  mean that extra synchronization instructions are required near
+  certain instructions, typically those that make major changes to the
+  CPU state.  These extra instructions reduce performance slightly.
+  If you say N here, these extra instructions will not be included,
+  resulting in a kernel which will run faster but may not run at all
+  on some systems with the PPC601 chip.
+
+  If in doubt, say Y here.
+
+8xx Cache (Copy-Back or Writethrough)
+CONFIG_8xx_COPYBACK
+  Saying Y here will cause the cache on an MPC8xx processor to be used
+  in Copy-Back mode.  If you say N here, it is used in Writethrough
+  mode.
+
+  If in doubt, say Y here.
+
+MPC860 (Pre Rev. C) CPU6 Silicon Errata
+CONFIG_8xx_CPU6
+  MPC860 CPUs, prior to Rev C have some bugs in the silicon, which
+  require workarounds for Linux (and most other OSes to work).  If you
+  get a BUG() very early in boot, this might fix the problem.  For
+  more details read the document entitled "MPC860 Family Device Errata
+  Reference" on Motorola's website.  This option also incurs a
+  performance hit.
+
+  If in doubt, say N here.
+
+MPC8xx direct IDE support on PCMCIA port
+CONFIG_BLK_DEV_MPC8xx_IDE
+  This option provides support for IDE on Motorola MPC8xx Systems.
+  Please see 'Type of MPC8xx IDE interface' for details.
+
+  If unsure, say N.
+
+# Choice: mpc8xxtype
+Type of MPC8xx IDE interface
+CONFIG_IDE_8xx_PCCARD
+  Select how the IDE devices are connected to the MPC8xx system:
+
+  8xx_PCCARD uses the 8xx internal PCMCIA interface in combination
+             with a PC Card (e.g. ARGOSY portable Hard Disk Adapter),
+             ATA PC Card HDDs or ATA PC Flash Cards (example: TQM8xxL
+             systems)
+
+  8xx_DIRECT is used for directly connected IDE devices using the 8xx
+             internal PCMCIA interface (example: IVMS8 systems)
+
+  EXT_DIRECT is used for IDE devices directly connected to the 8xx
+             bus using some glue logic, but _not_ the 8xx internal
+             PCMCIA interface (example: IDIF860 systems)
+
+Use SMC2 for UART
+CONFIG_SMC2_UART
+  If you would like to use SMC2 as a serial port, say Y here.
+
+  If in doubt, say Y here.
+
+Use SMC2 for Console
+CONFIG_CONS_SMC2
+  If you are going to have a serial console on your device and are
+  using SMC2 for your serial port, say Y here, else say N.
+
+Use the alternate SMC2 I/O
+CONFIG_ALTSMC2
+  If you have an MPC823 or MPC850 and would like to use the alternate
+  SMC2 for I/O, say Y here.
+
+  If in doubt, say N here.
+
+Enable SCC2 and SCC3 for UART
+CONFIG_USE_SCC_IO
+  If your MPC8xx board has other SCC ports that you would like to use
+  for for a serial port, say Y here.
+
+  If in doubt, say N here.
+
+# Choice: ppc6xxtype
+Machine Type
+CONFIG_ALL_PPC
+  Linux currently supports several different kinds of PowerPC-based
+  machines: Apple Power Macintoshes and clones (such as the Motorola
+  Starmax series), PReP (PowerPC Reference Platform) machines (such
+  as the Motorola PowerStacks, Motorola cPCI/VME embedded systems,
+  and some IBM RS/6000 systems), CHRP (Common Hardware Reference
+  Platform), and several embedded PowerPC systems containing 4xx, 6xx,
+  7xx, 8xx, 74xx, and 82xx processors.  Currently, the default option
+  is to build a kernel which works on the first three.
+
+  Select PowerMac/PReP/MTX/CHRP if configuring for any of the above.
+
+  Select Gemini if configuring for a Synergy Microsystems' Gemini
+  series Single Board Computer.  More information is available at:
+  <http://www.synergymicro.com/PressRel/97_10_15.html>.
+
+  Select APUS if configuring for a PowerUP Amiga.  More information is
+  available at: <http://linux-apus.sourceforge.net/>.
+
+  Note that Total Impact briQ is handled as a CHRP machine.
+
+Synergy-Gemini
+CONFIG_GEMINI
+  Select Gemini if configuring for a Synergy Microsystems' Gemini
+  series Single Board Computer.  More information is available at:
+  <http://www.synergymicro.com/PressRel/97_10_15.html>.
+
+Amiga-Apus
+CONFIG_APUS
+  Select APUS if configuring for a PowerUP Amiga.
+  More information is available at:
+  <http://linux-apus.sourceforge.net/>.
+
+AltiVec kernel support
+CONFIG_ALTIVEC
+  This option enables kernel support for the Altivec extensions to the
+  PowerPC processor. The kernel currently supports saving and restoring
+  altivec registers, and turning on the 'altivec enable' bit so user
+  processes can execute altivec instructions.
+
+  This option is only usefully if you have a processor that supports
+  altivec (G4, otherwise known as 74xx series), but does not have
+  any affect on a non-altivec cpu (it does, however add code to the
+  kernel).
+
+  If in doubt, say Y here.
+
+Thermal Management Support
+CONFIG_TAU
+  G3 and G4 processors have an on-chip temperature sensor called the
+  'Thermal Assist Unit (TAU)', which, in theory, can measure the on-die
+  temperature within 2-4 degrees Celsius. This option shows the current
+  on-die temperature in /proc/cpuinfo if the cpu supports it.
+
+  Unfortunately, on some chip revisions, this sensor is very inaccurate
+  and in some cases, does not work at all, so don't assume the cpu
+  temp is actually what /proc/cpuinfo says it is.
+
+Interrupt driven TAU driver
+CONFIG_TAU_INT
+  The TAU supports an interrupt driven mode which causes an interrupt
+  whenever the temperature goes out of range. This is the fastest way
+  to get notified the temp has exceeded a range. With this option off,
+  a timer is used to re-check the temperature periodically.
+
+  However, on some cpus it appears that the TAU interrupt hardware
+  is buggy and can cause a situation which would lead unexplained hard
+  lockups.
+
+  Unless you are extending the TAU driver, or enjoy kernel/hardware
+  debugging, leave this option off.
+
+Average high and low temp
+CONFIG_TAU_AVERAGE
+  The TAU hardware can compare the temperature to an upper and lower bound.
+  The default behaviour is to show both the upper and lower bound in
+  /proc/cpuinfo. If the range is large, the temperature is either changing
+  a lot, or the TAU hardware is broken (likely on some G4's). If the range
+  is small (around 4 degrees), the temperature is relatively stable.
+
+Power management support for PowerBooks
+CONFIG_PMAC_PBOOK
+  This provides support for putting a PowerBook to sleep; it also
+  enables media bay support.  Power management works on the
+  PB2400/3400/3500, Wallstreet, Lombard, and Bronze PowerBook G3. You
+  must get the power management daemon, pmud, to make it work and you
+  must have the /dev/pmu device (see the pmud README).
+
+  Get pmud from <ftp://ftp.samba.org/pub/ppclinux/pmud/>.
+
+  If you have a PowerBook, you should say Y.
+
+  You may also want to compile the dma sound driver as a module and
+  have it autoloaded. The act of removing the module shuts down the
+  sound hardware for more power savings.
+
+APM emulation
+CONFIG_PMAC_APM_EMU
+  This driver provides an emulated /dev/apm_bios and /proc/apm. The
+  first one is mostly intended for XFree to sleep & wakeup properly,
+  the second ones provides some battery informations to allow existing
+  APM utilities to work. It provides less useful informations than
+  tools specifically designed for PowerBooks or /proc/pmu/battery_x
+
+Backlight control for LCD screens
+CONFIG_PMAC_BACKLIGHT
+  Say Y here to build in code to manage the LCD backlight on a
+  Macintosh PowerBook.  With this code, the backlight will be turned
+  on and off appropriately on power-management and lid-open/lid-closed
+  events; also, the PowerBook button device will be enabled so you can
+  change the screen brightness.
+
+# Choice: ppc8xxtype
+Embedded 8xx Board Type
+CONFIG_RPXLITE
+  Single-board computers based around the PowerPC MPC8xx chips and
+  intended for embedded applications.  The following types are
+  supported:
+
+  RPX-Lite:
+    Embedded Planet RPX Lite. PC104 form-factor SBC based on the MPC823.
+
+  RPX-Classic:
+    Embedded Planet RPX Classic Low-fat. Credit-card-size SBC based on 
+    the MPC 860
+
+  BSE-IP: 
+    Bright Star Engineering ip-Engine.
+
+  TQM823L:
+  TQM850L:
+  TQM855L:
+  TQM860L:
+    MPC8xx based family of mini modules, half credit card size,
+    up to 64 MB of RAM, 8 MB Flash, (Fast) Ethernet, 2 x serial ports,
+    2 x CAN bus interface, ...
+      Manufacturer: TQ Components, www.tq-group.de
+      Date of Release: October (?) 1999
+      End of Life: not yet :-)
+      URL:
+      - module: <http://www.denx.de/PDF/TQM8xxLHWM201.pdf>
+      - starter kit: <http://www.denx.de/PDF/STK8xxLHWM201.pdf>
+      - images: <http://www.denx.de/embedded-ppc-en.html>
+
+  FPS850L:
+    FingerPrint Sensor System (based on TQM850L)
+      Manufacturer: IKENDI AG, <http://www.ikendi.com/>
+      Date of Release: November 1999
+      End of life: end 2000 ?
+      URL: see TQM850L
+
+  SPD823TS:
+    MPC823 based board used in the "Tele Server" product
+    Manufacturer: Speech Design, <http://www.speech-design.de/>
+    Date of Release: Mid 2000 (?)
+    End of life: -
+    URL: <http://www.speech-design.de/>
+         select "English", then "Teleteam Solutions", then "TeleServer"
+
+  IVMS8:
+    MPC860 based board used in the "Integrated Voice Mail System",
+    Small Version (8 voice channels)
+    Manufacturer: Speech Design, <http://www.speech-design.de/>
+    Date of Release: December 2000 (?)
+    End of life: -
+    URL: <http://www.speech-design.de/>
+
+  IVML24:
+    MPC860 based board used in the "Integrated Voice Mail System", 
+    Large Version (24 voice channels)
+    Manufacturer: Speech Design, <http://www.speech-design.de/>
+    Date of Release: March 2001  (?)
+    End of life: -
+    URL: <http://www.speech-design.de/>
+
+  SM850:
+    Service Module (based on TQM850L)
+    Manufacturer: Dependable Computer Systems, <http://www.decomsys.com/>
+    Date of Release: end 2000 (?)
+    End of life: mid 2001 (?)
+    URL: <http://www.tz-mikroelektronik.de/ServiceModule/index.html>
+
+  HERMES_PRO:
+    Hermes-Pro ISDN/LAN router with integrated 8 x hub
+    Manufacturer: Multidata Gesellschaft für Datentechnik und Informatik
+      <http://www.multidata.de/>
+    Date of Release: 2000 (?)
+    End of life: -
+    URL: <http://www.multidata.de/english/products/hpro.htm>
+
+  IP860:       
+    VMEBus IP (Industry Pack) carrier board with MPC860
+    Manufacturer: MicroSys GmbH, <http://www.microsys.de/>
+    Date of Release: ?
+    End of life: -
+    URL: <http://www.microsys.de/html/ip860.html>
+
+  PCU_E:
+    PCU = Peripheral Controller Unit, Extended
+    Manufacturer: Siemens AG, ICN (Information and Communication Networks)
+       <http://www.siemens.de/page/1,3771,224315-1-999_2_226207-0,00.html>
+    Date of Release: April 2001
+    End of life: August 2001
+    URL: n. a.
+
+RPX-Classic
+CONFIG_RPXCLASSIC
+  The RPX-Classic is a single-board computer based on the Motorola
+  MPC860.  It features 16MB of DRAM and a variable amount of flash,
+  I2C EEPROM, thermal monitoring, a PCMCIA slot, a DIP switch and two
+  LEDs.  Variants with Ethernet ports exist.  Say Y here to support it
+  directly.
+
+BSE-IP
+CONFIG_BSEIP
+  Say Y here to support the Bright Star Engineering ipEngine SBC.
+  This is a credit-card-sized device featuring a MPC823 processor,
+  26MB DRAM, 4MB flash, Ethernet, a 16K-gate FPGA, USB, an LCD/video
+  controller, and two RS232 ports.
+
+TQM823L
+CONFIG_TQM823L
+  Say Y here to support the TQM823L, one of an MPC8xx-based family of
+  mini SBCs (half credit-card size) from TQ Components first released
+  in late 1999.  Technical references are at
+  <http://www.denx.de/PDF/TQM8xxLHWM201.pdf>, and
+  <http://www.denx.de/PDF/STK8xxLHWM201.pdf>, and an image at
+  <http://www.denx.de/embedded-ppc-en.html>.
+
+TQM850L
+CONFIG_TQM850L
+  Say Y here to support the TQM850L, one of an MPC8xx-based family of
+  mini SBCs (half credit-card size) from TQ Components first released
+  in late 1999.  Technical references are at
+  <http://www.denx.de/PDF/TQM8xxLHWM201.pdf>, and
+  <http://www.denx.de/PDF/STK8xxLHWM201.pdf>, and an image at
+  <http://www.denx.de/embedded-ppc-en.html>.
+
+TQM855L
+CONFIG_TQM855L
+  Say Y here to support the TQM855L, one of an MPC8xx-based family of
+  mini SBCs (half credit-card size) from TQ Components first released
+  in late 1999.  Technical references are at
+  <http://www.denx.de/PDF/TQM8xxLHWM201.pdf>, and
+  <http://www.denx.de/PDF/STK8xxLHWM201.pdf>, and an image at
+  <http://www.denx.de/embedded-ppc-en.html>.
+
+TQM860L
+CONFIG_TQM860L
+  Say Y here to support the TQM860L, one of an MPC8xx-based family of
+  mini SBCs (half credit-card size) from TQ Components first released
+  in late 1999.  Technical references are at
+  <http://www.denx.de/PDF/TQM8xxLHWM201.pdf>, and
+  <http://www.denx.de/PDF/STK8xxLHWM201.pdf>, and an image at
+  <http://www.denx.de/embedded-ppc-en.html>.
+
+FPS850
+CONFIG_FPS850
+  Say Y here to support the FingerPrint Sensor from AKENDI IG, based
+  on the TQ Components TQM850L module, released November 1999 and
+  discontinued a year later.
+
+TQM860
+CONFIG_TQM860
+  Say Y here to support the TQM860, one of an MPC8xx-based family of
+  SBCs (credit-card size) from TQ Components first released in 
+  mid-1999 and discontinued mid-2000.
+
+SM850
+CONFIG_SM850
+  Say Y here to support the Service Module 850 from Dependable
+  Computer Systems, an SBC based on the TQM850L module by TQ
+  Components.  This board is no longer in production.  The
+  manufacturer's website is at <http://www.decomsys.com/>.
+
+SPD823TS
+CONFIG_SPD823TS
+  Say Y here to support the Speech Design 823 Tele-Server from Speech
+  Design, released in 2000.  The manufacturer's website is at
+  <http://www.speech-design.de/>.
+
+IVMS8
+CONFIG_IVMS8
+  Say Y here to support the Integrated Voice-Mail Small 8-channel SBC
+  from Speech Design, released March 2001.  The manufacturer's website
+  is at <http://www.speech-design.de/>.
+
+# IVML24 is not yet active
+IVML24
+CONFIG_IVML24
+  Say Y here to support the Integrated Voice-Mail Large 24-channel SBC
+  from Speech Design, released March 2001.  The manufacturer's website
+  is at <http://www.speech-design.de/>.
+
+MBX
+CONFIG_MBX
+  MBX is a line of Motorola single-board computer based around the
+  MPC821 and MPC860 processors, and intended for embedded-controller
+  applications.  Say Y here to support these boards directly.
+
+WinCept
+CONFIG_WINCEPT
+  The Wincept 100/110 is a Motorola single-board computer based on the
+  MPC821 PowerPC, introduced in 1998 and designed to be used in
+  thin-client machines.  Say Y to support it directly.
+
+# More systems that will be supported soon, according to
+# Wolfgang Denk <wd@denx.de>:
+#
+# TQM8260:
+#         MPC8260 based module
+#
+#         Manufacturer: TQ Components, www.tq-group.de
+#         Date of Release: June 2001
+#         End of Life: not yet :-)
+#         URL: <http://www.denx.de/PDF/TQM82xx_SPEC_Rev003.pdf>
+#
+# IP860:
+#         VMEBus IP (Industry Pack) carrier board with MPC860
+#
+#         Manufacturer: MicroSys GmbH, <http://www.microsys.de/>
+#         Date of Release: ?
+#         End of life: -
+#         URL: <http://www.microsys.de/html/ip860.html>
+#
+# CU824:
+#         VMEBus Board with PCI extension with MPC8240 CPU
+#
+#         Manufacturer: MicroSys GmbH, <http://www.microsys.de/>
+#         Date of Release: early 2001 (?)
+#         End of life: -
+#         URL: <http://www.microsys.de/html/cu824.html>
+#
+# PM826:
+#         Modular system with MPC8260 CPU
+#
+#         Manufacturer: MicroSys GmbH, <http://www.microsys.de/>
+#         Date of Release: mid 2001
+#         End of life: -
+#         URL: <http://www.microsys.de/html/pm826.html>
+#
+# PCU_E:
+#         PCU = Peripheral Controller Unit; E = extended (?)
+#
+#         Mfr: Siemens AG, ICN (Information and Communication Networks)
+#         <http://www.siemens.de/page/1,3771,224315-1-999_2_226207-0,00.html>
+#         Date of Release: April 2001
+#         End of life: -
+#         URL: n. a.o
+
+# Choice: ppc82xxtype
+Embedded 82xx Board Type
+CONFIG_EST8260
+  EST8260:
+    The EST8260 is a single-board computer manufactured by Wind River
+    Systems, Inc. (formerly Embedded Support Tools Corp.) and based on
+    the MPC8260.  Wind River Systems has a website at
+    <http://www.windriver.com/>, but the EST8260 cannot be found on it
+    and has probably been discontinued or rebadged.
+
+  TQM8260:
+    MPC8260 based module, little larger than credit card,
+    up to 128 MB global + 64 MB local RAM, 32 MB Flash,
+    32 kB EEPROM, 256 kB L@ Cache, 10baseT + 100baseT Ethernet,
+    2 x serial ports, ...
+      Manufacturer: TQ Components, www.tq-group.de
+      Date of Release: June 2001
+      End of Life: not yet :-)
+      URL: <http://www.denx.de/PDF/TQM82xx_SPEC_Rev005.pdf>
+
+  PM826:
+    Modular system with MPC8260 CPU
+    Manufacturer: MicroSys GmbH, <http://www.microsys.de/>
+    Date of Release: mid 2001
+    End of life: -
+    URL: <http://www.microsys.de/html/pm826.html>
+
+  CU824:
+    VMEBus Board with PCI extension with MPC8240 CPU
+    Manufacturer: MicroSys GmbH, <http://www.microsys.de/>
+    Date of Release: early 2001 (?)
+    End of life: -
+    URL: <http://www.microsys.de/html/cu824.html>
+
+ADB raw keycode support
+CONFIG_MAC_ADBKEYCODES
+  This provides support for sending raw ADB keycodes to console
+  devices.  This is the default up to 2.4.0, but in future this may be
+  phased out in favor of generic Linux keycodes.  If you say Y here,
+  you can dynamically switch via the
+      /proc/sys/dev/mac_hid/keyboard_sends_linux_keycodes
+  sysctl and with the "keyboard_sends_linux_keycodes=" kernel
+  argument.
+
+  This option is now deprecated and will be removed in a future
+  kernel release.
+  
+  If unsure, say N here.
+
+I2C/SPI Microcode Patch
+CONFIG_UCODE_PATCH
+  Motorola releases microcode updates for their 8xx CPM modules.  The
+  microcode update file has updates for IIC, SMC and USB.  Currently only
+  the USB update is available by default, if the MPC8xx USB option is
+  enabled.  If in doubt, say 'N' here.
+
+Mouse button 2+3 emulation support
+CONFIG_MAC_EMUMOUSEBTN
+  This provides generic support for emulating the 2nd and 3rd mouse
+  button with keypresses.  If you say Y here, the emulation is still
+  disabled by default.  The emulation is controlled by these sysctl
+  entries:
+      /proc/sys/dev/mac_hid/mouse_button_emulation
+      /proc/sys/dev/mac_hid/mouse_button2_keycode
+      /proc/sys/dev/mac_hid/mouse_button3_keycode
+
+Enhanced Real Time Clock Support (/dev/rtc)
+CONFIG_PPC_RTC
+  If you say Y here and create a character special file /dev/rtc with
+  major number 10 and minor number 135 using mknod ("man mknod"), you
+  will get access to the real time clock (or hardware clock) built
+  into your computer.
+
+  If unsure, say Y here.
+
+Support for Open Firmware device tree in /proc
+CONFIG_PROC_DEVICETREE
+  This option adds a device-tree directory under /proc which contains
+  an image of the device tree that the kernel copies from Open
+  Firmware. If unsure, say Y here.
+
+RTAS (RunTime Abstraction Services) in /proc
+CONFIG_PPC_RTAS
+  When you use this option, you will be able to use RTAS from
+  userspace.
+
+  RTAS stands for RunTime Abstraction Services and should
+  provide a portable way to access and set system information. This is
+  commonly used on RS/6000 (pSeries) computers.
+
+  You can access RTAS via the special proc file system entry rtas.
+  Don't confuse this rtas entry with the one in /proc/device-tree/rtas
+  which is readonly.
+
+  If you don't know if you can use RTAS look into
+  /proc/device-tree/rtas. If there are some entries, it is very likely
+  that you will be able to use RTAS.
+
+  You can do cool things with rtas. To print out information about
+  various sensors in the system, just do a
+
+    $ cat /proc/rtas/sensors
+
+  or if you power off your machine at night but want it running when
+  you enter your office at 7:45 am, do a
+
+    # date -d 'tomorrow 7:30' +%s > /proc/rtas/poweron
+
+  and shutdown.
+
+  If unsure, say Y.
+
+MESH (Power Mac internal SCSI) support
+CONFIG_SCSI_MESH
+  Many Power Macintoshes and clones have a MESH (Macintosh Enhanced
+  SCSI Hardware) SCSI bus adaptor (the 7200 doesn't, but all of the
+  other Power Macintoshes do). Say Y to include support for this SCSI
+  adaptor. This driver is also available as a module called mesh.o
+  ( = code which can be inserted in and removed from the running
+  kernel whenever you want). If you want to compile it as a module,
+  say M here and read <file:Documentation/modules.txt>.
+
+Maximum synchronous transfer rate (MB/s) (0 = async)
+CONFIG_SCSI_MESH_SYNC_RATE
+  On Power Macintoshes (and clones) where the MESH SCSI bus adaptor
+  drives a bus which is entirely internal to the machine (such as the
+  7500, 7600, 8500, etc.), the MESH is capable of synchronous
+  operation at up to 10 MB/s. On machines where the SCSI bus
+  controlled by the MESH can have external devices connected, it is
+  usually rated at 5 MB/s. 5 is a safe value here unless you know the
+  MESH SCSI bus is internal only; in that case you can say 10. Say 0
+  to disable synchronous operation.
+
+53C94 (Power Mac external SCSI) support
+CONFIG_SCSI_MAC53C94
+  On Power Macintoshes (and clones) with two SCSI buses, the external
+  SCSI bus is usually controlled by a 53C94 SCSI bus adaptor. Older
+  machines which only have one SCSI bus, such as the 7200, also use
+  the 53C94. Say Y to include support for the 53C94.
+
+  This driver is also available as a module called mac53c94.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+MACE (Power Mac Ethernet) support
+CONFIG_MACE
+  Power Macintoshes and clones with Ethernet built-in on the
+  motherboard will usually use a MACE (Medium Access Control for
+  Ethernet) interface. Say Y to include support for the MACE chip.
+
+  This driver is also available as a module called mace.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Use AAUI port instead of TP by default
+CONFIG_MACE_AAUI_PORT
+  Some Apple machines (notably the Apple Network Server) which use the
+  MACE ethernet chip have an Apple AUI port (small 15-pin connector),
+  instead of an 8-pin RJ45 connector for twisted-pair ethernet.  Say
+  Y here if you have such a machine.  If unsure, say N.
+  The driver will default to AAUI on ANS anyway, and if you use it as
+  a module, you can provide the port_aaui=0|1 to force the driver.
+
+BMAC (G3 Ethernet) support
+CONFIG_BMAC
+  Say Y for support of BMAC Ethernet interfaces. These are used on G3
+  computers.
+
+  This driver is also available as a module called bmac.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+GMAC (G4/iBook Ethernet) support
+CONFIG_GMAC
+  Say Y for support of GMAC Ethernet interfaces. These are used on G4
+  and iBook computers.
+
+  This driver is also available as a module called gmac.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+National DP83902AV (Oak Ethernet) support
+CONFIG_OAKNET
+  Say Y if your machine has this type of Ethernet network card.
+
+  This driver is also available as a module called oaknet.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Video For Linux
+CONFIG_VIDEO_DEV
+  Support for audio/video capture and overlay devices and FM radio
+  cards. The exact capabilities of each device vary. User tools for
+  this are available from
+  <ftp://ftp.uk.linux.org/pub/linux/video4linux/>.
+
+  If you are interested in writing a driver for such an audio/video
+  device or user software interacting with such a driver, please read
+  the file <file:Documentation/video4linux/API.html>.
+
+  This driver is also available as a module called videodev.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Video For Linux /proc file system information
+CONFIG_VIDEO_PROC_FS
+  If you say Y here, you are able to access video device information
+  in /proc/video.
+
+  To use this option, you have to check, that the "/proc file system
+  support" (CONFIG_PROC_FS) is enabled too.
+
+AIMSlab RadioTrack (aka RadioReveal) support
+CONFIG_RADIO_RTRACK
+  Choose Y here if you have one of these FM radio cards, and then fill
+  in the port address below.
+
+  Note that newer AIMSlab RadioTrack cards have a different chipset
+  and are not supported by this driver.  For these cards, use the
+  RadioTrack II driver below.
+
+  If you have a GemTeks combined (PnP) sound- and radio card you must
+  use this driver as a module and setup the card with isapnptools.
+  You must also pass the module a suitable io parameter, 0x248 has
+  been reported to be used by these cards.
+
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video For Linux API.  Information on
+  this API and pointers to "v4l" programs may be found on the WWW at
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.  More
+  information is contained in the file
+  <file:Documentation/video4linux/radiotrack.txt>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-aimslab.o.
+
+RadioTrack I/O port
+CONFIG_RADIO_RTRACK_PORT
+  Enter either 0x30f or 0x20f here.  The card default is 0x30f, if you
+  haven't changed the jumper setting on the card.
+
+AIMSlab RadioTrack II support
+CONFIG_RADIO_RTRACK2
+  Choose Y here if you have this FM radio card, and then fill in the
+  port address below.
+
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video For Linux API.  Information on
+  this API and pointers to "v4l" programs may be found on the WWW at
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-rtrack2.o.
+
+RadioTrack II I/O port
+CONFIG_RADIO_RTRACK2_PORT
+  Enter either 0x30c or 0x20c here.  The card default is 0x30c, if you
+  haven't changed the jumper setting on the card.
+
+Aztech/Packard Bell Radio
+CONFIG_RADIO_AZTECH
+  Choose Y here if you have one of these FM radio cards, and then fill
+  in the port address below.
+
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video For Linux API.  Information on
+  this API and pointers to "v4l" programs may be found on the WWW at
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-aztech.o.
+
+Aztech/Packard Bell radio card I/O port
+CONFIG_RADIO_AZTECH_PORT
+  Enter either 0x350 or 0x358 here.  The card default is 0x350, if you
+  haven't changed the setting of jumper JP3 on the card.  Removing the
+  jumper sets the card to 0x358.
+
+ADS Cadet AM/FM Radio Tuner Card
+CONFIG_RADIO_CADET
+  Choose Y here if you have one of these AM/FM radio cards, and then
+  fill in the port address below.
+
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video For Linux API.  Information on
+  this API and pointers to "v4l" programs may be found on the WWW at
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  Further documentation on this driver can be found on the WWW at
+  <http://linux.blackhawke.net/cadet.html>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-cadet.o.
+
+SF16FMI Radio
+CONFIG_RADIO_SF16FMI
+  Choose Y here if you have one of these FM radio cards.  If you
+  compile the driver into the kernel and your card is not PnP one, you
+  have to add "sf16fm=<io>" to the kernel command line (I/O address is
+  0x284 or 0x384).
+
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video For Linux API.  Information on
+  this API and pointers to "v4l" programs may be found on the WWW at
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-sf16fmi.o.
+
+SF16FMR2 Radio
+CONFIG_RADIO_SF16FMR2
+  Choose Y here if you have one of these FM radio cards.  If you
+  compile the driver into the kernel and your card is not PnP one, you
+  have to add "sf16fmr2=<io>" to the kernel command line (I/O address is
+  0x284 or 0x384, default 0x384).
+
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video For Linux API.  Information on
+  this API and pointers to "v4l" programs may be found on the WWW at
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-sf16fmr2.o.
+
+Typhoon Radio (a.k.a. EcoRadio)
+CONFIG_RADIO_TYPHOON
+  Choose Y here if you have one of these FM radio cards, and then fill
+  in the port address and the frequency used for muting below.
+
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video For Linux API.  Information on
+  this API and pointers to "v4l" programs may be found on the WWW at
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-typhoon.o.
+
+Support for /proc/radio-typhoon
+CONFIG_RADIO_TYPHOON_PROC_FS
+  Say Y here if you want the typhoon radio card driver to write
+  status information (frequency, volume, muted, mute frequency,
+  base address) to /proc/radio-typhoon. The file can be viewed with
+  your favorite pager (i.e. use "more /proc/radio-typhoon" or "less
+  /proc/radio-typhoon" or simply "cat /proc/radio-typhoon").
+
+Typhoon I/O port (0x316 or 0x336)
+CONFIG_RADIO_TYPHOON_PORT
+  Enter the I/O port of your Typhoon or EcoRadio radio card.
+
+Typhoon frequency set when muting the device (kHz)
+CONFIG_RADIO_TYPHOON_MUTEFREQ
+  Enter the frequency used for muting the radio. The device is never
+  completely silent. If the volume is just turned down, you can still
+  hear silent voices and music. For that reason, the frequency of the
+  radio device is set to the frequency you can enter here whenever
+  the device is muted. There should be no local radio station at that
+  frequency.
+
+Zoltrix Radio
+CONFIG_RADIO_ZOLTRIX
+  Choose Y here if you have one of these FM radio cards, and then fill
+  in the port address below.
+
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video For Linux API.  Information on
+  this API and pointers to "v4l" programs may be found on the WWW at
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-zoltrix.o.
+
+ZOLTRIX I/O port (0x20c or 0x30c)
+CONFIG_RADIO_ZOLTRIX_PORT
+  Enter the I/O port of your Zoltrix radio card.
+
+I2C on parallel port
+CONFIG_I2C_PARPORT
+  I2C is a simple serial bus system used in many micro controller
+  applications.  Saying Y here will allow you to use your parallel
+  port as an I2C interface.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called i2c-parport.o.
+
+miroSOUND PCM20 radio
+CONFIG_RADIO_MIROPCM20
+  Choose Y here if you have this FM radio card. You also need to say Y
+  to "ACI mixer (miroSOUND PCM1-pro/PCM12/PCM20 radio)" (in "Sound")
+  for this to work.
+
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video For Linux API.  Information on
+  this API and pointers to "v4l" programs may be found on the WWW at
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called miropcm20.o.
+
+miroSOUND PCM20 radio RDS user interface (EXPERIMENTAL)
+CONFIG_RADIO_MIROPCM20_RDS
+  Choose Y here if you want to see RDS/RBDS information like
+  RadioText, Programme Service name, Clock Time and date, Programme
+  TYpe and Traffic Announcement/Programme identification.  You also
+  need to say Y to "miroSOUND PCM20 radio" and devfs!
+
+  It's not possible to read the raw RDS packets from the device, so
+  the driver cant provide an V4L interface for this.  But the
+  availability of RDS is reported over V4L by the basic driver
+  already.  Here RDS can be read from files in /dev/v4l/rds.
+
+  As module the driver will be called miropcm20-rds.o.
+
+Maestro on board radio
+CONFIG_RADIO_MAESTRO
+  Say Y here to directly support the on-board radio tuner on the
+  Maestro 2 or 2E sound card.
+
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video For Linux API.  Information on
+  this API and pointers to "v4l" programs may be found on the WWW at
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-maestro.o.
+
+Guillemot MAXI Radio FM 2000 Radio Card
+CONFIG_RADIO_MAXIRADIO
+  Choose Y here if you have this radio card.  This card may also be
+  found as GemTek PCI FM.
+
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video For Linux API.  Information on
+  this API and pointers to "v4l" programs may be found on the WWW at
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-maxiradio.o.
+
+GemTek Radio Card support
+CONFIG_RADIO_GEMTEK
+  Choose Y here if you have this FM radio card, and then fill in the
+  port address below.
+
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video For Linux API.  Information on
+  this API and pointers to "v4l" programs may be found on the WWW at
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-gemtek.o.
+
+GemTek I/O port
+CONFIG_RADIO_GEMTEK_PORT
+  Enter either 0x20c, 0x30c, 0x24c or 0x34c here. The card default is
+  0x34c, if you haven't changed the jumper setting on the card. On
+  Sound Vision 16 Gold PnP with FM Radio (ESS1869+FM GemTek), the I/O
+  port is 0x28c.
+
+GemTek PCI Radio Card support
+CONFIG_RADIO_GEMTEK_PCI
+  Choose Y here if you have this PCI FM radio card.
+
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video for Linux API.  Information on 
+  this API and pointers to "v4l" programs may be found on the WWW at
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-gemtek-pci.o.
+
+PlanB Video-In for PowerMacs
+CONFIG_VIDEO_PLANB
+  PlanB is the V4L driver for the PowerMac 7x00/8x00 series video
+  input hardware. If you want to experiment with this, say Y.
+  Otherwise, or if you don't understand a word, say N.
+  See <http://www.cpu.lu/~mlan/planb.html> for more info.
+
+  Saying M will compile this driver as a module (planb.o).
+
+TerraTec ActiveRadio
+CONFIG_RADIO_TERRATEC
+  Choose Y here if you have this FM radio card, and then fill in the
+  port address below. (TODO)
+
+  Note: This driver is in its early stages.  Right now volume and
+  frequency control and muting works at least for me, but
+  unfortunately I have not found anybody who wants to use this card
+  with Linux.  So if it is this what YOU are trying to do right now,
+  PLEASE DROP ME A NOTE!!  Rolf Offermanns (rolf@offermanns.de)
+
+  In order to control your radio card, you will need to use programs
+  that are compatible with the Video For Linux API.  Information on
+  this API and pointers to "v4l" programs may be found on the WWW at
+  <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
+
+  If you want to compile this driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called radio-terratec.o.
+
+Terratec I/O port (normally 0x590)
+CONFIG_RADIO_TERRATEC_PORT
+  Fill in the I/O port of your TerraTec FM radio card. If unsure, go
+  with the default.
+
+Trust FM radio card
+CONFIG_RADIO_TRUST
+  This is a driver for the Trust FM radio cards. Say Y if you have
+  such a card and want to use it under Linux.
+
+  This driver is also available as a module called radio-trust.o ( =
+  code which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+Trust I/O port (usually 0x350 or 0x358)
+CONFIG_RADIO_TRUST_PORT
+  Enter the I/O port of your Trust FM radio card. If unsure, try the
+  values "0x350" or "0x358".
+
+BT848 Video For Linux
+CONFIG_VIDEO_BT848
+  Support for BT848 based frame grabber/overlay boards. This includes
+  the Miro, Hauppauge and STB boards. Please read the material in
+  <file:Documentation/video4linux/bttv> for more information.
+
+  If you say Y or M here, you need to say Y or M to "I2C support" and
+  "I2C bit-banging interfaces" in the character device section.
+
+  This driver is available as a module called bttv.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+BT878 audio DMA
+CONFIG_SOUND_BT878
+  Audio DMA support for bt878 based grabber boards.  As you might have
+  already noticed, bt878 is listed with two functions in /proc/pci.
+  Function 0 does the video stuff (bt848 compatible), function 1 does
+  the same for audio data.  This is a driver for the audio part of
+  the chip.  If you say 'Y' here you get a oss-compatible dsp device
+  where you can record from.  If you want just watch TV you probably
+  don't need this driver as most TV cards handle sound with a short
+  cable from the TV card to your sound card's line-in.
+
+  This driver is available as a module called btaudio.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+SGI Vino Video For Linux
+CONFIG_VIDEO_VINO
+  Say Y here to build in support for the Vino video input system found
+  on SGI Indy machines.
+
+Stradis 4:2:2 MPEG-2 video driver
+CONFIG_VIDEO_STRADIS
+  Say Y here to enable support for the Stradis 4:2:2 MPEG-2 video
+  driver for PCI.  There is a product page at
+  <http://www.stradis.com/decoder.html>.
+
+Zoran ZR36057/36060 Video For Linux
+CONFIG_VIDEO_ZORAN
+  Say Y here to include support for video cards based on the Zoran
+  ZR36057/36060 encoder/decoder chip (including the Iomega Buz and the
+  Miro DC10 and DC30 video capture cards).
+
+Include support for Iomega Buz
+CONFIG_VIDEO_ZORAN_BUZ
+  Say Y here to include support for the Iomega Buz video card.  There
+  is a Buz/Linux homepage at <http://www.lysator.liu.se/~gz/buz/>.
+
+Miro DC10(+) support
+CONFIG_VIDEO_ZORAN_DC10
+  Say Y to support the Pinnacle Systems Studio DC10 plus TV/Video
+  card.  Linux page at
+  <http://lhd.datapower.com/db/dispproduct.php3?DISP?1511>.  Vendor
+  page at <http://www.pinnaclesys.com/>.
+
+Linux Media Labs LML33 support
+CONFIG_VIDEO_ZORAN_LML33
+  Say Y here to support the Linux Media Labs LML33 TV/Video card.
+  Resources page is at <http://www.linuxmedialabs.com/lml33doc.html>.
+
+Zoran ZR36120/36125 Video For Linux
+CONFIG_VIDEO_ZR36120
+  Support for ZR36120/ZR36125 based frame grabber/overlay boards.
+  This includes the Victor II, WaveWatcher, Video Wonder, Maxi-TV,
+  and Buster boards. Please read the material in
+  <file:Documentation/video4linux/zr36120.txt> for more information.
+
+  This driver is also available as a module called zr36120.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+SAA5249 Teletext processor
+CONFIG_VIDEO_SAA5249
+  Support for I2C bus based teletext using the SAA5249 chip. At the
+  moment this is only useful on some European WinTV cards.
+
+  This driver is also available as a module called saa5249.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+QuickCam BW Video For Linux
+CONFIG_VIDEO_BWQCAM
+  Say Y have if you the black and white version of the QuickCam
+  camera. See the next option for the color version.
+
+  This driver is also available as a module called bw-qcam.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+QuickCam Colour Video For Linux
+CONFIG_VIDEO_CQCAM
+  This is the video4linux driver for the colour version of the
+  Connectix QuickCam.  If you have one of these cameras, say Y here,
+  otherwise say N.  This driver does not work with the original
+  monochrome QuickCam, QuickCam VC or QuickClip.  It is also available
+  as a module (c-qcam.o).
+  Read <file:Documentation/video4linux/CQcam.txt> for more information.
+
+W9966 Webcam (FlyCam Supra and others) Video For Linux
+CONFIG_VIDEO_W9966
+  Video4linux driver for Winbond's w9966 based Webcams.
+  Currently tested with the LifeView FlyCam Supra.
+  If you have one of these cameras, say Y here
+  otherwise say N.
+  This driver is also available as a module (w9966.o).
+
+  Check out <file:drivers/media/video4linux/w9966.txt> and
+  <file:drivers/media/video/w9966.c> for more information.
+
+Philips SAA7114H for SiByte BCM91250A
+CONFIG_VIDEO_SWARM_7114H
+  Say Y or M to build the video4linux driver for the Philips SAA7114H
+  video decoder on Broadcom SWARM board (BCM91250A).  The decoder chip
+  is on the BCM1250's "E2" 8-bit FIFO port.
+
+CPiA Video For Linux
+CONFIG_VIDEO_CPIA
+  This is the video4linux driver for cameras based on Vision's CPiA
+  (Colour Processor Interface ASIC), such as the Creative Labs Video
+  Blaster Webcam II. If you have one of these cameras, say Y here
+  and select parallel port and/or USB lowlevel support below,
+  otherwise say N. This will not work with the Creative Webcam III.
+
+  Please read <file:Documentation/video4linux/README.cpia> for more
+  information.
+
+  This driver is also available as a module (cpia.o).
+
+CPiA Parallel Port Lowlevel Support
+CONFIG_VIDEO_CPIA_PP
+  This is the lowlevel parallel port support for cameras based on
+  Vision's CPiA (Colour Processor Interface ASIC), such as the
+  Creative Webcam II. If you have the parallel port version of one
+  of these cameras, say Y here, otherwise say N. It is also available
+  as a module (cpia_pp.o).
+
+CPiA USB Lowlevel Support
+CONFIG_VIDEO_CPIA_USB
+  This is the lowlevel USB support for cameras based on Vision's CPiA
+  (Colour Processor Interface ASIC), such as the Creative Webcam II.
+  If you have the USB version of one of these cameras, say Y here,
+  otherwise say N. This will not work with the Creative Webcam III.
+  It is also available as a module (cpia_usb.o).
+
+Mediavision Pro Movie Studio Video For Linux
+CONFIG_VIDEO_PMS
+  Say Y if you have such a thing.  This driver is also available as a
+  module called pms.o ( = code which can be inserted in and removed
+  from the running kernel whenever you want).  If you want to compile
+  it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+Sony Vaio Picturebook Motion Eye Video For Linux
+CONFIG_VIDEO_MEYE
+  This is the video4linux driver for the Motion Eye camera found
+  in the Vaio Picturebook laptops. Please read the material in
+  <file:Documentation/video4linux/meye.txt> for more information.
+
+  If you say Y or M here, you need to say Y or M to "Sony Programmable
+  I/O Control Device" in the character device section.
+
+  This driver is available as a module called meye.o ( = code
+  which can be inserted in and removed from the running kernel
+  whenever you want). If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.
+
+IBM's S/390 architecture
+CONFIG_ARCH_S390
+  Select this option, if you want to run the Kernel on one of IBM's
+  mainframes of the S/390 generation. You should have installed the
+  s390-compiler released by IBM (based on gcc-2.95.1) before.
+
+Merge some code into the kernel to make the image IPLable
+CONFIG_IPL
+  If you want to use the produced kernel to IPL directly from a
+  device, you have to merge a bootsector specific to the device
+  into the first bytes of the kernel. You will have to select the
+  IPL device on another question, that pops up, when you select
+  CONFIG_IPL.
+
+IPL from a S/390 tape unit
+CONFIG_IPL_TAPE
+  Select this option if you want to IPL the image from a Tape.
+
+IPL from a virtual card reader emulated by VM/ESA
+CONFIG_IPL_VM
+  Select this option if you are running under VM/ESA and want 
+  to IPL the image from the emulated card reader.
+
+CONFIG_PFAULT
+  Select this option, if you want to use PFAULT pseudo page fault
+  handling under VM. If running native or in LPAR, this option
+  has no effect. If your VM does not support PFAULT, PAGEEX
+  pseudo page fault handling will be used.
+  Note that VM 4.2 supports PFAULT but has a bug in its
+  implementation that causes some problems.
+  Everybody who wants to run Linux under VM != VM4.2 should select
+  this option.
+
+CONFIG_SHARED_KERNEL
+  Select this option, if you want to share the text segment of the
+  Linux kernel between different VM guests. This reduces memory
+  usage with lots of guests but greatly increases kernel size.
+  You should only select this option if you know what you are
+  doing and want to exploit this feature.
+
+Support for IBM-style disk-labels (S/390)
+CONFIG_S390_PARTITION
+  Enable this option to assure standard IBM labels on the DASDs.
+  You must enable it, if you are planning to access DASDs also
+  attached to another IBM mainframe operation system (OS/390, 
+  VM/ESA, VSE/ESA).
+
+Support for DASD hard disks
+CONFIG_DASD
+  Enable this option if you want to access DASDs directly utilizing
+  S/390s channel subsystem commands. This is necessary for running
+  natively on a single image or an LPAR.
+
+Support for ECKD hard disks
+CONFIG_DASD_ECKD
+  ECKD (Extended Count Key Data) devices are the most commonly used 
+  devices on S/390s. You should enable this option unless you are 
+  very sure you have no ECKD device.
+
+ECKD demand loading
+CONFIG_DASD_AUTO_ECKD
+  This option enables demand loading of the ECKD module. 
+
+Support for FBA hard disks
+CONFIG_DASD_FBA
+  Select this option if you want to use FBA (Fixed Block) devices.
+  If you are not sure what it is, say "Y".
+
+FBA demand loading
+CONFIG_DASD_AUTO_FBA
+  This option enables demand loading of the FBA module. 
+
+Support for DIAG access to CMS reserved Disks
+CONFIG_DASD_DIAG
+  Select this option if you want to use CMS reserved Disks under VM
+  with the Diagnose250 command.  If you are not running under VM or
+  unsure what it is, say "N".
+
+DIAG demand loading
+CONFIG_DASD_AUTO_DIAG
+  This option enables demand loading of the DIAG module. 
+
+Merge some code into the kernel to make the image IPLable
+CONFIG_IPLABLE
+  If you want to use the produced kernel to IPL directly from a
+  device, you have to merge a bootsector specific to the device
+  into the first bytes of the kernel. You will have to select the
+  IPL device on another question, that pops up, when you select
+  CONFIG_IPLABE.
+
+Support for 3215 line mode terminal
+CONFIG_TN3215
+  Include support for IBM 3215 line-mode terminals.
+
+Support for console on 3215 line mode terminal
+CONFIG_TN3215_CONSOLE
+  Include support for using an IBM 3215 line-mode terminal as a
+  Linux system console.
+
+Support for 3270 line mode terminal
+CONFIG_TN3270
+  Include support for IBM 3270 line-mode terminals.
+
+Support for console on 3270 line mode terminal
+CONFIG_TN3270_CONSOLE
+  Include support for using an IBM 3270 line-mode terminal as a Linux
+  system console.  Available only if 3270 support is compiled in
+  statically.
+
+Support for HWC line mode terminal
+CONFIG_HWC
+  Include support for IBM HWC line-mode terminals.
+
+Console on HWC line mode terminal
+CONFIG_HWC_CONSOLE
+  Include support for using an IBM HWC line-mode terminal as the Linux
+  system console.
+
+Control Program Identification
+CONFIG_HWC_CPI
+  Allows for Control Program Identification via the HWC interface,
+  i.e. provides a mean to pass an OS instance name (system name)
+  to the machine.
+
+  This option should only be selected as a module since the
+  system name has to be passed as module parameter. The module
+  will be called hwc_cpi.o.
+
+S/390 tape device support
+CONFIG_S390_TAPE
+  Select this option if you want to access channel-attached tape
+  devices on IBM S/390 or zSeries.
+  If you select this option you will also want to select at
+  least one of the tape interface options and one of the tape
+  hardware options in order to access a tape device.
+  This option is also available as a module. The module will be
+  called tape390.o and include all selected interfaces.
+  The hardware drivers will be seperate modules.
+  If unsure, say "Y".
+
+Support for tape character devices
+CONFIG_S390_TAPE_CHAR
+  Select this option if you want to access your channel-attached
+  tape devices using the character device interface.
+  This interface is similar to other Linux tape devices like
+  SCSI-Tapes (st) and the floppy tape device (ftape).
+  If unsure, say "Y".
+
+Support for tape block devices
+CONFIG_S390_TAPE_BLOCK
+  Select this option if you want to access your channel-attached tape
+  devices using the block device interface.  This interface is similar
+  to CD-ROM devices on other platforms.  The tapes can only be
+  accessed read-only when using this interface.  Have a look at
+  Documentation/s390/TAPE for further information about creating
+  volumes for and using this interface.  It is safe to say "Y" here.
+
+Support for 3490 tape hardware
+CONFIG_S390_TAPE_3490
+  Select this option if you want to access IBM 3490 magnetic
+  tape subsystems and 100% compatibles.
+  This option is also available as a module. The module will be
+  called tape3490.o. If CONFIG_S390_TAPE is selected as a module,
+  this hardware driver cannot be built-in but is only available
+  as a module.
+  It is safe to say "Y" here.
+
+Support for 3480 tape hardware
+CONFIG_S390_TAPE_3480
+  Select this option if you want to access IBM 3480 magnetic
+  tape subsystems and 100% compatibles.
+  This option is also available as a module. The module will be
+  called tape3480.o. If CONFIG_S390_TAPE is selected as a module,
+  this hardware driver cannot be built-in but is only available
+  as a module.
+  It is safe to say "Y" here.
+
+CTC device support
+CONFIG_CTC
+  Select this option if you want to use channel-to-channel networking
+  on IBM S/390 or zSeries. This device driver supports real CTC
+  coupling using ESCON. It also supports virtual CTCs when running
+  under VM. It will use the channel device configuration if this is
+  available.  This option is also available as a module which will be
+  called ctc.o.  If you do not know what it is, it's safe to say "Y".
+
+XPRAM disk support
+CONFIG_BLK_DEV_XPRAM
+  Select this option if you want to use your expanded storage on S/390
+  or zSeries as a disk.  This is useful as a _fast_ swap device if you
+  want to access more than 2G of memory when running in 31 bit mode.
+  This option is also available as a module which will be called
+  xpram.o.  If unsure, say "N".
+
+Fast IRQ handling
+CONFIG_FAST_IRQ
+  Select this option in order to get the interrupts processed faster
+  on your S/390 or zSeries machine.  If selected, after an interrupt
+  is processed, the channel subsystem will be asked for other pending
+  interrupts which will also be processed before leaving the interrupt
+  context.  This speeds up the I/O a lot. Say "Y".
+
+IUCV device support (VM only)
+CONFIG_IUCV
+  Select this option if you want to use inter-user communication
+  vehicle networking under VM or VIF.  This option is also available
+  as a module which will be called iucv.o. If unsure, say "Y".
+
+Process warning machine checks
+CONFIG_MACHCHK_WARNING
+  Select this option if you want the machine check handler on IBM S/390 or 
+  zSeries to process warning machine checks (e.g. on power failures). 
+  If unsure, say "Y".
+
+Use chscs for Common I/O
+CONFIG_CHSC
+  Select this option if you want the s390 common I/O layer to use information
+  obtained by channel subsystem calls. This will enable Linux to process link
+  failures and resource accessibility events. Moreover, if you have procfs
+  enabled, you'll be able to toggle chpids logically offline and online. Even
+  if you don't understand what this means, you should say "Y".
+
+Process warning machine checks
+CONFIG_MACHCHK_WARNING
+  Select this option if you want the machine check handler on IBM S/390 or 
+  zSeries to process warning machine checks (e.g. on power failures). 
+  If unsure, say "Y".
+
+Use chscs for Common I/O
+CONFIG_CHSC
+  Select this option if you want the s390 common I/O layer to use information
+  obtained by channel subsystem calls. This will enable Linux to process link
+  failures and resource accessibility events. Moreover, if you have procfs
+  enabled, you'll be able to toggle chpids logically offline and online. Even
+  if you don't understand what this means, you should say "Y".
+
+Kernel support for 31 bit ELF binaries
+CONFIG_S390_SUPPORT
+  Select this option if you want to enable your system kernel to
+  handle system-calls from ELF binaries for 31 bit ESA.  This option
+  (and some other stuff like libraries and such) is needed for
+  executing 31 bit applications.  It is safe to say "Y".
+
+Channel Device Configuration
+CONFIG_CHANDEV
+  The channel device layer is a layer to provide a consistent
+  interface for configuration & default machine check (devices
+  appearing & disappearing) handling on Linux for s/390 & z/Series
+  channel devices.
+
+  s/390 & z/Series channel devices include among others
+
+  lcs (the most common ethernet/token ring/fddi standard on
+  zSeries)
+  ctc/escon hi speed like serial link standard on zSeries
+  claw used to talk to cisco routers.
+  qeth gigabit ethernet.
+
+  These devices use two channels one read & one write for
+  configuration & communication (& a third channel, the data
+  channel the case of gigabit ethernet). The motivation
+  behind developing this layer was that there was a lot of
+  duplicate code among the channel device drivers for
+  configuration.
+
+  Also the lcs & ctc drivers tended to fight over
+  3088/08's & 3088/1F's which could be either 2216/3172
+  channel attached lcs compatible devices or escon/ctc pipes
+  had to be configured separately as they couldn't autodetect,
+  this is now simplified by doing the configuration in a single
+  place (the channel device layer).
+
+  This layer isn't invasive & it is quite okay to use channel
+  drivers which don't use the channel device layer in
+  conjunction with drivers which do.
+
+  For more info see the chandev manpage usually distributed in
+  <file:Documentation/s390/chandev.8> in the Linux source tree.
+
+SAB3036 tuner support
+CONFIG_TUNER_3036
+  Say Y here to include support for Philips SAB3036 compatible tuners.
+  If in doubt, say N.
+
+Compaq SMART2 support
+CONFIG_BLK_CPQ_DA
+  This is the driver for Compaq Smart Array controllers.  Everyone
+  using these boards should say Y here.  See the file
+  <file:Documentation/cpqarray.txt> for the current list of boards
+  supported by this driver, and for further information on the use of
+  this driver.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called
+  cpqarray.o
+
+Show crashed user process info
+CONFIG_PROCESS_DEBUG
+  Say Y to print all process fault locations to the console.  This is
+  a debugging option; you probably do not want to set it unless you
+  are an S390 port maintainer.
+
+#
+# ARM options
+#
+# CML2 transition note: CML1 asks ARCH_ARCA5K, then has ARCH_A5K and ARCH_ARK
+# as subquestions.  CML2 asks the subquestions in the armtype menu and makes
+# ARCH_ARCA5K a derived symbol.
+ARM System type
+CONFIG_ARCH_ARCA5K
+  This selects what ARM system you wish to build the kernel for. It
+  also selects to some extent the CPU type. If you are unsure what
+  to set this option to, please consult any information supplied with
+  your system.
+
+# Choice: armtype
+A5000
+CONFIG_ARCH_A5K
+  Say Y here to to support the Acorn A5000.  Linux can support the
+  internal IDE disk and CD-ROM interface, serial and parallel port,
+  and the floppy drive.  Note that on some A5000s the floppy is
+  plugged into the wrong socket on the motherboard.
+
+Archimedes
+CONFIG_ARCH_ARC
+  The Acorn Archimedes was an personal computer based on an 8K ARM2
+  processor, released in 1987.  It supported 512K of RAM and 2 800K
+  floppy disks.  Picture and more detailed specifications at
+  <http://www.computingmuseum.com/museum/archi.htm>.
+
+EBSA-110
+CONFIG_ARCH_EBSA110
+  This is an evaluation board for the StrongARM processor available
+  from Digital. It has limited hardware on-board, including an onboard
+  Ethernet interface, two PCMCIA sockets, two serial ports and a
+  parallel port.
+
+RiscPC
+CONFIG_ARCH_RPC
+  On the Acorn Risc-PC, Linux can support the internal IDE disk and
+  CD-ROM interface, serial and parallel port, and the floppy drive.
+
+2MB physical memory
+CONFIG_PAGESIZE_16
+  Say Y here if your Archimedes or A5000 system has only 2MB of
+  memory, otherwise say N.  The resulting kernel will not run on a
+  machine with 4MB of memory.
+
+CATS
+CONFIG_ARCH_CATS
+  Say Y here if you intend to run this kernel on the CATS.
+
+  Saying N will reduce the size of the Footbridge kernel.
+
+EBSA285 (addin mode)
+CONFIG_ARCH_EBSA285_ADDIN
+  Say Y here if you intend to run this kernel on the EBSA285 card
+  in addin mode.
+
+  Saying N will reduce the size of the Footbridge kernel.
+
+EBSA285 (host mode)
+CONFIG_ARCH_EBSA285_HOST
+  Say Y here if you intend to run this kernel on the EBSA285 card
+  in host ("central function") mode.
+
+  Saying N will reduce the size of the Footbridge kernel.
+
+LinkUp Systems L7200 SDB
+CONFIG_ARCH_L7200
+  Say Y here if you intend to run this kernel on a LinkUp Systems
+  L7200 Software Development Board which uses an ARM720T processor.
+  Information on this board can be obtained at:
+
+  <http://www.linkupsys.com/>
+
+  If you have any questions or comments about the Linux kernel port
+  to this board, send e-mail to sjhill@cotw.com.
+
+NetWinder
+CONFIG_ARCH_NETWINDER
+  Say Y here if you intend to run this kernel on the Rebel.COM
+  NetWinder.  Information about this machine can be found at:
+
+  <http://www.netwinder.org/>
+
+  Saying N will reduce the size of the Footbridge kernel.
+
+P720T
+CONFIG_ARCH_P720T
+  Say Y here if you intend to run this kernel on the ARM Prospector
+  720T.
+
+Compaq Personal Server
+CONFIG_ARCH_PERSONAL_SERVER
+  Say Y here if you intend to run this kernel on the Compaq
+  Personal Server.
+
+  Saying N will reduce the size of the Footbridge kernel.
+
+  The Compaq Personal Server is not available for purchase.
+  There are no product plans beyond the current research
+  prototypes at this time.  Information is available at:
+
+  <http://crl.research.compaq.com/projects/personalserver/>
+
+  If you have any questions or comments about the  Compaq Personal
+  Server, send e-mail to skiff@crl.dec.com.
+
+Cirrus Logic EDB-7211 evaluation board
+CONFIG_ARCH_EDB7211
+  Say Y here if you intend to run this kernel on a Cirrus Logic EDB-7211
+  evaluation board.
+
+EP7211 infrared support
+CONFIG_EP7211_IR
+  Say Y here if you wish to use the infrared port on the EP7211. Note
+  that you can't use the first UART and the infrared port at the same
+  time, and that the EP7211 only supports SIR mode, at speeds up to
+  115.2 kbps. To use the I/R port, you will need to get the source to
+  irda-utils and apply the patch at
+  <http://lists.arm.linux.org.uk/pipermail/linux-arm-kernel/2001-June/003510.html>.
+
+Assabet
+CONFIG_SA1100_ASSABET
+  Say Y here if you are using the Intel(R) StrongARM(R) SA-1110
+  Microprocessor Development Board (also known as the Assabet).
+
+Neponset
+CONFIG_ASSABET_NEPONSET
+  Say Y here if you are using the Intel(R) StrongARM(R) SA-1110
+  Microprocessor Development Board (Assabet)  with the SA-1111
+  Development Board (Nepon).
+
+Compaq iPAQ H3600
+CONFIG_SA1100_H3600
+  Say Y here if you intend to run this kernel on the Compaq iPAQ
+  H3600 handheld computer.  Information about this machine and the
+  Linux port to this machine can be found at:
+
+  <http://www.handhelds.org/Compaq/index.html#iPAQ_H3600>
+  <http://www.compaq.com/products/handhelds/pocketpc/>
+
+Brutus
+CONFIG_SA1100_BRUTUS
+  Say Y here if you are using the Intel(R) StrongARM(R) SA-1100
+  Microprocessor Development Board (also known as the Brutus).
+
+LART
+CONFIG_SA1100_LART
+  Say Y here if you are using the Linux Advanced Radio Terminal
+  (also known as the LART).  See <http://www.lart.tudelft.nl/> for
+  information on the LART.
+
+GraphicsClient
+CONFIG_SA1100_GRAPHICSCLIENT
+  Say Y here if you are using an Applied Data Systems Intel(R)
+  StrongARM(R) SA-1100 based Graphics Client SBC.  See
+  <http://www.applieddata.net/> for information on this system.
+
+GraphicsMaster
+CONFIG_SA1100_GRAPHICSMASTER
+  Say Y here if you are using an Applied Data Systems Intel(R)
+  StrongARM(R) SA-1100 based Graphics Master SBC with SA-1111
+  StrongARM companion chip.  See
+  <http://www.applieddata.net/products_masterSpec.asp> for information
+  on this system.
+
+ADSBitsy
+CONFIG_SA1100_ADSBITSY
+  Say Y here if you are using Applied Data Systems Intel(R)
+  StrongARM(R) 1110 based Bitsy, 3 x 5 inches in size, Compaq - IPAQ -
+  like platform. See
+  <http://www.applieddata.net/products_bitsySpec.asp> for more
+  information.
+
+ITSY
+CONFIG_SA1100_ITSY
+  Say Y here if you are using the Compaq Itsy experimental pocket
+  computer. See <http://research.compaq.com/wrl/projects/itsy/> for
+  more information.
+
+PLEB
+CONFIG_SA1100_PLEB
+  Say Y here if you are using a Portable Linux Embedded Board
+  (also known as PLEB). See <http://www.cse.unsw.edu.au/~pleb/>
+  for more information.
+
+CerfBoard
+CONFIG_SA1100_CERF
+  The Intrinsyc CerfBoard is based on the StrongARM 1110.
+  More information is available at:
+  <http://www.intrinsyc.com/products/referenceplatforms/cerfboard.html>.
+
+  Say Y if configuring for an Intrinsyc CerfBoard.
+  Say N otherwise.
+
+FlexaNet
+CONFIG_SA1100_FLEXANET
+  Say Y here if you intend to run this kernel on the FlexaNet
+  handheld instruments. Information about this machine can be
+  found at: <http://www.flexanet.com/>.
+
+nanoEngine
+CONFIG_SA1100_NANOENGINE
+  The nanoEngine is a StrongARM 1110-based single board computer
+  from Bright Star Engineering. More information is available at:
+  <http://www.brightstareng.com/arm/nanoeng.htm>.
+
+  Say Y if configuring for a nanoEngine.
+  Say N otherwise.
+
+Pangolin
+CONFIG_SA1100_PANGOLIN
+  Pangolin is a StrongARM 1110-based evaluation platform produced
+  by Dialogue Technology.  It has EISA slots for ease of configuration
+  with SDRAM/Flash memory card, USB/Serial/Audio card, Compact Flash
+  card, and TFT-LCD card.
+
+  Say Y if configuring for a Pangolin.
+  Say N otherwise.
+
+Victor
+CONFIG_SA1100_VICTOR
+  Say Y here if you are using a Visu Aide Intel(R) StrongARM(R)
+  SA-1100 based Victor Digital Talking Book Reader.  See
+  <http://www.visuaide.com/pagevictor.en.html> for information on
+  this system.
+
+# Choice: cerf_ram
+Cerf on-board RAM size
+CONFIG_SA1100_CERF_8MB
+   Declare the size of the CerfBoard's on-board RAM.
+   Alternatives are 8, 16, 32, and 64MB.
+
+16MB
+CONFIG_SA1100_CERF_16MB
+   Declare that the CerfBoard has 16MB RAM.
+
+32MB
+CONFIG_SA1100_CERF_32MB
+   Declare that the CerfBoard has 32MB RAM.
+
+64MB
+CONFIG_SA1100_CERF_64MB
+   Declare that the CerfBoard has 64MB RAM.
+
+# Choice: cerf_flash
+Cerf flash memory size
+CONFIG_SA1100_CERF_FLASH_8MB
+  Tell the Cerf kernel the size of on-board memory.  The choices
+  are 8MB, 16MB, or 32MB.
+
+16MB
+CONFIG_SA1100_CERF_FLASH_16MB
+  Configure the Cerf kernel to expect 16MB of flash memory.
+
+32MB
+CONFIG_SA1100_CERF_FLASH_32MB
+  Configure the Cerf kernel to expect 32MB of flash memory.
+
+Support ARM610 processor
+CONFIG_CPU_ARM610
+  The ARM610 is the successor to the ARM3 processor
+  and was produced by VLSI Technology Inc.
+
+  Say Y if you want support for the ARM610 processor.
+  Otherwise, say N.
+
+Support ARM710 processor
+CONFIG_CPU_ARM710
+  A 32-bit RISC microprocessor based on the ARM7 processor core
+  designed by Advanced RISC Machines Ltd. The ARM710 is the
+  successor to the ARM610 processor. It was released in
+  July 1994 by VLSI Technology Inc.
+
+  Say Y if you want support for the ARM710 processor.
+  Otherwise, say N.
+
+Support ARM720T processor
+CONFIG_CPU_ARM720T
+  A 32-bit RISC processor with 8kByte Cache, Write Buffer and
+  MMU built around an ARM7TDMI core.
+
+  Say Y if you want support for the ARM720T processor.
+  Otherwise, say N.
+
+Support ARM920T processor
+CONFIG_CPU_ARM920T
+  The ARM920T is licensed to be produced by numerous vendors,
+  and is used in the Maverick EP9312.  More information at
+  <http://linuxdevices.com/products/PD2382866068.html>.
+
+  Say Y if you want support for the ARM920T processor.
+  Otherwise, say N.
+
+Support ARM1020 processor
+CONFIG_CPU_ARM1020
+  The ARM1020 is the cached version of the ARM10 processor,
+  with an addition of a floating-point unit.
+
+  Say Y if you want support for the ARM1020 processor.
+  Otherwise, say N.
+
+Support StrongARM SA-110 processor
+CONFIG_CPU_SA110
+  The Intel StrongARM(R) SA-110 is a 32-bit microprocessor and
+  is available at five speeds ranging from 100 MHz to 233 MHz.
+  More information is available at
+  <http://developer.intel.com/design/strong/sa110.htm>.
+
+  Say Y if you want support for the SA-110 processor.
+  Otherwise, say N.
+
+Tulsa
+CONFIG_SA1100_PFS168
+  The Radisys Corp. PFS-168 (aka Tulsa) is an Intel® StrongArm® SA-1110 based
+  computer which includes the SA-1111 Microprocessor Companion Chip and other
+  custom I/O designed to add connectivity and multimedia features for vending
+  and business machine applications. Say Y here if you require support for
+  this target.
+
+HP Jornada 720
+CONFIG_SA1100_JORNADA720
+  Say Y here if you want to build a kernel for the HP Jornada 720
+  handheld computer.  See <http://www.hp.com/jornada/products/720>
+  for details.
+
+InHand Electronics OmniMeter
+CONFIG_SA1100_OMNIMETER
+  Say Y here if you are using the inhand electronics OmniMeter.  See
+  <http://www.inhandelectronics.com/html/omni1.html> for details.
+
+Load kernel using Angel Debug Monitor
+CONFIG_ANGELBOOT
+  Say Y if you plan to load the kernel using Angel, ARM Ltd's target
+  debug stub.  If you are not using Angel, you must say N.  It is
+  important to get this setting correct.
+
+CDB89712
+CONFIG_ARCH_CDB89712
+  This is an evaluation board from Cirrus for the CS89712 processor.  The
+  board includes 2 serial ports, Ethernet, IRDA, and expansion headers.
+  It comes with 16 MB SDRAM and 8 MB flash ROM.
+
+CLPS-711X internal ROM bootstrap
+CONFIG_EP72XX_ROM_BOOT
+  If you say Y here, your CLPS711x-based kernel will use the bootstrap
+  mode memory map instead of the normal memory map.
+
+  Processors derived from the Cirrus CLPS-711X core support two boot modes.
+  Normal mode boots from the external memory device at CS0.  Bootstrap mode
+  rearranges parts of the memory map, placing an internal 128 byte bootstrap
+  ROM at CS0.  This option performs the address map changes required to
+  support booting in this mode.
+
+  You almost surely want to say N here.
+
+Math emulation
+CONFIG_FPE_NWFPE
+  Say Y to include the NWFPE floating point emulator in the kernel.
+  This is necessary to run most binaries. Linux does not currently
+  support floating point hardware so you need to say Y here even if
+  your machine has an FPA or floating point co-processor podule.
+
+  It is also possible to say M to build the emulator as a module
+  (nwfpe.o) or indeed to leave it out altogether. However, unless you
+  know what you are doing this can easily render your machine
+  unbootable. Saying Y is the safe option.
+
+  You may say N here if you are going to load the Acorn FPEmulator
+  early in the bootup.
+
+FastFPE math emulation
+CONFIG_FPE_FASTFPE
+  Say Y here to include the FAST floating point emulator in the kernel.
+  This is an experimental much faster emulator which has only 32 bit
+  precision for the mantissa.  It does not support any exceptions.
+  This makes it very simple, it is approximately 4-8 times faster than
+  NWFPE.
+
+  It should be sufficient for most programs.  It is definitely not
+  suitable if you do scientific calculations that need double
+  precision for iteration formulas that sum up lots of very small
+  numbers.  If you do not feel you need a faster FP emulation you
+  should better choose NWFPE.
+
+  It is also possible to say M to build the emulator as a module
+  (fastfpe.o).  But keep in mind that you should only load the FP
+  emulator early in the bootup.  You should never change from NWFPE to
+  FASTFPE or vice versa in an active system!
+
+DS1620 thermometer support
+CONFIG_DS1620
+  Say Y here to include support for the thermal management hardware
+  found in the NetWinder. This driver allows the user to control the
+  temperature set points and to read the current temperature.
+
+  It is also possible to say M here to build it as a module (ds1620.o)
+  It is recommended to be used on a NetWinder, but it is not a
+  necessity.
+
+Check for stack overflows
+CONFIG_DEBUG_STACKOVERFLOW
+  This option make do_IRQ() check for enough stack space beeing left.
+  This is safe to enable.
+
+Debug high memory support
+CONFIG_DEBUG_HIGHMEM
+  This options enables addition error checking for high memory systems.
+  Disable for production systems.
+
+Verbose kernel error messages
+CONFIG_DEBUG_ERRORS
+  This option controls verbose debugging information which can be
+  printed when the kernel detects an internal error. This debugging
+  information is useful to kernel hackers when tracking down problems,
+  but mostly meaningless to other people. It's safe to say Y unless
+  you are concerned with the code size or don't want to see these
+  messages.
+
+Compile kernel with frame pointer
+CONFIG_FRAME_POINTER
+  If you say Y here, the resulting kernel will be slightly larger and
+  slower, but it will give very useful debugging information. If you
+  don't debug the kernel, you can say N, but we may not be able to
+  solve problems without frame pointers.
+
+Verbose user fault messages
+CONFIG_DEBUG_USER
+  When a user program crashes due to an exception, the kernel can
+  print a brief message explaining what the problem was. This is
+  sometimes helpful for debugging but serves no purpose on a
+  production system. Most people should say N here.
+
+Include gdb debugging information in kernel binary
+CONFIG_DEBUG_INFO
+  Say Y here to include source-level debugging information in the
+  `vmlinux' binary image. This is handy if you want to use gdb or
+  addr2line to debug the kernel. It has no impact on the in-memory
+  footprint of the running kernel but it can increase the amount of
+  time and disk space needed for compilation of the kernel. If in
+  doubt say N.
+
+Kernel low-level debugging functions
+CONFIG_DEBUG_LL
+  Say Y here to include definitions of printascii, printchar, printhex
+  in the kernel.  This is helpful if you are debugging code that
+  executes before the console is initialized.
+
+Kernel low-level debugging messages via footbridge serial port
+CONFIG_DEBUG_DC21285_PORT
+  Say Y here if you want the debug print routines to direct their
+  output to the serial port in the DC21285 (Footbridge). Saying N
+  will cause the debug messages to appear on the first 16550
+  serial port.
+
+Kernel low-level debugging messages via UART2
+CONFIG_DEBUG_CLPS711X_UART2
+  Say Y here if you want the debug print routines to direct their
+  output to the second serial port on these devices.  Saying N will
+  cause the debug messages to appear on the first serial port.
+
+Disable pgtable cache
+CONFIG_NO_PGT_CACHE
+  Normally the kernel maintains a `quicklist' of preallocated
+  pagetable structures in order to increase performance. On machines
+  with very few pages this may however be a loss. Say Y here to
+  disable the pgtable cache.
+
+RISC OS personality
+CONFIG_ARTHUR
+  Say Y here to include the kernel code necessary if you want to run
+  Acorn RISC OS/Arthur binaries under Linux. This code is still very
+  experimental; if this sounds frightening, say N and sleep in peace.
+  You can also say M here to compile this support as a module (which
+  will be called arthur.o).
+
+Initial kernel command line
+CONFIG_CMDLINE
+  On some architectures (EBSA110 and CATS), there is currently no way
+  for the boot loader to pass arguments to the kernel. For these
+  architectures, you should supply some command-line options at build
+  time by entering them here. As a minimum, you should specify the
+  memory size and the root device (e.g., mem=64M root=/dev/nfs).
+
+Kernel-mode alignment trap handler
+CONFIG_ALIGNMENT_TRAP
+  ARM processors can not fetch/store information which is not
+  naturally aligned on the bus, i.e., a 4 byte fetch must start at an
+  address divisible by 4. On 32-bit ARM processors, these non-aligned
+  fetch/store instructions will be emulated in software if you say
+  here, which has a severe performance impact. This is necessary for
+  correct operation of some network protocols. With an IP-only
+  configuration it is safe to say N, otherwise say Y.
+
+DC21285 serial port support
+CONFIG_SERIAL_21285
+  If you have a machine based on a 21285 (Footbridge) StrongARM(R)/
+  PCI bridge you can enable its onboard serial port by enabling this
+  option. The device has major ID 4, minor 64.
+
+Console on DC21285 serial port
+CONFIG_SERIAL_21285_CONSOLE
+  If you have enabled the serial port on the 21285 footbridge you can
+  make it the console by answering Y to this option.
+
+SA1100 serial port support
+CONFIG_SERIAL_SA1100
+  * Orphaned entry retained 20 April 2001 by Russell King       *
+  * If you read this note from the configurator, please contact *
+  * the Configure.help maintainers.                             *
+  If you have a machine based on a SA1100/SA1110 StrongARM CPU you can
+  enable its onboard serial port by enabling this option.
+  Please read <file:Documentation/arm/SA1100/serial_UART> for further
+  info.
+
+Console on SA1100 serial port
+CONFIG_SERIAL_SA1100_CONSOLE
+  * Orphaned entry retained 20 April 2001 by Russell King       *
+  * If you read this note from the configurator, please contact *
+  * the Configure.help maintainers.                             *
+  If you have enabled the serial port on the SA1100/SA1110 StrongARM
+  CPU you can make it the console by answering Y to this option.
+
+L7200 serial port support
+CONFIG_SERIAL_L7200
+  * Orphaned entry retained 20 April 2001 by Russell King       *
+  * If you read this note from the configurator, please contact *
+  * the Configure.help maintainers.                             *
+  If you have a LinkUp Systems L7200 board you can enable its two
+  onboard serial ports by enabling this option. The device numbers
+  are major ID 4 with minor 64 and 65 respectively.
+
+Console on L7200 serial port
+CONFIG_SERIAL_L7200_CONSOLE
+  * Orphaned entry retained 20 April 2001 by Russell King       *
+  * If you read this note from the configurator, please contact *
+  * the Configure.help maintainers.                             *
+  If you have enabled the serial ports on the L7200 development board
+  you can make the first serial port the console by answering Y to
+  this option.
+
+L7200 SDB keyboard support
+CONFIG_KEYBOARD_L7200
+  * Orphaned entry retained 20 April 2001 by Russell King       *
+  * If you read this note from the configurator, please contact *
+  * the Configure.help maintainers.                             *
+  Enable this option if you would like to be able to use a keyboard
+  on a LinkUp Systems L7200 board.
+
+L7200 SDB Fujitsu keyboard support
+CONFIG_KEYBOARD_L7200_NORM
+  * Orphaned entry retained 20 April 2001 by Russell King       *
+  * If you read this note from the configurator, please contact *
+  * the Configure.help maintainers.                             *
+  Select the Fujitsu keyboard if you want a normal QWERTY style
+  keyboard on the LinkUp SDB.
+
+L7200 SDB Prototype keyboard support
+CONFIG_KEYBOARD_L7200_DEMO
+  * Orphaned entry retained 20 April 2001 by Russell King       *
+  * If you read this note from the configurator, please contact *
+  * the Configure.help maintainers.                             *
+  Select the prototype keyboard if you want to play with the
+  LCD/keyboard combination on the LinkUp SDB.
+
+Footbridge Mode
+CONFIG_HOST_FOOTBRIDGE
+  * Orphaned entry retained 20 April 2001 by Russell King       *
+  * If you read this note from the configurator, please contact *
+  * the Configure.help maintainers.                             *
+  The 21285 Footbridge chip can operate in either `host mode' or
+  `add-in' mode.  Say Y if your 21285 is in host mode, and therefore
+  is the configuration master, otherwise say N. This must not be
+  set to Y if the card is used in 'add-in' mode.
+
+MFM hard disk support
+CONFIG_BLK_DEV_MFM
+  Support the MFM hard drives on the Acorn Archimedes both
+  on-board the A4x0 motherboards and via the Acorn MFM modules.
+  Drives up to 64MB are supported. If you haven't got one of these
+  machines or drives just say N.
+
+Old Archimedes floppy (1772) support
+CONFIG_BLK_DEV_FD1772
+  Support the floppy drive on the Acorn Archimedes (A300, A4x0, A540,
+  R140 and R260) series of computers; it supports only 720K floppies
+  at the moment. If you don't have one of these machines just answer
+  N.
+
+Autodetect hard drive geometry
+CONFIG_BLK_DEV_MFM_AUTODETECT
+  If you answer Y, the MFM code will attempt to automatically detect
+  the cylinders/heads/sectors count on your hard drive. WARNING: This
+  sometimes doesn't work and it also does some dodgy stuff which
+  potentially might damage your drive.
+
+NetWinder /dev/flash support
+CONFIG_NWFLASH
+  If you say Y here and create a character device /dev/flash with
+  major 10 and minor 160 you can manipulate the flash ROM containing
+  the NetWinder firmware. Be careful as accidentally overwriting the
+  flash contents can render your computer unbootable. On no account
+  allow random users access to this device. :-)
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called nwflash.o. If you want to compile it as a
+  module, say M here and read <file:Documentation/modules.txt>.
+
+  If you're not sure, say N.
+
+SRM environment variables in procfs
+CONFIG_SRM_ENV
+  If you enable this option, a subdirectory inside /proc called
+  /proc/srm_environment will give you access to the all important
+  SRM environment variables (those which have a name) and also
+  to all others (by their internal number).
+
+  SRM is something like a BIOS for Alpha machines. There are some
+  other such BIOSes, like AlphaBIOS, which this driver cannot
+  support (hey, that's not SRM!).
+
+  Despite the fact that this driver doesn't work on all Alphas (but
+  only on those which have SRM as their firmware), it's save to
+  build it even if your particular machine doesn't know about SRM
+  (or if you intend to compile a generic kernel). It will simply
+  not create those subdirectory in /proc (and give you some warning,
+  of course).
+
+  This driver is also available as a module and will be called
+  srm_env.o then.
+
+Footbridge internal watchdog
+CONFIG_21285_WATCHDOG
+  The Intel Footbridge chip contains a builtin watchdog circuit. Say Y
+  here if you wish to use this. Alternatively say M to compile the
+  driver as a module, which will be called wdt285.o.
+
+  This driver does not work on all machines. In particular, early CATS
+  boards have hardware problems that will cause the machine to simply
+  lock up if the watchdog fires.
+
+  "If in doubt, leave it out" - say N.
+
+NetWinder WB83C977 watchdog
+CONFIG_977_WATCHDOG
+  Say Y here to include support for the WB977 watchdog included in
+  NetWinder machines. Alternatively say M to compile the driver as
+  a module, which will be called wdt977.o.
+
+  Not sure? It's safe to say N.
+
+IrDA subsystem support
+CONFIG_IRDA
+  Say Y here if you want to build support for the IrDA (TM) protocols.
+  The Infrared Data Associations (tm) specifies standards for wireless
+  infrared communication and is supported by most laptops and PDA's.
+
+  To use Linux support for the IrDA (tm) protocols, you will also need
+  some user-space utilities like irattach.  For more information, see
+  the file <file:Documentation/networking/irda.txt>.  You also want to
+  read the IR-HOWTO, available at
+  <http://www.tldp.org/docs.html#howto>.
+
+  If you want to exchange bits of data (vCal, vCard) with a PDA, you
+  will need to install some OBEX application, such as OpenObex :
+  <http://sourceforge.net/projects/openobex/>
+
+  This support is also available as a module called irda.o.  If you
+  want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+
+Ultra (connectionless) protocol
+CONFIG_IRDA_ULTRA
+  Say Y here to support the connectionless Ultra IRDA protocol.
+  Ultra allows to exchange data over IrDA with really simple devices
+  (watch, beacon) without the overhead of the IrDA protocol (no handshaking,
+  no management frames, simple fixed header).
+  Ultra is available as a special socket : socket(AF_IRDA, SOCK_DGRAM, 1);
+
+IrDA cache last LSAP
+CONFIG_IRDA_CACHE_LAST_LSAP
+  Say Y here if you want IrLMP to cache the last LSAP used.  This
+  makes sense since most frames will be sent/received on the same
+  connection.  Enabling this option will save a hash-lookup per frame.
+
+  If unsure, say Y.
+
+IrDA Fast RRs
+CONFIG_IRDA_FAST_RR
+  Say Y here is you want IrLAP to send fast RR (Receive Ready) frames
+  when acting as a primary station.
+  Disabling this option will make latency over IrDA very bad. Enabling
+  this option will make the IrDA stack send more packet than strictly
+  necessary, thus reduce your battery life (but not that much).
+
+  Fast RR will make IrLAP send out a RR frame immediately when
+  receiving a frame if its own transmit queue is currently empty. This
+  will give a lot of speed improvement when receiving much data since
+  the secondary station will not have to wait the max. turn around
+  time (usually 500ms) before it is allowed to transmit the next time.
+  If the transmit queue of the secondary is also empty, the primary will
+  start backing-off before sending another RR frame, waiting longer
+  each time until the back-off reaches the max. turn around time.
+  This back-off increase in controlled via
+  /proc/sys/net/irda/fast_poll_increase
+
+  If unsure, say Y.
+
+IrDA debugging information
+CONFIG_IRDA_DEBUG
+  Say Y here if you want the IrDA subsystem to write debug information
+  to your syslog. You can change the debug level in
+  /proc/sys/net/irda/debug .
+  When this option is enabled, the IrDA also perform many extra internal
+  verifications which will usually prevent the kernel to crash in case of
+  bugs.
+
+  If unsure, say Y (since it makes it easier to find the bugs).
+
+IrLAN protocol
+CONFIG_IRLAN
+  Say Y here if you want to build support for the IrLAN protocol.  If
+  you want to compile it as a module (irlan.o), say M here and read
+  <file:Documentation/modules.txt>.  IrLAN emulates an Ethernet and
+  makes it possible to put up a wireless LAN using infrared beams.
+
+  The IrLAN protocol can be used to talk with infrared access points
+  like the HP NetbeamIR, or the ESI JetEye NET.  You can also connect
+  to another Linux machine running the IrLAN protocol for ad-hoc
+  networking!
+
+IrNET protocol
+CONFIG_IRNET
+  Say Y here if you want to build support for the IrNET protocol.  If
+  you want to compile it as a module (irnet.o), say M here and read
+  <file:Documentation/modules.txt>.  IrNET is a PPP driver, so you
+  will also need a working PPP subsystem (driver, daemon and
+  config)...
+
+  IrNET is an alternate way to transfer TCP/IP traffic over IrDA.  It
+  uses synchronous PPP over a set of point to point IrDA sockets.  You
+  can use it between Linux machine or with W2k.
+
+IrCOMM protocol
+CONFIG_IRCOMM
+  Say Y here if you want to build support for the IrCOMM protocol.  If
+  you want to compile it as a module (you will get ircomm.o and
+  ircomm-tty.o), say M here and read <file:Documentation/modules.txt>.
+  IrCOMM implements serial port emulation, and makes it possible to
+  use all existing applications that understands TTY's with an
+  infrared link.  Thus you should be able to use application like PPP,
+  minicom and others.  Enabling this option will create two modules
+  called ircomm and ircomm_tty.
+
+IrTTY IrDA Device Driver
+CONFIG_IRTTY_SIR
+  Say Y here if you want to build support for the IrTTY line
+  discipline.  If you want to compile it as a module (irtty.o), say M
+  here and read <file:Documentation/modules.txt>.  IrTTY makes it
+  possible to use Linux's own serial driver for all IrDA ports that
+  are 16550 compatible.  Most IrDA chips are 16550 compatible so you
+  should probably say Y to this option.  Using IrTTY will however
+  limit the speed of the connection to 115200 bps (IrDA SIR mode).
+
+  If unsure, say Y.
+
+IrPORT IrDA serial driver
+CONFIG_IRPORT_SIR
+  Say Y here if you want to build support for the IrPORT IrDA device
+  driver. If you want to compile it as a module (irport.o), say M here
+  and read <file:Documentation/modules.txt>.  IrPORT can be used
+  instead of IrTTY and sometimes this can be better.  One example is
+  if your IrDA port does not have echo-canceling, which will work OK
+  with IrPORT since this driver is working in half-duplex mode only.
+  You don't need to use irattach with IrPORT, but you just insert it
+  the same way as FIR drivers (insmod irport io=0x3e8 irq=11).  Notice
+  that IrPORT is a SIR device driver which means that speed is limited
+  to 115200 bps.
+
+  If unsure, say Y.
+
+USB IrDA FIR dongle Device Driver
+CONFIG_USB_IRDA
+  Say Y here if you want to build support for the USB IrDA FIR Dongle
+  device driver.  If you want to compile it as a module (irda-usb.o),
+  say M here and read <file:Documentation/modules.txt>.  IrDA-USB
+  support the various IrDA USB dongles available and most of their
+  peculiarities.  Those dongles plug in the USB port of your computer,
+  are plug and play, and support SIR and FIR (4Mbps) speeds.  On the
+  other hand, those dongles tend to be less efficient than a FIR
+  chipset.
+
+  Please note that the driver is still experimental.  And of course,
+  you will need both USB and IrDA support in your kernel...
+
+Datafab MDCFE-B Compact Flash Reader support
+CONFIG_USB_STORAGE_DATAFAB
+  This option enables a sub-driver of the USB Mass Storage driver.  These
+  sub-drivers are considered experimental, and should only be used by very
+  brave people.  System crashes and other bad things are likely to occur if
+  you use this driver.  If in doubt, select N.
+
+HP CD-Writer 82xx support
+CONFIG_USB_STORAGE_HP8200e
+  This option enables a sub-driver of the USB Mass Storage driver.  These
+  sub-drivers are considered experimental, and should only be used by very
+  brave people.  System crashes and other bad things are likely to occur if
+  you use this driver.  If in doubt, select N.
+
+Lexar Jumpshot Compact Flash Reader
+CONFIG_USB_STORAGE_JUMPSHOT       
+  This option enables a sub-driver of the USB Mass Storage driver.  These
+  sub-drivers are considered experimental, and should only be used by very
+  brave people.  System crashes and other bad things are likely to occur if
+  you use this driver.  If in doubt, select N.
+
+Winbond W83977AF IrDA Device Driver
+CONFIG_WINBOND_FIR
+  Say Y here if you want to build IrDA support for the Winbond
+  W83977AF super-io chipset.  This driver should be used for the IrDA
+  chipset in the Corel NetWinder.  The driver supports SIR, MIR and
+  FIR (4Mbps) speeds.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called
+  w83977af_ir.o.
+
+NSC PC87108/PC87338 IrDA Device Driver
+CONFIG_NSC_FIR
+  Say Y here if you want to build support for the NSC PC87108 and
+  PC87338 IrDA chipsets.  This driver supports SIR,
+  MIR and FIR (4Mbps) speeds.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called
+  nsc-ircc.o.
+
+National Semiconductor DP83820 support
+CONFIG_NS83820
+  This is a driver for the National Semiconductor DP83820 series
+  of gigabit ethernet MACs.  Cards using this chipset include:
+
+        SMC 9452TX          SMC SMC9462TX       
+        D-Link DGE-500T     PureData PDP8023Z-TG
+        SOHO-GA2000T        SOHO-GA2500T.
+        NetGear GA621
+
+  This driver supports the use of zero copy on tx, checksum 
+  validation on rx, and 64 bit addressing.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called ns83820.o.
+
+Toshiba Type-O IR Port device driver (old driver)
+CONFIG_TOSHIBA_OLD
+  Say Y here if you want to build support for the Toshiba Type-O IR
+  chipset.  This chipset is used by the Toshiba Libretto 100CT, and
+  many more laptops. This driver is obsolete, will no more be
+  maintained and will be removed in favor of the new driver.
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called toshoboe.o.
+
+Toshiba Type-O IR Port device driver
+CONFIG_TOSHIBA_FIR
+  Say Y here if you want to build support for the Toshiba Type-O IR
+  and Donau oboe chipsets. These chipsets are used by the Toshiba
+  Libretto 100/110CT, Tecra 8100, Portege 7020 and many more laptops.
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.
+  The module will be called donauboe.o.
+
+SMC IrCC
+CONFIG_SMC_IRCC_FIR
+  Say Y here if you want to build support for the SMC Infrared
+  Communications Controller.  It is used in the Fujitsu Lifebook 635t
+  and Sony PCG-505TX.  If you want to compile it as a module, say M
+  here and read <file:Documentation/modules.txt>.  The module will be
+  called smc-ircc.o.
+
+ALi M5123 FIR controller driver
+CONFIG_ALI_FIR
+  Say Y here if you want to build support for the ALi M5123 FIR
+  Controller.  The ALi M5123 FIR Controller is embedded in ALi M1543C,
+  M1535, M1535D, M1535+, M1535D Sourth Bridge.  This driver supports
+  SIR, MIR and FIR (4Mbps) speeds.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The module will be called
+  ali-ircc.o.
+
+VLSI 82C147 PCI-IrDA SIR/MIR/FIR Controller driver
+CONFIG_VLSI_FIR
+  Say Y here if you want to build support for the VLSI 82C147
+  PCI-IrDA Controller. This controller is used by the HP OmniBook 800
+  and 5500 notebooks. The driver provides support for SIR, MIR and
+  FIR (4Mbps) speeds.
+
+  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>. The module will be called vlsi_ir.o.
+
+Serial dongle support
+CONFIG_DONGLE
+  Say Y here if you have an infrared device that connects to your
+  computer's serial port. These devices are called dongles. Then say Y
+  or M to the driver for your particular dongle below.
+
+  Note that the answer to this question won't directly affect the
+  kernel: saying N will just cause the configurator to skip all
+  the questions about serial dongles.
+
+ESI JetEye PC dongle
+CONFIG_ESI_DONGLE
+  Say Y here if you want to build support for the Extended Systems
+  JetEye PC dongle.  If you want to compile it as a module, say M here
+  and read <file:Documentation/modules.txt>.  The ESI dongle attaches
+  to the normal 9-pin serial port connector, and can currently only be
+  used by IrTTY.  To activate support for ESI dongles you will have to
+  start irattach like this: "irattach -d esi".
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called esi.o.
+
+ACTiSYS IR-220L and IR220L+ dongle
+CONFIG_ACTISYS_DONGLE
+  Say Y here if you want to build support for the ACTiSYS IR-220L and
+  IR220L+ dongles.  If you want to compile it as a module, say M here
+  and read <file:Documentation/modules.txt>.  The ACTiSYS dongles
+  attaches to the normal 9-pin serial port connector, and can
+  currently only be used by IrTTY.  To activate support for ACTiSYS
+  dongles you will have to start irattach like this:
+  "irattach -d actisys" or "irattach -d actisys+".
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called actisys.o.
+
+Tekram IrMate 210B dongle
+CONFIG_TEKRAM_DONGLE
+  Say Y here if you want to build support for the Tekram IrMate 210B
+  dongle.  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The Tekram dongle attaches to the
+  normal 9-pin serial port connector, and can currently only be used
+  by IrTTY.  To activate support for Tekram dongles you will have to
+  start irattach like this: "irattach -d tekram".
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called tekram.o.
+
+Greenwich GIrBIL dongle
+CONFIG_GIRBIL_DONGLE
+  Say Y here if you want to build support for the Greenwich GIrBIL
+  dongle.  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The Greenwich dongle attaches to
+  the normal 9-pin serial port connector, and can currently only be
+  used by IrTTY.  To activate support for Greenwich dongles you will
+  have to insert "irattach -d girbil" in the /etc/irda/drivers script.
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called girbil.o.
+
+Parallax LiteLink dongle
+CONFIG_LITELINK_DONGLE
+  Say Y here if you want to build support for the Parallax Litelink
+  dongle.  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The Parallax dongle attaches to
+  the normal 9-pin serial port connector, and can currently only be
+  used by IrTTY.  To activate support for Parallax dongles you will
+  have to start irattach like this "irattach -d litelink".
+
+  If you want to compile the driver as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read <file:Documentation/modules.txt>.  The module
+  will be called litelink.o.
+
+Microchip MCP2120 dongle
+CONFIG_MCP2120_DONGLE
+  Say Y here if you want to build support for the Microchip MCP2120
+  dongle.  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The MCP2120 dongle attaches to
+  the normal 9-pin serial port connector, and can currently only be
+  used by IrTTY.  To activate support for MCP2120 dongles you will
+  have to insert "irattach -d mcp2120" in the /etc/irda/drivers script.
+
+  You must build this dongle yourself.  For more information see:
+  <http://www.eyetap.org/~tangf/irda_sir_linux.html>
+
+Old Belkin dongle
+CONFIG_OLD_BELKIN_DONGLE
+  Say Y here if you want to build support for the Adaptec Airport 1000
+  and 2000 dongles.  If you want to compile it as a module, say M here
+  and read <file:Documentation/modules.txt>.  The module will be
+  called old_belkin.o.  Some information is contained in the comments
+  at the top of <file:drivers/net/irda/old_belkin.c>.
+ACTiSYS IR-200L dongle (Experimental)
+CONFIG_ACT200L_DONGLE
+  Say Y here if you want to build support for the ACTiSYS IR-200L
+  dongle. If you want to compile it as a module, say M here and read
+  Documentation/modules.txt. The ACTiSYS IR-200L dongle attaches to
+  the normal 9-pin serial port connector, and can currently only be
+  used by IrTTY. To activate support for ACTiSYS IR-200L dongles
+  you will have to start irattach like this: "irattach -d act200l".
+
+Mobile Action MA600 dongle (Experimental)
+CONFIG_MA600_DONGLE
+  Say Y here if you want to build support for the Mobile Action MA600
+  dongle.  If you want to compile it as a module, say M here and read
+  <file:Documentation/modules.txt>.  The MA600 dongle attaches to
+  the normal 9-pin serial port connector, and can currently only be
+  tested on IrCOMM.  To activate support for MA600 dongles you will
+  have to insert "irattach -d ma600" in the /etc/irda/drivers script.
+  Note: irutils 0.9.15 requires no modification. irutils 0.9.9 needs
+  modification. For more information, download the following tar gzip
+  file.
+
+  There is a pre-compiled module on
+  <http://engsvr.ust.hk/~eetwl95/download/ma600-2.4.x.tar.gz>
+
+VME (Motorola and BVM) support
+CONFIG_VME
+  Say Y here if you want to build a kernel for a 680x0 based VME
+  board.  Boards currently supported include Motorola boards MVME147,
+  MVME162, MVME166, MVME167, MVME172, and MVME177.  BVME4000 and
+  BVME6000 boards from BVM Ltd are also supported.
+
+MVME147 support
+CONFIG_MVME147
+  Say Y to include support for early Motorola VME boards.  This will
+  build a kernel which can run on MVME147 single-board computers.  If
+  you select this option you will have to select the appropriate
+  drivers for SCSI, Ethernet and serial ports later on.
+
+MVME162, 166 and 167 support
+CONFIG_MVME16x
+  Say Y to include support for Motorola VME boards.  This will build a
+  kernel which can run on MVME162, MVME166, MVME167, MVME172, and
+  MVME177 boards.  If you select this option you will have to select
+  the appropriate drivers for SCSI, Ethernet and serial ports later
+  on.
+
+BVME4000 and BVME6000 support
+CONFIG_BVME6000
+  Say Y to include support for VME boards from BVM Ltd.  This will
+  build a kernel which can run on BVME4000 and BVME6000 boards.  If
+  you select this option you will have to select the appropriate
+  drivers for SCSI, Ethernet and serial ports later on.
+
+Use write-through caching for 68060 supervisor accesses
+CONFIG_060_WRITETHROUGH
+  The 68060 generally uses copyback caching of recently accessed data.
+  Copyback caching means that memory writes will be held in an on-chip
+  cache and only written back to memory some time later.  Saying Y
+  here will force supervisor (kernel) accesses to use writethrough
+  caching.  Writethrough caching means that data is written to memory
+  straight away, so that cache and memory data always agree.
+  Writethrough caching is less efficient, but is needed for some
+  drivers on 68060 based systems where the 68060 bus snooping signal
+  is hardwired on.  The 53c710 SCSI driver is known to suffer from
+  this problem.
+
+WD33C93 SCSI driver for MVME147
+CONFIG_MVME147_SCSI
+  Support for the on-board SCSI controller on the Motorola MVME147
+  single-board computer.
+
+SCC support for MVME147 serial ports
+CONFIG_MVME147_SCC
+  This is the driver for the serial ports on the Motorola MVME147
+  boards.  Everyone using one of these boards should say Y here.
+
+NCR53C710 SCSI driver for MVME16x
+CONFIG_MVME16x_SCSI
+  The Motorola MVME162, 166, 167, 172 and 177 boards use the NCR53C710
+  SCSI controller chip.  Almost everyone using one of these boards
+  will want to say Y to this question.
+
+NCR53C710 SCSI driver for BVME6000
+CONFIG_BVME6000_SCSI
+  The BVME4000 and BVME6000 boards from BVM Ltd use the NCR53C710
+  SCSI controller chip.  Almost everyone using one of these boards
+  will want to say Y to this question.
+
+MVME147 (Lance) Ethernet support
+CONFIG_MVME147_NET
+  Support for the on-board Ethernet interface on the Motorola MVME147
+  single-board computer.  Say Y here to include the
+  driver for this chip in your kernel.   If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+MVME16x Ethernet support
+CONFIG_MVME16x_NET
+  This is the driver for the Ethernet interface on the Motorola
+  MVME162, 166, 167, 172 and 177 boards.  Say Y here to include the
+  driver for this chip in your kernel.   If you want to compile it as
+  a module, say M here and read <file:Documentation/modules.txt>.
+
+BVME6000 Ethernet support
+CONFIG_BVME6000_NET
+  This is the driver for the Ethernet interface on BVME4000 and
+  BVME6000 VME boards.  Say Y here to include the driver for this chip
+  in your kernel.   If you want to compile it as a module, say M here
+  and read <file:Documentation/modules.txt>.
+
+CD2401 support for MVME166/7 serial ports
+CONFIG_SERIAL167
+  This is the driver for the serial ports on the Motorola MVME166,
+  167, and 172 boards.  Everyone using one of these boards should say
+  Y here.
+
+SCC support for MVME162 serial ports
+CONFIG_MVME162_SCC
+  This is the driver for the serial ports on the Motorola MVME162 and
+  172 boards.  Everyone using one of these boards should say Y here.
+
+SCC support for BVME6000 serial ports
+CONFIG_BVME6000_SCC
+  This is the driver for the serial ports on the BVME4000 and BVME6000
+  boards from BVM Ltd.  Everyone using one of these boards should say
+  Y here.
+
+7-Segment Display support
+CONFIG_DISPLAY7SEG
+  This is the driver for the 7-segment display and LED present on
+  Sun Microsystems CompactPCI models CP1400 and CP1500.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called display7seg.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+  If you do not have a CompactPCI model CP1400 or CP1500, or
+  another UltraSPARC-IIi-cEngine boardset with a 7-segment display,
+  you should say N to this option.
+
+# Choice: cristype
+Etrax-100-LX-v1
+CONFIG_ETRAX100LX
+  Support version 1 of the Etrax 100LX.
+
+Etrax-100-LX-v2
+CONFIG_ETRAX100LX_V2
+  Support version 2 of the Etrax 100LX.
+
+Etrax-100-LX-for-xsim-simulator
+CONFIG_SVINTO_SIM
+  Support the xsim ETRAX Simulator.
+
+DRAM size (dec, in MB)
+CONFIG_ETRAX_DRAM_SIZE
+  Size of DRAM (decimal in MB) typically 2, 8 or 16.
+
+ETRAX Flash Memory configuration
+CONFIG_ETRAX_FLASH_BUSWIDTH
+  Width in bytes of the Flash bus (1, 2 or 4). Is usually 2.
+
+# Choice: crisleds
+LED configuration on PA
+CONFIG_ETRAX_PA_LEDS
+  The Etrax network driver is responsible for flashing LED's when
+  packets arrive and are sent.  It uses macros defined in
+  <file:include/asm-cris/io.h>, and those macros are defined after what
+  YOU choose in this option.  The actual bits used are configured
+  separately.  Select this if the LEDs are on port PA.  Some products
+  put the leds on PB or a memory-mapped latch (CSP0) instead.
+
+LED configuration on PB
+CONFIG_ETRAX_PB_LEDS
+  The Etrax network driver is responsible for flashing LED's when
+  packets arrive and are sent.  It uses macros defined in
+  <file:include/asm-cris/io.h>, and those macros are defined after what
+  YOU choose in this option.  The actual bits used are configured
+  separately.  Select this if the LEDs are on port PB.  Some products
+  put the leds on PA or a memory-mapped latch (CSP0) instead.
+
+LED configuration on CSP0
+CONFIG_ETRAX_CSP0_LEDS
+  The Etrax network driver is responsible for flashing LED's when
+  packets arrive and are sent. It uses macros defined in
+  <file:include/asm-cris/io.h>, and those macros are defined after what
+  YOU choose in this option.  The actual bits used are configured
+  separately.  Select this if the LEDs are on a memory-mapped latch
+  using chip select CSP0, this is mapped at 0x90000000.
+  Some products put the leds on PA or PB instead.
+
+No LED at all
+CONFIG_ETRAX_NO_LEDS
+  Select this option if you don't have any LED at all.
+
+First green LED bit
+CONFIG_ETRAX_LED1G
+  Bit to use for the first green LED.
+  Most Axis products use bit 2 here.
+
+First red LED bit
+CONFIG_ETRAX_LED1R
+  Bit to use for the first red LED.
+  Most Axis products use bit 3 here.
+  For products with only one controllable LED,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Second green LED bit
+CONFIG_ETRAX_LED2G
+  Bit to use for the second green LED. The "Active" LED.
+  Most Axis products use bit 4 here.
+  For products with only one controllable LED,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Second red LED bit
+CONFIG_ETRAX_LED2R
+  Bit to use for the second red LED.
+  Most Axis products use bit 5 here.
+  For products with only one controllable LED,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Third green LED bit
+CONFIG_ETRAX_LED3G
+  Bit to use for the third green LED. The "Drive" LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Third red LED bit
+CONFIG_ETRAX_LED3R
+  Bit to use for the third red LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Fourth green LED bit
+CONFIG_ETRAX_LED4G
+  Bit to use for the fourth green LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Fourth red LED bit
+CONFIG_ETRAX_LED4R
+  Bit to use for the fourth red LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Fifth green LED bit
+CONFIG_ETRAX_LED5G
+  Bit to use for the fifth green LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Fifth red LED bit
+CONFIG_ETRAX_LED5R
+  Bit to use for the fifth red LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Sixth green LED bit
+CONFIG_ETRAX_LED6G
+  Bit to use for the sixth green LED. The "Drive" LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Sixth red LED bit
+CONFIG_ETRAX_LED6R
+  Bit to use for the sixth red LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Seventh green LED bit
+CONFIG_ETRAX_LED7G
+  Bit to use for the seventh green LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Seventh red LED bit
+CONFIG_ETRAX_LED7R
+  Bit to use for the seventh red LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Eighth yellow LED bit
+CONFIG_ETRAX_LED8Y
+  Bit to use for the eighth yellow LED. The "Drive" LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Ninth yellow LED bit
+CONFIG_ETRAX_LED9Y
+  Bit to use for the ninth yellow LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Tenth yellow LED bit
+CONFIG_ETRAX_LED10Y
+  Bit to use for the tenth yellow LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Eleventh yellow LED bit
+CONFIG_ETRAX_LED11Y
+  Bit to use for the eleventh yellow LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Twelfth red LED bit
+CONFIG_ETRAX_LED12R
+  Bit to use for the twelfth red LED.
+  For products with only one or two controllable LEDs,
+  set this to same as CONFIG_ETRAX_LED1G (normally 2).
+
+Flash LED off during activity
+CONFIG_ETRAX_LED_OFF_DURING_ACTIVITY
+  This option allows you to decide whether the network LED (and
+  Bluetooth LED in case you use Bluetooth) will be on or off when
+  the network is connected, and whether it should flash off or on
+  when there is activity. If you say y to this option the network
+  LED will be lit when there is a connection, and will flash off
+  when there is activity.
+
+PA button configuration
+CONFIG_ETRAX_PA_BUTTON_BITMASK
+  This is a bitmask with information about what bits on PA that
+  are used for buttons.
+  Most products has a so called TEST button on PA1, if that's true
+  use 02 here.
+  Use 00 if there are no buttons on PA.
+  If the bitmask is <> 00 a button driver will be included in the gpio
+  driver. Etrax general I/O support must be enabled.
+
+PA changeable direction bits
+CONFIG_ETRAX_PA_CHANGEABLE_DIR
+  This is a bitmask with information of what bits in PA that a user
+  can change direction on using ioctl's.
+  Bit set = changeable.
+  You probably want 00 here.
+
+PA changeable data bits
+CONFIG_ETRAX_PA_CHANGEABLE_BITS
+  This is a bitmask with information of what bits in PA that a user
+  can change change the value on using ioctl's.
+  Bit set = changeable.
+  You probably want 00 here.
+
+PA changeable direction bits
+CONFIG_ETRAX_PB_CHANGEABLE_DIR
+  This is a bitmask with information of what bits in PB that a user
+  can change direction on using ioctl's.
+  Bit set = changeable.
+  You probably want 00 here.
+
+PB changeable data bits
+CONFIG_ETRAX_PB_CHANGEABLE_BITS
+  This is a bitmask with information of what bits in PB that a user
+  can change the value on using ioctl's.
+  Bit set = changeable.
+  You probably want 00 here.
+
+Kernel debugger (kgdb)
+CONFIG_ETRAX_KGDB
+  The CRIS version of gdb can be used to remotely debug a running
+  Linux kernel via the serial debug port.  Provided you have gdb-cris
+  installed, run gdb-cris vmlinux, then type
+
+  (gdb) set remotebaud 115200           <- kgdb uses 115200 as default
+  (gdb) target remote /dev/ttyS0        <- maybe you use another port
+
+  This should connect you to your booted kernel (or boot it now if you
+  didn't before).  The kernel halts when it boots, waiting for gdb if
+  this option is turned on!
+
+Etrax bus waitstates
+CONFIG_ETRAX_DEF_R_WAITSTATES
+  Waitstates for SRAM, Flash and peripherals (not DRAM).  95f8 is a
+  good choice for most Axis products...
+
+Etrax bus configuration
+CONFIG_ETRAX_DEF_R_BUS_CONFIG
+  Assorted bits controlling write mode, DMA burst length etc.  104 is
+  a good choice for most Axis products...
+
+Etrax SDRAM configuration
+CONFIG_ETRAX_SDRAM
+  Enable this if you use SDRAM chips and configure
+  R_SDRAM_CONFIG and R_SDRAM_TIMING as well.
+
+DRAM size (dec, in MB)
+CONFIG_ETRAX_DEF_R_DRAM_CONFIG
+  The R_DRAM_CONFIG register specifies everything on how the DRAM
+  chips in the system are connected to the Etrax CPU.  This is
+  different depending on the manufacturer, chip type and number of
+  chips.  So this value often needs to be different for each Axis
+  product.
+
+Etrax DRAM timing
+CONFIG_ETRAX_DEF_R_DRAM_TIMING
+  Different DRAM chips have different speeds.  Current Axis products
+  use 50ns DRAM chips which can use the timing: 5611.
+
+Etrax SDRAM configuration
+CONFIG_ETRAX_DEF_R_SDRAM_CONFIG
+  The R_SDRAM_CONFIG register specifies everything on how the SDRAM
+  chips in the system are connected to the Etrax CPU.  This is
+  different depending on the manufacturer, chip type and number of
+  chips.  So this value often needs to be different for each Axis
+  product.
+
+Etrax SDRAM timing
+CONFIG_ETRAX_DEF_R_SDRAM_TIMING
+  Different SDRAM chips have different timing.
+
+Etrax General port A direction
+CONFIG_ETRAX_DEF_R_PORT_PA_DIR
+  Configures the direction of general port A bits.  1 is out, 0 is in.
+  This is often totally different depending on the product used.
+  There are some guidelines though - if you know that only LED's are
+  connected to port PA, then they are usually connected to bits 2-4
+  and you can therefore use 1c.  On other boards which don't have the
+  LED's at the general ports, these bits are used for all kinds of
+  stuff.  If you don't know what to use, it is always safe to put all
+  as inputs, although floating inputs isn't good.
+
+Etrax General port A data
+CONFIG_ETRAX_DEF_R_PORT_PA_DATA
+  Configures the initial data for the general port A bits.  Most
+  products should use 00 here.
+
+Etrax General port B config
+CONFIG_ETRAX_DEF_R_PORT_PB_CONFIG
+  Configures the type of the general port B bits.  1 is chip select,
+  0 is port.  Most products should use 00 here.
+
+Etrax General port B direction
+CONFIG_ETRAX_DEF_R_PORT_PB_DIR
+  Configures the direction of general port B bits. 1 is out, 0 is in.
+  This is often totally different depending on the product used.  Bits
+  0 and 1 on port PB are usually used for I2C communication, but the
+  kernel I2C driver sets the appropriate directions itself so you
+  don't need to take that into consideration when setting this option.
+  If you don't know what to use, it is always safe to put all as
+  inputs.
+
+Etrax General port B data
+CONFIG_ETRAX_DEF_R_PORT_PB_DATA
+  Configures the initial data for the general port A bits.  Most
+  products should use FF here.
+
+Etrax General port device
+CONFIG_ETRAX_GPIO
+  Enables the Etrax general port device (major 120, minors 0 and 1).
+  You can use this driver to access the general port bits. It supports
+  these ioctl's:
+        #include <linux/etraxgpio.h>
+       fd = open("/dev/gpioa", O_RDWR); // or /dev/gpiob
+       ioctl(fd, _IO(ETRAXGPIO_IOCTYPE, IO_SETBITS), bits_to_set);
+       ioctl(fd, _IO(ETRAXGPIO_IOCTYPE, IO_CLRBITS), bits_to_clear);
+       val = ioctl(fd, _IO(ETRAXGPIO_IOCTYPE, IO_READBITS), NULL);
+  Remember that you need to setup the port directions appropriately in
+  the General configuration.
+
+Etrax parallel data support
+CONFIG_ETRAX_PARDATA
+  Adds support for writing data to the parallel port par0 of the ETRAX
+  100.  If you create a character special file with major number 126,
+  you can write to the data bits of par0.
+  Note: you need to disable Etrax100 parallel port support.
+
+Etrax parallel LCD (HD44780) Driver
+CONFIG_ETRAX_LCD_HD44780
+  Adds support for a HD44780 controlled LCD connected to the parallel
+  port par0 of the Etrax.
+
+Etrax Serial port ser0 support
+CONFIG_ETRAX_SERIAL
+  Enables the ETRAX 100 serial driver for ser0 (ttyS0)
+  You probably want this enabled.
+
+/proc/serial entry
+CONFIG_ETRAX_SERIAL_PROC_ENTRY
+  Enables /proc/serial entry where errors and statistics can be
+  viewed.  CONFIG_PROC_FS must also be set for this to work.
+
+Etrax Serial port fast flush of DMA using fast timer API
+CONFIG_ETRAX_SERIAL_FAST_TIMER
+  Select this to have the serial DMAs flushed at a higher rate than
+  normally, possible by using the fast timer API, the timeout is
+  approx. 4 character times.
+  If unsure, say N.
+
+Etrax Serial port fast flush of DMA
+CONFIG_ETRAX_SERIAL_FLUSH_DMA_FAST
+  Select this to have the serial DMAs flushed at a higher rate than
+  normally possible through a fast timer interrupt (currently at
+  15360 Hz).
+  If unsure, say N.
+
+Etrax Serial port receive flush timeout
+CONFIG_ETRAX_SERIAL_RX_TIMEOUT_TICKS
+  Number of timer ticks between flush of receive fifo (1 tick = 10ms).
+  Try 0-3 for low latency applications.  Approx 5 for high load
+  applications (e.g. PPP).  Maybe this should be more adaptive some
+  day...
+
+Etrax Serial port ser0 DTR, RI, DSR and CD support on PB
+CONFIG_ETRAX_SER0_DTR_RI_DSR_CD_ON_PB
+  Enables the status and control signals DTR, RI, DSR and CD on PB for
+  ser0.
+
+Serial port 1 enabled
+CONFIG_ETRAX_SERIAL_PORT1
+  Enables the ETRAX 100 serial driver for ser1 (ttyS1).
+
+Etrax Serial port ser1 DTR, RI, DSR and CD support on PB
+CONFIG_ETRAX_SER1_DTR_RI_DSR_CD_ON_PB
+  Enables the status and control signals DTR, RI, DSR and CD on PB for
+  ser1.
+
+Serial port 2 enabled
+CONFIG_ETRAX_SERIAL_PORT2
+  Enables the ETRAX 100 serial driver for ser2 (ttyS2).
+
+Etrax Serial port ser2 DTR, RI, DSR and CD support on PA
+CONFIG_ETRAX_SER2_DTR_RI_DSR_CD_ON_PA
+  Enables the status and control signals DTR, RI, DSR and CD on PA for
+  ser2.
+
+Serial port 3 enabled
+CONFIG_ETRAX_SERIAL_PORT3
+  Enables the ETRAX 100 serial driver for ser3 (ttyS3).
+
+Etrax100 RS-485 support
+CONFIG_ETRAX_RS485
+  Enables support for RS-485 serial communication.  For a primer on
+  RS-485, see <http://www.hw.cz/english/docs/rs485/rs485.html>.
+
+Etrax100 RS-485 mode on PA
+CONFIG_ETRAX_RS485_ON_PA
+  Control Driver Output Enable on RS485 transceiver using a pin on PA
+  port:
+          Axis 2400/2401 uses PA 3.
+
+Etrax100 RS-485 mode on PA bit
+CONFIG_ETRAX_RS485_ON_PA_BIT
+  Control Driver Output Enable on RS485 transceiver using a this bit
+  on PA port.
+
+Ser0 DTR on PB bit
+CONFIG_ETRAX_SER0_DTR_ON_PB_BIT
+  Specify the pin of the PB port to carry the DTR signal for serial
+  port 0.
+
+Ser0 RI  on PB bit
+CONFIG_ETRAX_SER0_RI_ON_PB_BIT
+  Specify the pin of the PB port to carry the RI signal for serial
+  port 0.
+
+Ser0 DSR on PB bit
+CONFIG_ETRAX_SER0_DSR_ON_PB_BIT
+  Specify the pin of the PB port to carry the DSR signal for serial
+  port 0.
+
+Ser0 CD  on PB bit
+CONFIG_ETRAX_SER0_CD_ON_PB_BIT
+  Specify the pin of the PB port to carry the CD signal for serial
+  port 0.
+
+Ser1 DTR on PB bit
+CONFIG_ETRAX_SER1_DTR_ON_PB_BIT
+  Specify the pin of the PB port to carry the DTR signal for serial
+  port 1.
+
+Ser1 RI  on PB bit
+CONFIG_ETRAX_SER1_RI_ON_PB_BIT
+  Specify the pin of the PB port to carry the RI signal for serial
+  port 1.
+
+Ser1 DSR on PB bit
+CONFIG_ETRAX_SER1_DSR_ON_PB_BIT
+  Specify the pin of the PB port to carry the DSR signal for serial
+  port 1.
+
+Ser1 CD  on PB bit
+CONFIG_ETRAX_SER1_CD_ON_PB_BIT
+  Specify the pin of the PB port to carry the CD signal for serial
+  port 1.
+
+Ser2 DTR on PA bit
+CONFIG_ETRAX_SER2_DTR_ON_PA_BIT
+  Specify the pin of the PA port to carry the DTR signal for serial
+  port 2.
+
+Ser2 RI  on PA bit
+CONFIG_ETRAX_SER2_RI_ON_PA_BIT
+  Specify the pin of the PA port to carry the RI signal for serial
+  port 2.
+
+Ser2 DSR on PA bit
+CONFIG_ETRAX_SER2_DSR_ON_PA_BIT
+  Specify the pin of the PA port to carry the DTR signal for serial
+  port 2.
+
+Ser2 CD  on PA bit
+CONFIG_ETRAX_SER2_CD_ON_PA_BIT
+  Specify the pin of the PA port to carry the CD signal for serial
+  port 2.
+
+Etrax100 RS-485 disable receiver
+CONFIG_ETRAX_RS485_DISABLE_RECEIVER
+  It's necessary to disable the serial receiver to avoid serial
+  loopback.  Not all products are able to do this in software only.
+  Axis 2400/2401 must disable receiver.
+
+Etrax100 I2C Support
+CONFIG_ETRAX_I2C
+  Enables an I2C driver on PB0 and PB1 on ETRAX100.
+  EXAMPLE usage:
+        i2c_arg = I2C_WRITEARG(STA013_WRITE_ADDR, reg, val);
+       ioctl(fd, _IO(ETRAXI2C_IOCTYPE, I2C_WRITEREG), i2c_arg);
+       i2c_arg = I2C_READARG(STA013_READ_ADDR, reg);
+       val = ioctl(fd, _IO(ETRAXI2C_IOCTYPE, I2C_READREG), i2c_arg);
+
+Etrax100 I2C configuration
+CONFIG_ETRAX_I2C_USES_PB_NOT_PB_I2C
+  Select whether to use the special I2C mode in the PB I/O register or
+  not.  This option needs to be selected in order to use some drivers
+  that access the I2C I/O pins directly instead of going through the
+  I2C driver, like the DS1302 realtime-clock driver.  If you are
+  uncertain, choose Y here.
+
+Etrax100 I2C EEPROM (NVRAM) support
+CONFIG_ETRAX_I2C_EEPROM
+  Enables I2C EEPROM (non-volatile RAM) on PB0 and PB1 using the I2C
+  driver.  Select size option: Probed, 2k, 8k, 16k.
+  (Probing works for 2k and 8k but not that well for 16k)
+
+Etrax100 I2C EEPROM (NVRAM) size/16kB
+CONFIG_ETRAX_I2C_EEPROM_16KB
+  Use a 16kB EEPROM.
+
+Etrax100 I2C EEPROM (NVRAM) size/2kB
+CONFIG_ETRAX_I2C_EEPROM_2KB
+  Use a 2kB EEPROM.
+
+Etrax100 I2C EEPROM (NVRAM) size/8kB
+CONFIG_ETRAX_I2C_EEPROM_8KB
+  Use a 8kB EEPROM.
+
+# Choice: etrax_eeprom
+Etrax100 I2C EEPROM (NVRAM) size/probe
+CONFIG_ETRAX_I2C_EEPROM_PROBE
+  Specifies size or auto probe of the EEPROM size.
+  Options: Probed, 2k, 8k, 16k.
+  (Probing works for 2k and 8k but not that well for 16k)
+
+Etrax DS1302 Real-Time Clock driver
+CONFIG_ETRAX_DS1302
+  Enables the driver for the DS1302 Real-Time Clock battery-backed
+  chip on some products.  The kernel reads the time when booting, and
+  the date can be set using ioctl(fd, RTC_SET_TIME, &rt) with rt a
+  rtc_time struct (see <file:include/asm-cris/rtc.h>) on the /dev/rtc
+  device, major 121.  You can check the time with cat /proc/rtc, but
+  normal time reading should be done using libc function time and
+  friends.
+
+Etrax DS1302 RST on the Generic Port
+CONFIG_ETRAX_DS1302_RST_ON_GENERIC_PORT
+  If your product has the RST signal line for the DS1302 RTC on the
+  Generic Port then say Y here, otherwise leave it as N in which
+  case the RST signal line is assumed to be connected to Port PB
+  (just like the SCL and SDA lines).
+
+Etrax DS1302 RST bit number
+CONFIG_ETRAX_DS1302_RSTBIT
+  This is the bit number for the RST signal line of the DS1302 RTC on
+  the selected port. If you have selected the generic port then it
+  should be bit 27, otherwise your best bet is bit 5.
+
+Etrax DS1302 SCL bit number
+CONFIG_ETRAX_DS1302_SCLBIT
+  This is the bit number for the SCL signal line of the DS1302 RTC on
+  Port PB. This is probably best left at 3.
+
+Etrax DS1302 SDA bit number
+CONFIG_ETRAX_DS1302_SDABIT
+  This is the bit number for the SDA signal line of the DS1302 RTC on
+  Port PB. This is probably best left at 2.
+
+Etrax 100 IDE Reset
+CONFIG_ETRAX_IDE_CSP0_8_RESET
+  Configures the pin used to reset the IDE bus.
+
+Etrax 100 IDE Reset
+CONFIG_ETRAX_IDE_CSPE1_16_RESET
+  Configures the pin used to reset the IDE bus.
+
+Delay for drives to regain consciousness
+CONFIG_ETRAX_IDE_DELAY
+  Sets the time to wait for disks to regain consciousness after reset.
+
+Etrax 100 IDE Reset
+CONFIG_ETRAX_IDE_G27_RESET
+  Configures the pin used to reset the IDE bus.
+
+# Choice: ide_reset
+IDE reset on PB Bit 7
+CONFIG_ETRAX_IDE_PB7_RESET
+  Configures the pin used to reset the IDE bus.
+
+USB 1.1 host
+CONFIG_ETRAX_USB_HOST
+  This option enables the host functionality of the ETRAX 100LX
+  built-in USB controller. In host mode the controller is designed
+  for CTRL and BULK traffic only, INTR traffic may work as well
+  however (depending on the requirements of timeliness).
+
+USB 1.1 host port 1 enabled
+CONFIG_ETRAX_USB_HOST_PORT1
+  This option enables port 1 of the ETRAX 100LX USB root hub (RH).
+
+USB 1.1 host port 2 enabled
+CONFIG_ETRAX_USB_HOST_PORT2
+  This option enables port 2 of the ETRAX 100LX USB root hub (RH).
+
+ETRAX 100LX 10/100Mbit Ethernet controller
+CONFIG_ETRAX_ETHERNET
+  This option enables the ETRAX 100LX built-in 10/100Mbit Ethernet
+  controller.
+
+ETRAX 100LX Synchronous serial ports
+CONFIG_ETRAX_SYNCHRONOUS_SERIAL
+  This option enables support for the ETRAX 100LX built-in
+  synchronous serial ports. These ports are used for continuous
+  streamed data like audio. The default setting is compatible
+  with the STA 013 MP3 decoder, but can easily be tuned to fit
+  any other audio encoder/decoder and SPI.
+
+ETRAX 100LX Synchronous serial port 0 enabled
+CONFIG_ETRAX_SYNCHRONOUS_SERIAL_PORT0
+  Enables the ETRAX 100LX synchronous serial port 0 (syncser0).
+
+ETRAX 100LX Synchronous serial port 0 uses DMA
+CONFIG_ETRAX_SYNCHRONOUS_SERIAL0_DMA
+  Makes synchronous serial port 0 use DMA.
+
+ETRAX 100LX Synchronous serial port 1 enabled
+CONFIG_ETRAX_SYNCHRONOUS_SERIAL_PORT1
+  Enables the ETRAX 100LX synchronous serial port 1 (syncser1).
+
+ETRAX 100LX Synchronous serial port 1 uses DMA
+CONFIG_ETRAX_SYNCHRONOUS_SERIAL1_DMA
+  Makes synchronous serial port 1 use DMA.
+
+Delay for drives to regain consciousness
+CONFIG_IDE_DELAY
+  Number of seconds to wait for IDE drives to spin up after an IDE
+  reset.
+
+ARTPEC-1 support
+CONFIG_JULIETTE
+  The ARTPEC-1 is a video-compression chip used in the AXIS 2100
+  network camera, which is built around an ETRAX-100 board.  With this
+  option selected, the ETRAX kernel configures a DMA channel at boot
+  time to talk to the chip.
+
+Axis flash-map support
+CONFIG_ETRAX_AXISFLASHMAP
+  This option enables MTD mapping of flash devices.  Needed to use
+  flash memories.  If unsure, say Y.
+
+Byte-offset of partition table sector
+CONFIG_ETRAX_PTABLE_SECTOR
+  Byte-offset of the partition table in the first flash chip.
+  The default value is 64kB and should not be changed unless
+  you know exactly what you are doing. The only valid reason
+  for changing this is when the flash block size is bigger
+  than 64kB (e.g. when using two parallel 16 bit flashes).
+
+Enable Etrax100 watchdog
+CONFIG_ETRAX_WATCHDOG
+  Enable the built-in watchdog timer support on Etrax100 embedded
+  network computers.
+
+# Choice: crisdebug
+Serial-0
+CONFIG_ETRAX_DEBUG_PORT0
+  Choose a serial port for the ETRAX debug console.  Default to
+  port 0.
+
+Etrax debug port on ser1
+CONFIG_ETRAX_DEBUG_PORT1
+  Use serial port 1 for the console.
+
+Etrax debug port on ser2
+CONFIG_ETRAX_DEBUG_PORT2
+  Use serial port 2 for the console.
+
+Etrax debug port on ser3
+CONFIG_ETRAX_DEBUG_PORT3
+  Use serial port 3 for the console.
+
+No Etrax debug port
+CONFIG_ETRAX_DEBUG_PORT_NULL
+  Disable serial-port debugging.
+
+Parallel port support
+CONFIG_ETRAX_PARPORT
+  Say Y here to enable the ETRAX on-board parallel ports.
+
+Parallel port 0 enabled
+CONFIG_ETRAX_PARALLEL_PORT0
+  Say Y here to enable parallel port 0.
+
+Parallel port 1 enabled
+CONFIG_ETRAX_PARALLEL_PORT1
+  Say Y here to enable parallel port 1.
+
+# Choice: crisrescue
+Select a product rescue port
+CONFIG_ETRAX_RESCUE_SER0
+  Select one of the four serial ports as a rescue port.  The default
+  is port 0.
+
+Serial-1
+CONFIG_ETRAX_RESCUE_SER1
+  Use serial port 1 as the rescue port.
+
+Serial-2
+CONFIG_ETRAX_RESCUE_SER2
+  Use serial port 2 as the rescue port.
+
+Serial-3
+CONFIG_ETRAX_RESCUE_SER3
+  Use serial port 3 as the rescue port.
+
+RIO Hardware Watchdog support
+CONFIG_WATCHDOG_RIO
+  Say Y here to support the hardware watchdog capability on Sun RIO
+  machines.  The watchdog timeout period is normally one minute but
+  can be changed with a boot-time parameter.
+
+CP1XXX Hardware Watchdog support
+CONFIG_WATCHDOG_CP1XXX
+  This is the driver for the hardware watchdog timers present on
+  Sun Microsystems CompactPCI models CP1400 and CP1500.
+
+  This driver is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called cpwatchdog.o. If you want to compile it
+  as a module, say M here and read <file:Documentation/modules.txt>.
+
+  If you do not have a CompactPCI model CP1400 or CP1500, or
+  another UltraSPARC-IIi-cEngine boardset with hardware watchdog,
+  you should say N to this option.
+
+# Choice: ia64type
+Itanium
+CONFIG_ITANIUM
+  Select your IA64 processor type.  The default is Intel Itanium.
+
+McKinley
+CONFIG_MCKINLEY
+  Select this to configure for a McKinley processor.
+
+# Choice: ia64system
+IA-64 system type
+CONFIG_IA64_GENERIC
+  This selects the system type of your hardware.  A "generic" kernel
+  will run on any supported IA-64 system.  However, if you configure
+  a kernel for your specific system, it will be faster and smaller.
+
+  To find out what type of IA-64 system you have, you may want to
+  check the IA-64 Linux web site at <http://www.linux-ia64.org/>.
+  As of the time of this writing, most hardware is DIG compliant,
+  so the "DIG-compliant" option is usually the right choice.
+
+  HP-simulator   For the HP simulator (<http://software.hp.com/ia64linux/>).
+  HP-zx1        For HP zx1 Platforms.
+  SN1            For SGI SN1 Platforms.
+  SN2            For SGI SN2 Platforms.
+  DIG-compliant  For DIG ("Developer's Interface Guide") compliant systems.
+
+  If you don't know what to do, choose "generic".
+
+CONFIG_IA64_HP_ZX1
+  Build a kernel that runs on HP zx1-based systems.  This adds support
+  for the zx1 IOMMU and makes root bus bridges appear in PCI config space
+  (required for zx1 agpgart support).
+
+# Choice: pagesize
+Kernel page size
+CONFIG_IA64_PAGE_SIZE_4KB
+  This lets you select the page size of the kernel.  For best IA-64
+  performance, a page size of 8KB or 16KB is recommended.  For best
+  IA-32 compatibility, a page size of 4KB should be selected (the vast
+  majority of IA-32 binaries work perfectly fine with a larger page
+  size).  For Itanium systems, do NOT chose a page size larger than
+  16KB.
+
+  4KB                For best IA-32 compatibility
+  8KB                For best IA-64 performance
+  16KB               For best IA-64 performance
+  64KB               Not for Itanium.
+
+  If you don't know what to do, choose 8KB.
+
+Enable Itanium B-step specific code
+CONFIG_ITANIUM_BSTEP_SPECIFIC
+  Select this option to build a kernel for an Itanium prototype system
+  with a B-step CPU.  Only B3 step CPUs are supported.  You have a B3-step
+  CPU if the "revision" field in /proc/cpuinfo is equal to 4.  If the
+  "revision" field shows a number bigger than 4, you do not have to turn
+  on this option.
+
+Enable IA-64 Machine Check Abort
+CONFIG_IA64_MCA
+  Say Y here to enable machine check support for IA-64.  If you're
+  unsure, answer Y.
+
+Disable IA-64 Virtual Hash Page Table
+CONFIG_DISABLE_VHPT
+  The Virtual Hash Page Table (VHPT) enhances virtual address
+  translation performance.  Normally you want the VHPT active but you
+  can select this option to disable the VHPT for debugging.  If you're
+  unsure, answer N.
+
+Turn on compare-and-exchange bug checking (slow!)
+CONFIG_IA64_DEBUG_CMPXCHG
+  Selecting this option turns on bug checking for the IA64
+  compare-and-exchange instructions.  This is slow!  Itaniums
+  from step B3 or later don't have this problem. If you're unsure,
+  select N.
+
+IA64 IRQ bug checking
+CONFIG_IA64_DEBUG_IRQ
+  Selecting this option turns on bug checking for the IA64 irq_save
+  and restore instructions.  It's useful for tracking down spinlock
+  problems, but slow!  If you're unsure, select N.
+
+Early printk support (requires VGA!)
+CONFIG_IA64_EARLY_PRINTK
+  Selecting this option uses the VGA screen for printk() output before
+  the consoles are initialised.  It is useful for debugging problems
+  early in the boot process, but only if you have a VGA screen
+  attached.  If you're unsure, select N.
+
+Print possible IA64 hazards to console
+CONFIG_IA64_PRINT_HAZARDS
+  Selecting this option prints more information for Illegal Dependency
+  Faults, that is, for Read after Write, Write after Write or Write
+  after Read violations.  If you're unsure, select Y.
+
+Performance monitor support
+CONFIG_PERFMON
+  Selects whether support for the IA-64 performance monitor hardware
+  is included in the kernel.  This makes some kernel data-structures a
+  little bigger and slows down execution a bit, but it is still
+  usually a good idea to turn this on.  If you're unsure, say N.
+
+/proc/pal support
+CONFIG_IA64_PALINFO
+  If you say Y here, you are able to get PAL (Processor Abstraction
+  Layer) information in /proc/pal.  This contains useful information
+  about the processors in your systems, such as cache and TLB sizes
+  and the PAL firmware version in use.
+
+  To use this option, you have to check that the "/proc file system
+  support" (CONFIG_PROC_FS) is enabled, too.
+
+/proc/efi/vars support
+CONFIG_EFI_VARS
+  If you say Y here, you are able to get EFI (Extensible Firmware
+  Interface) variable information in /proc/efi/vars.  You may read,
+  write, create, and destroy EFI variables through this interface.
+
+  To use this option, you have to check that the "/proc file system
+  support" (CONFIG_PROC_FS) is enabled, too.
+
+Kernel support for IA-32 emulation
+CONFIG_IA32_SUPPORT
+  IA64 processors can run IA32 (that is, x86) binaries by emulating
+  the IA32 instruction set.  Say Y here to build in kernel support for
+  this.  If in doubt, say Y.
+
+Physical memory granularity (16 MB)
+CONFIG_IA64_GRANULE_16MB
+  IA64 identity-mapped regions use a large page size.  We'll call such
+  large pages "granules".  If you can think of a better name that's
+  unambiguous, let us know...  Unless your identity-mapped regions are
+  very large, select a granule size of 16MB.
+
+Physical memory granularity (64 MB)
+CONFIG_IA64_GRANULE_64MB
+  IA64 identity-mapped regions use a large page size.  We'll call such
+  large pages "granules".  If you can think of a better name that's
+  unambiguous, let us know...  Unless your identity-mapped regions are
+  very large, select a granule size of 16MB.  (This is the "large" choice.)
+
+Enable SGI SN extra debugging code
+CONFIG_IA64_SGI_SN_DEBUG
+  Turns on extra debugging code in the SGI SN (Scalable NUMA) platform
+  for IA64.  Unless you are debugging problems on an SGI SN IA64 box,
+  say N.
+
+Enable SGI Medusa Simulator Support
+CONFIG_IA64_SGI_SN_SIM
+  If you are compiling a kernel that will run under SGI's IA64
+  simulator (Medusa) then say Y, otherwise say N.
+
+PCIBA Support
+CONFIG_PCIBA
+  IRIX PCIBA-inspired user mode PCI interface for the SGI SN (Scalable
+  NUMA) platform for IA64.  Unless you are compiling a kernel for an              SGI SN IA64 box, say N.
+
+Enable protocol mode for the L1 console
+SERIAL_SGI_L1_PROTOCOL
+  Uses protocol mode instead of raw mode for the level 1 console on the
+  SGI SN (Scalable NUMA) platform for IA64.  If you are compiling for
+  an SGI SN box then Y is the recommended value, otherwise say N.
+
+Directly Connected Compact Flash support
+CONFIG_CF_ENABLER
+  Compact Flash is a small, removable mass storage device introduced
+  in 1994 originally as a PCMCIA device.  If you say `Y' here, you
+  compile in support for Compact Flash devices directly connected to
+  a SuperH processor.  A Compact Flash FAQ is available at
+  <http://www.compactflash.org/faqs/faq.htm>.
+
+  If your board has "Directly Connected" CompactFlash at area 5 or 6,
+  you may want to enable this option.  Then, you can use CF as
+  primary IDE drive (only tested for SanDisk).
+
+  If in doubt, select 'N'.
+
+Kernel debugging
+CONFIG_DEBUG_KERNEL
+  Say Y here if you are developing drivers or trying to debug and
+  identify kernel problems.
+
+Debug memory allocations
+CONFIG_DEBUG_SLAB
+  Say Y here to have the kernel do limited verification on memory
+  allocation as well as poisoning memory on free to catch use of freed
+  memory.
+
+Memory mapped I/O debugging
+CONFIG_DEBUG_IOVIRT
+  Say Y here to get warned whenever an attempt is made to do I/O on
+  obviously invalid addresses such as those generated when ioremap()
+  calls are forgotten.  Memory mapped I/O will go through an extra
+  check to catch access to unmapped ISA addresses, an access method
+  that can still be used by old drivers that are being ported from
+  2.0/2.2.
+
+Spinlock debugging
+CONFIG_DEBUG_SPINLOCK
+  Say Y here and build SMP to catch missing spinlock initialization
+  and certain other kinds of spinlock errors commonly made.  This is
+  best used in conjunction with the NMI watchdog so that spinlock
+  deadlocks are also debuggable.
+
+Read-write spinlock debugging
+CONFIG_DEBUG_RWLOCK
+  If you say Y here then read-write lock processing will count how many
+  times it has tried to get the lock and issue an error message after
+  too many attempts.  If you suspect a rwlock problem or a kernel
+  hacker asks for this option then say Y.  Otherwise say N.
+
+Semaphore debugging
+CONFIG_DEBUG_SEMAPHORE
+  If you say Y here then semaphore processing will issue lots of
+  verbose debugging messages.  If you suspect a semaphore problem or a
+  kernel hacker asks for this option then say Y.  Otherwise say N.
+
+Verbose BUG() reporting (adds 70K)
+CONFIG_DEBUG_BUGVERBOSE
+  Say Y here to make BUG() panics output the file name and line number
+  of the BUG call as well as the EIP and oops trace.  This aids
+  debugging but costs about 70-100K of memory.
+
+Include kgdb kernel debugger
+CONFIG_KGDB
+  Include in-kernel hooks for kgdb, the Linux kernel source level
+  debugger.  This project has a web page at
+  <http://kgdb.sourceforge.net/>.
+
+Include xmon kernel debugger
+CONFIG_XMON
+  Include in-kernel hooks for the xmon kernel monitor/debugger
+  supported by the PPC port.
+
+Include BDI2000 debugger support
+CONFIG_BDI_SWITCH
+  Include in-kernel support for the Abatron BDI2000 debugger.  To
+  learn more about the Abatron BDI2000, visit the web page at
+  <http://www.abatron.ch/>.
+
+Add additional CFLAGS to the kernel build
+CONFIG_MORE_COMPILE_OPTIONS
+  If you want to add additional CFLAGS to the kernel build, such as
+  -g for KGDB, XMON or the BDI2000, enable this option and then
+  enter what you would like to add in the next question.
+
+Include kgdb kernel debugger
+CONFIG_KWDB
+  Include in-kernel hooks for kdb, the source level debugger for the
+  PA-RISC port.
+
+IODC console
+CONFIG_IODC_CONSOLE
+  IODC is HP's pre-PCI standard for device identification (a la PCI
+  vendor, device IDs), detection, configuration, initialization and so
+  on.  It also can provide firmware function to do the actual IO,
+  which are slow, not really defined for runtime usage and generally
+  not desirable.
+
+  See <http://www.linuxhq.com/kernel/v2.4/doc/parisc/IODC.txt.html>
+  for the gory details.
+
+  Say Y here to enable use of the IODC firmware functions for console
+  I/O.  This is only useful on older PA-RISC workstations.  If in
+  doubt, say Y.
+
+U2/Uturn I/O MMU
+CONFIG_IOMMU_CCIO
+  Say Y here to enable DMA management routines for the first
+  generation of PA-RISC cache-coherent machines.  Programs the
+  U2/Uturn chip in "Virtual Mode" and use the I/O MMU.
+
+LBA/Elroy PCI support
+CONFIG_PCI_LBA
+  Say Y here to give the PA-RISC kernel access to PCI configuration
+  and IO-port space on PA-RISC workstations equipped with a Lower Bus
+  Adapter (LBA).  This includes A, B, C, J, L, and N-class machines
+  with 4-digit model numbers, also the A300.
+
+LASI I/O support
+CONFIG_GSC_LASI
+  Say Y here to directly support the LASI controller chip found on
+  PA-RISC workstations.  Linux-oriented documentation for this chip
+  can be found at <http://www.parisc-linux.org/documentation/>.
+
+LASI/ASP builtin parallel-port
+CONFIG_PARPORT_GSC
+  Say Y here to build in low-level parallel-support for PC-style
+  hardware integrated in the LASI-Controller (on the GSC Bus) for
+  HP-PARISC workstations.
+
+Fujitsu Vendor Specific
+CONFIG_BLK_DEV_IDEDISK_FUJITSU
+  Enable vendor-specific code for Fujitsu IDE disks.  Unless you are
+  the IDE maintainer, you probably do not want to mess with this.
+
+IBM Vendor Specific
+CONFIG_BLK_DEV_IDEDISK_IBM
+  Enable vendor-specific code for IBM IDE disks.  Unless you are the
+  IDE maintainer, you probably do not want to mess with this.
+
+Maxtor Vendor Specific
+CONFIG_BLK_DEV_IDEDISK_MAXTOR
+  Enable vendor-specific code for Maxtor IDE disks.  Unless you are
+  the IDE maintainer, you probably do not want to mess with this.
+
+Quantum Vendor Specific
+CONFIG_BLK_DEV_IDEDISK_QUANTUM
+  Enable vendor-specific code for Quantum IDE disks.  Unless you are
+  the IDE maintainer, you probably do not want to mess with this.
+
+Seagate Vendor Specific
+CONFIG_BLK_DEV_IDEDISK_SEAGATE
+  Enable vendor-specific code for Seagate IDE disks.  Unless you are
+  the IDE maintainer, you probably do not want to mess with this.
+
+Western Digital Vendor Specific
+CONFIG_BLK_DEV_IDEDISK_WD
+  Enable vendor-specific code for Western Digital IDE disks.  Unless
+  you are the IDE maintainer, you probably do not want to mess with
+  this.
+
+TiVo Commerial Application Specific
+CONFIG_BLK_DEV_TIVO
+  Enable vendor-specific code for TiVo IDE disks.  Unless you are the
+  IDE maintainer, you probably do not want to mess with this.
+
+# Choice: superhsys
+Generic
+CONFIG_SH_GENERIC
+  Select Generic if configuring for a generic SuperH system.
+  The "generic" option compiles in *all* the possible hardware
+  support and relies on the sh_mv= kernel command option to choose
+  at runtime which routines to use.  "MV" stands for "machine vector";
+  each of the machines below is described by a machine vector.
+
+  Select SolutionEngine if configuring for a Hitachi SH7709
+  or SH7750/7750S evaluation board.
+
+  Select SHMobileSolutionEngine if configuring for SH-Mobile Solution
+  Engine.
+
+  Select Overdrive if configuring for a ST407750 Overdrive board.
+  More information at
+  <http://linuxsh.sourceforge.net/docs/7750overdrive.php3>.
+
+  Select HP620 if configuring for a HP Jornada HP620.
+  More information (hardware only) at
+  <http://www.hp.com/jornada/>.
+
+  Select HP680 if configuring for a HP Jornada HP680.
+  More information (hardware only) at
+  <http://www.hp.com/jornada/products/680/>.
+
+  Select HP690 if configuring for a HP Jornada HP690.
+  More information (hardware only) at
+  <http://www.hp.com/jornada/products/680/>.
+
+  Select CqREEK if configuring for a CqREEK SH7708 or SH7750.
+  More information at
+  <http://sources.redhat.com/ecos/hardware.html#SuperH>.
+
+  Select DMIDA if configuring for a DataMyte 4000 Industrial
+  Digital Assistant. More information at <http://www.dmida.com/>.
+
+  Select EC3104 if configuring for a system with an Eclipse
+  International EC3104 chip, e.g. the Harris AD2000 or Compaq Aero 8000.
+
+  Select Dreamcast if configuring for a SEGA Dreamcast.
+  More information at
+  <http://www.m17n.org/linux-sh/dreamcast/>.  There is a
+  Dreamcast project is at <http://linuxdc.sourceforge.net/>.
+
+  Select BareCPU if you know what this means, and it applies
+  to your system.
+
+# These may have to be merged in when we go to CML2:
+#  - "SolutionEngine7751" for Hitachi SolutionEngine (7751)
+#  - "STB1_Harp" for STMicroelectronics HARP
+#  - "CqREEK" for CQ Publishing CqREEK SH-4
+#  - "CAT68701" for CAT 68701 Evaluation Board (SH7708)
+#  - "BigSur" for Big Sur Evaluation Board
+#  - "SH2000" for SH2000 Evaluation Board (SH7709A)
+#  - "ADX" for A&D ADX
+
+SolutionEngine
+CONFIG_SH_SOLUTION_ENGINE
+  Select SolutionEngine if configuring for a Hitachi SH7709
+  or SH7750 evaluation board.
+
+7751 SolutionEngine
+CONFIG_SH_7751_SOLUTION_ENGINE
+  Select 7751 SolutionEngine if configuring for a Hitachi SH7751
+  evaluation board.
+
+SHMobileSolutionEngine
+CONFIG_SH_MOBILE_SOLUTION_ENGINE
+  Select SHMobileSolutionEngine if configuring for SH-Mobile Solution
+  Engine.
+
+Overdrive
+CONFIG_SH_OVERDRIVE
+  Select Overdrive if configuring for a ST407750 Overdrive board.
+  More information at
+  <http://linuxsh.sourceforge.net/docs/7750overdrive.php3>.
+
+HP620
+CONFIG_SH_HP620
+  Select HP620 if configuring for a HP jornada HP620.
+  More information (hardware only) at
+  <http://www.hp.com/jornada/>.
+
+HP680
+CONFIG_SH_HP680
+  Select HP680 if configuring for a HP Jornada HP680.
+  More information (hardware only) at
+  <http://www.hp.com/jornada/products/680/>.
+
+HP690
+CONFIG_SH_HP690
+  Select HP690 if configuring for a HP Jornada HP690.
+  More information (hardware only)
+  at <http://www.hp.com/jornada/products/680/>.
+
+CqREEK
+CONFIG_SH_CQREEK
+  Select CqREEK if configuring for a CqREEK SH7708 or SH7750.
+  More information at
+  <http://sources.redhat.com/ecos/hardware.html#SuperH>.
+
+DMIDA
+CONFIG_SH_DMIDA
+  Select DMIDA if configuring for a DataMyte 4000 Industrial
+  Digital Assistant. More information at <http://www.dmida.com/>.
+
+EC3104
+CONFIG_SH_EC3104
+  Select EC3104 if configuring for a system with an Eclipse
+  International EC3104 chip, e.g. the Harris AD2000.
+
+Dreamcast
+CONFIG_SH_DREAMCAST
+  Select Dreamcast if configuring for a SEGA Dreamcast.
+  More information at
+  <http://www.m17n.org/linux-sh/dreamcast/>.  There is a
+  Dreamcast project is at <http://linuxdc.sourceforge.net/>.
+
+SH-2000
+CONFIG_SH_SH2000
+  SH-2000 is a single-board computer based around SH7709A chip
+  intended for embedded applications.
+  It has an Ethernet interface (CS8900A), direct connected
+  Compact Flash socket, three serial ports and PC-104 bus.
+  More information at <http://sh2000.sh-linux.org>.
+
+BareCPU
+CONFIG_SH_UNKNOWN
+  "Bare CPU" aka "unknown" means an SH-based system which is not one
+  of the specific ones mentioned above, which means you need to enter
+  all sorts of stuff like CONFIG_MEMORY_START because the config
+  system doesn't already know what it is.  You get a machine vector
+  without any platform-specific code in it, so things like the RTC may
+  not work.
+
+  This option is for the early stages of porting to a new machine.
+
+# Choice: superhtype
+SH7707
+CONFIG_CPU_SUBTYPE_SH7707
+  Select the type of SuperH processor you have. This information is
+  used for optimizing and configuration purposes.
+
+  Select SH7707 if you have a  60 Mhz SH-3 HD6417707 CPU.
+
+  Select SH7708 if you have a  60 Mhz SH-3 HD6417708S or
+                if you have a 100 Mhz SH-3 HD6417708R CPU.
+
+  Select SH7709 if you have a  80 Mhz SH-3 HD6417709 CPU.
+
+  Select SH7750 if you have a 200 Mhz SH-4 HD6417750 CPU.
+
+  Select SH7751 if you have a SH7751
+
+  Select ST40STB1 if you have a ST40STB1
+  Select ST40RA/ST40STB1 if you have a ST40RA
+                         (previously known as ST40STB1).
+
+  Select ST40GX1 if you have an ST40GX1.
+
+  Select SH7300 if you have a HD6417300 CPU.
+
+SH7708
+CONFIG_CPU_SUBTYPE_SH7708
+  Select SH7708 if you have a  60 Mhz SH-3 HD6417708S or
+                if you have a 100 Mhz SH-3 HD6417708R CPU.
+
+SH7709
+CONFIG_CPU_SUBTYPE_SH7709
+  Select SH7709 if you have a  80 Mhz SH-3 HD6417709 CPU.
+
+SH7750
+CONFIG_CPU_SUBTYPE_SH7750
+  Select SH7750 if you have a 200 Mhz SH-4 HD6417750 CPU.
+
+SH7751
+CONFIG_CPU_SUBTYPE_SH7751
+  Select SH7750 if you have a 166 Mhz SH-4 HD6417751 CPU.
+
+ST40RA/ST40STB1
+CONFIG_CPU_SUBTYPE_ST40STB1
+  Select ST40RA/ST40STB1 if you have a ST40RA. This chip was
+  previously called the ST40STB1. Early versions were also
+  erronously labelled ST40AR166.
+
+ST40GX1
+CONFIG_CPU_SUBTYPE_ST40GX1
+  Select ST40GX1 if you have a ST40GX1 CPU.
+
+SH7300
+CONFIG_CPU_SUBTYPE_SH7300
+  Select SH7300 if you have a HD6417300 CPU.
+
+Memory on LMI
+CONFIG_ST40_LMI_MEMORY
+  Currently all ST40 CPUs have two external buses the
+  'Local Memory Interface' (LMI) which supports SDRAM and
+  DDR SDRAM, and the 'Enhanced flash Memory Interface' (EMI),
+  which supports SDRAM, Flash, peripherials and MPX. Linux
+  can support memory on either of these buses, it is simply
+  necessary to specify its base address. This option is simply
+  a shortcut method of specifying that RAM starts from the
+  bottom of the LMI.
+
+Physical memory start address
+CONFIG_MEMORY_START
+  Computers built with Hitachi SuperH processors always
+  map the ROM starting at address zero.  But the processor
+  does not specify the range that RAM takes.  
+
+  The physical memory (RAM) start address will be automatically
+  set to 08000000, unless you selected one of the following
+  processor types: SolutionEngine, Overdrive, HP620, HP680, HP690,
+  in which case the start address will be set to 0c000000.
+
+  Tweak this only when porting to a new machine which is not already
+  known by the config system.  Changing it from the known correct
+  value on any of the known systems will only lead to disaster.
+
+Hitachi HD64461 companion chip support
+CONFIG_HD64461
+  The Hitachi HD64461 provides an interface for
+  the SH7709 CPU, supporting a LCD controller,
+  CRT color controller, IrDA up to 4 Mbps, and a
+  PCMCIA controller supporting 2 slots.
+
+  More information is available at
+  <http://semiconductor.hitachi.com/windowsce/superh/sld013.htm>.
+
+  Say Y if you want support for the HD64461.
+  Otherwise, say N.
+
+HD64461 PCMCIA enabler
+CONFIG_HD64461_ENABLER
+  Say Y here if you want to enable PCMCIA support
+  via the HD64461 companion chip.
+  Otherwise, say N.
+
+HD64461 virtualized IRQ number
+CONFIG_HD64461_IRQ
+  The default setting of the HD64461 IRQ is 36.
+
+  Do not change this unless you know what you are doing.
+
+Hitachi HD64465 companion chip support
+CONFIG_HD64465
+  The Hitachi HD64465 provides an interface for
+  the SH7750 CPU, supporting a LCD controller,
+  CRT color controller, IrDA, USB, PCMCIA,
+  keyboard controller, and a printer interface.
+
+  More information is available at
+  <http://global.hitachi.com/New/cnews/E/1998/981019B.html>.
+
+  Say Y if you want support for the HD64465.
+  Otherwise, say N.
+
+HD64465 virtualized IRQ number
+CONFIG_HD64465_IRQ
+  The default setting of the HD64465 IRQ is 5.
+
+  Do not change this unless you know what you are doing.
+
+HD64465 start address
+CONFIG_HD64465_IOBASE
+  The default setting of the HD64465 IO base address is 0xb0000000.
+
+  Do not change this unless you know what you are doing.
+  
+Early printk support
+CONFIG_SH_EARLY_PRINTK
+  Say Y here to redirect kernel printk messages to the serial port
+  used by the SH-IPL bootloader, starting very early in the boot
+  process and ending when the kernel's serial console is initialised.
+  This option is only useful porting the kernel to a new machine,
+  when the kernel may crash or hang before the serial console is
+  initialised. If unsure, say N.
+
+SuperH SCI (serial) support
+CONFIG_SH_SCI
+  Selecting this option will allow the Linux kernel to transfer data
+  over SCI (Serial Communication Interface) and/or SCIF (Serial
+  Communication Interface with FIFO) which are built into the Hitachi
+  SuperH processor.  The option provides 1 to 3 (depending
+  on the CPU model) standard Linux tty devices, /dev/ttySC[012]; one
+  of these is normally used as the system console.
+
+  If in doubt, press "y".
+
+Use LinuxSH standard BIOS
+CONFIG_SH_STANDARD_BIOS
+  Say Y here if your target has the gdb-sh-stub
+  package from www.m17n.org (or any conforming standard LinuxSH BIOS)
+  in FLASH or EPROM.  The kernel will use standard BIOS calls during
+  boot for various housekeeping tasks (including calls to read and
+  write characters to a system console, get a MAC address from an
+  on-board Ethernet interface, and shut down the hardware).  Note this
+  does not work with machines with an existing operating system in
+  mask ROM and no flash (WindowsCE machines fall in this category).
+  If unsure, say N.
+
+GDB Stub kernel debug
+CONFIG_DEBUG_KERNEL_WITH_GDB_STUB
+  If you say Y here, it will be possible to remotely debug the SuperH
+  kernel using gdb, if you have the gdb-sh-stub package from
+  www.m17n.org (or any conforming standard LinuxSH BIOS) in FLASH or
+  EPROM.  This enlarges your kernel image disk size by several
+  megabytes but allows you to load, run and debug the kernel image
+  remotely using gdb.  This is only useful for kernel hackers.  If
+  unsure, say N.
+
+Console output to GDB
+CONFIG_GDB_CONSOLE
+  If you are using GDB for remote debugging over a serial port and
+  would like kernel messages to be formatted into GDB $O packets so
+  that GDB prints them as program output, say 'Y'.
+
+802.1Q VLAN Support
+CONFIG_VLAN_8021Q
+  Select this and you will be able to create 802.1Q VLAN interfaces on your
+  ethernet interfaces.  802.1Q VLAN supports almost everything a regular
+  ethernet interface does, including firewalling, bridging, and of course
+  IP traffic.  You will need the 'vconfig' tool from the VLAN project in
+  order to effectively use VLANs.  See the VLAN web page for more
+  information:  <http://www.candelatech.com/~greear/vlan.html>  If unsure,
+  you can safely say 'N'.
+
+ARC console support
+CONFIG_ARC_CONSOLE
+  Support for the PROM-based console on MIPS machines built according
+  to the Advanced Risc Computing specification, which is now (2001)
+  dead.  These included boxes from Deskstation, Acer, Olivetti and
+  NEC.  There is a history at <http://www.openbsd.org/arc.html>.
+
+AUTCPU12
+CONFIG_ARCH_AUTCPU12
+  Say Y if you intend to run the kernel on the autronix autcpu12
+  board. This board is based on a Cirrus Logic CS89712.
+
+IT8172 IDE support
+CONFIG_BLK_DEV_IT8172
+  Say Y here to support the on-board IDE controller on the Integrated
+  Technology Express, Inc. ITE8172 SBC.  Vendor page at
+  <http://www.ite.com.tw/ia/brief_it8172bsp.htm>; picture of the
+  board at <http://www.mvista.com/allies/semiconductor/ite.html>.
+
+Support ARM926T processor
+CONFIG_CPU_ARM926T
+  This is a variant of the ARM920.  It has slightly different
+  instruction sequences for cache and TLB operations.  Curiously,
+  there is no documentation on it at the ARM corporate website.
+
+  Say Y if you want support for the ARM926T processor.
+  Otherwise, say N.
+
+Support CPU clock change (EXPERIMENTAL)
+CONFIG_CPU_FREQ
+  CPU clock scaling allows you to change the clock speed of the
+  running CPU on the fly. This is a nice method to save battery power,
+  because the lower the clock speed, the less power the CPU
+  consumes. Note that this driver doesn't automatically change the CPU
+  clock speed, you need some userland tools (which still have to be
+  written) to implement the policy. If you don't understand what this
+  is all about, it's safe to say 'N'.
+
+SiS
+CONFIG_DRM_SIS
+  Choose this option if you have a SIS graphics card. AGP support is
+  required for this driver to work.
+
+Etrax Ethernet slave support (over lp0/1)
+CONFIG_ETRAX_ETHERNET_LPSLAVE
+  This option enables a slave ETRAX 100 or ETRAX 100LX, connected to a
+  master ETRAX 100 or ETRAX 100LX through par0 and par1, to act as an
+  Ethernet controller.
+
+Slave has its own LEDs
+CONFIG_ETRAX_ETHERNET_LPSLAVE_HAS_LEDS
+  Enable if the slave has it's own LEDs.
+
+ATA/IDE support
+CONFIG_ETRAX_IDE
+  Enable this to get support for ATA/IDE.  You can't use parallel
+  ports or SCSI ports at the same time.
+
+LED on when link
+CONFIG_ETRAX_NETWORK_LED_ON_WHEN_LINK
+
+  Selecting LED_on_when_link will light the LED when there is a
+  connection and will flash off when there is activity.
+
+  Selecting LED_on_when_activity will light the LED only when
+  there is activity.
+
+  This setting will also affect the behaviour of other activity LEDs
+  e.g. Bluetooth.
+
+Power button bit on port G
+CONFIG_ETRAX_POWERBUTTON_BIT
+  Configure where power button is connected.
+
+Root device name
+CONFIG_ETRAX_ROOT_DEVICE
+  Specifies the device that should be mounted as root file system
+  when booting from flash. The axisflashmap driver adds an additional
+  mtd partition for the appended root file system image, so this option
+  should normally be the mtdblock device for the partition after the
+  last partition in the partition table.
+
+Serial port 0 enabled
+CONFIG_ETRAX_SERIAL_PORT0
+  Enables the ETRAX 100 serial driver for ser0 (ttyS0)
+  Normally you want this on, unless you use external DMA 1 that uses
+  the same DMA channels.
+
+Shutdown bit on port CSP0
+CONFIG_ETRAX_SHUTDOWN_BIT
+  Configure what pin on CSPO-port that is used for controlling power
+  supply.
+
+Software Shutdown Support
+CONFIG_ETRAX_SOFT_SHUTDOWN
+  Enable this if Etrax is used with a power-supply that can be turned
+  off and on with PS_ON signal. Gives the possibility to detect
+  powerbutton and then do a power off after unmounting disks.
+
+Disable watchdog during Oops printouts
+CONFIG_ETRAX_WATCHDOG_NICE_DOGGY
+  By enabling this you make sure that the watchdog does not bite while
+  printing oopses. Recommended for development systems but not for
+  production releases.
+
+Compaq iPAQ Handheld sleeve support
+CONFIG_H3600_SLEEVE
+  Choose this option to enable support for extension packs (sleeves)
+  for the Compaq iPAQ H3XXX series of handheld computers.  This option
+  is required for the CF, PCMCIA, Bluetooth and GSM/GPRS extension
+  packs.
+
+AVM Fritz!Card PCI/PCIv2/PnP support (EXPERIMENTAL)
+CONFIG_HISAX_FRITZ_PCIPNP
+  This enables the driver for the AVM Fritz!Card PCI, Fritz!Card PCI v2
+  and Fritz!Card PnP.
+  (the latter also needs you to select "ISA Plug and Play support"
+  from the menu "Plug and Play configuration")
+
+IBM PCI Hotplug driver
+CONFIG_HOTPLUG_PCI_IBM
+  Say Y here if you have a motherboard with a IBM PCI Hotplug
+  controller.
+
+  This code is also available as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want).
+  The module will be called cpqphp.o. If you want to compile it
+  as a module, say M here and read Documentation/modules.txt.
+
+  When in doubt, say N.
+
+Enable autotest (llsc). Option to run cache test instead of booting
+CONFIG_IA64_SGI_AUTOTEST
+  Build a kernel used for hardware validation. If you include the
+  keyword "autotest" on the boot command line, the kernel does NOT boot.
+  Instead, it starts all cpus and runs cache coherency tests instead.
+
+  If unsure, say N.
+
+IEC61883-6 (Audio transmission) support
+CONFIG_IEEE1394_AMDTP
+  This option enables the Audio & Music Data Transmission Protocol
+  (IEC61883-6) driver, which implements audio transmission over
+  IEEE1394.
+
+  The userspace interface is documented in amdtp.h.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read Documentation/modules.txt.  The module
+  will be called amdtp.o.
+
+IEC61883-1 Plug support
+CONFIG_IEEE1394_CMP
+  This option enables the Connection Management Procedures
+  (IEC61883-1) driver, which implements input and output plugs.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read Documentation/modules.txt.  The module
+  will be called cmp.o.
+
+OHCI-DV I/O support
+CONFIG_IEEE1394_DV1394
+  This driver allows you to transmit and receive DV (digital video)
+  streams on an OHCI-1394 card using a simple frame-oriented
+  interface.
+
+  The user-space API for dv1394 is documented in dv1394.h.
+
+  If you want to compile this as a module ( = code which can be
+  inserted in and removed from the running kernel whenever you want),
+  say M here and read Documentation/modules.txt.  The module
+  will be called dv1394.o.
+
+Ethernet over 1394
+CONFIG_IEEE1394_ETH1394
+  Extremely Experimental! This driver is a Linux specific way to use your
+  IEEE1394 Host as an Ethernet type device. This is _NOT_ IP1394.
+
+Support for older IT8172 (Rev C)
+CONFIG_IT8172_REVC
+  Say Y here to support the older, Revision C version of the Integrated
+  Technology Express, Inc. ITE8172 SBC.  Vendor page at
+  <http://www.ite.com.tw/ia/brief_it8172bsp.htm>; picture of the
+  board at <http://www.mvista.com/allies/semiconductor/ite.html>.
+
+Enable Smart Card Reader 0 Support
+CONFIG_IT8172_SCR0
+  Say Y here to support smart-card reader 0 (SCR0) on the Integrated
+  Technology Express, Inc. ITE8172 SBC.  Vendor page at
+  <http://www.ite.com.tw/ia/brief_it8172bsp.htm>; picture of the
+  board at <http://www.mvista.com/allies/semiconductor/ite.html>.
+
+Enable Smart Card Reader 1 Support
+CONFIG_IT8172_SCR1
+  Say Y here to support smart-card reader 1 (SCR1) on the Integrated
+  Technology Express, Inc. ITE8172 SBC.  Vendor page at
+  <http://www.ite.com.tw/ia/brief_it8172bsp.htm>; picture of the
+  board at <http://www.mvista.com/allies/semiconductor/ite.html>.
+
+IT8172 IDE Tuning support
+CONFIG_IT8172_TUNING
+  Say Y here to support tuning the ITE8172's IDE interface.  This makes
+  it possible to set DMA channel or PIO opration and the transfer rate.
+
+Enable protocol mode for the L1 console
+CONFIG_SERIAL_SGI_L1_PROTOCOL
+  Uses protocol mode instead of raw mode for the level 1 console on the
+  SGI SN (Scalable NUMA) platform for IA64.  If you are compiling for
+  an SGI SN box then Y is the recommended value, otherwise say N.
+
+New bus configuration (EXPERIMENTAL)  
+CONFIG_TULIP_MWI
+  This configures your Tulip card specifically for the card and
+  system cache line size type you are using.
+
+  This is experimental code, not yet tested on many boards.
+
+  If unsure, say N.
+
+NatSemi SCx200 support
+CONFIG_SCx200
+  This provides basic support for the National Semiconductor SCx200
+  processor.  Right now this is just a driver for the GPIO pins.
+
+  If you don't know what to do here, say N.
+
+  This support is also available as a module.  If compiled as a
+  module, it will be called scx200.o.
+
+NatSemi SCx200 Watchdog
+CONFIG_SCx200_WDT
+  Enable the built-in watchdog timer support on the National 
+  Semiconductor SCx200 processors.
+
+  If compiled as a module, it will be called scx200_watchdog.o.
+
+Flash device mapped with DOCCS on NatSemi SCx200
+CONFIG_MTD_SCx200_DOCFLASH
+  Enable support for a flash chip mapped using the DOCCS signal on a
+  National Semiconductor SCx200 processor.
+
+  If you don't know what to do here, say N.
+
+  If compiled as a module, it will be called scx200_docflash.o.
+
+BIOS flash chip on AMD76x southbridge
+CONFIG_MTD_AMD76XROM
+  Support for treating the BIOS flash chip on AMD76x motherboards
+  as an MTD device - with this you can reprogram your BIOS.
+
+  BE VERY CAREFUL.
+
+  If compiled as a module, it will be called amd76xrom.o.
+
+BIOS flash chip on Intel Hub Controller 2
+CONFIG_MTD_ICH2ROM
+  Support for treating the BIOS flash chip on ICH2 motherboards
+  as an MTD device - with this you can reprogram your BIOS.
+
+  BE VERY CAREFUL.
+
+  If compiled as a module, it will be called ich2rom.o.
+
+BIOS flash chip on Intel SCB2 boards
+CONFIG_MTD_SCB2_FLASH
+  Support for treating the BIOS flash chip on Intel SCB2 boards
+  as an MTD device - with this you can reprogram your BIOS.
+
+  BE VERY CAREFUL.
+
+  If compiled as a module, it will be called scb2_flash.o.
+
+Flash chips on Tsunami TIG bus
+CONFIG_MTD_TSUNAMI
+  Support for the flash chip on Tsunami TIG bus.
+
+  If compiled as a module, it will be called tsunami_flash.o.
+
+Flash chips on LASAT board
+CONFIG_MTD_LASAT
+  Support for the flash chips on the Lasat 100 and 200 boards.
+
+  If compiled as a module, it will be called lasat.o.
+
+CFI flash device on SnapGear/SecureEdge
+CONFIG_MTD_NETtel
+  Support for flash chips on NETtel/SecureEdge/SnapGear boards.
+
+  If compiled as a module, it will be called nettel.o.
+
+CFI Flash device mapped on DIL/Net PC
+CONFIG_MTD_DILNETPC
+  MTD map driver for SSV DIL/Net PC Boards "DNP" and "ADNP".
+  For details, see <http://www.ssv-embedded.de/ssv/pc104/p169.htm>
+   and <http://www.ssv-embedded.de/ssv/pc104/p170.htm>
+
+  If compiled as a module, it will be called dilnetpc.o.
+
+Size of DIL/Net PC flash boot partition
+CONFIG_MTD_DILNETPC_BOOTSIZE
+  The amount of space taken up by the kernel or Etherboot
+  on the DIL/Net PC flash chips.
+
+CFI Flash device mapped on Epxa10db
+CONFIG_MTD_EPXA10DB
+  This enables support for the flash devices on the Altera
+  Excalibur XA10 Development Board. If you are building a kernel
+  for on of these boards then you should say 'Y' otherwise say 'N'.
+
+  If compiled as a module, it will be called epxa10db-flash.o.
+
+CFI Flash device mapped on the FortuNet board
+CONFIG_MTD_FORTUNET
+  This enables access to the Flash on the FortuNet board.  If you
+  have such a board, say 'Y'.
+
+  If compiled as a module, it will be called fortunet.o.
+
+NV-RAM mapping AUTCPU12 board
+CONFIG_MTD_AUTCPU12
+  This enables access to the NV-RAM on autronix autcpu12 board.
+  If you have such a board, say 'Y'.
+
+  If compiled as a module, it will be called autcpu12-nvram.o.
+
+CFI Flash device mapped on EDB7312
+CONFIG_MTD_EDB7312
+  This enables access to the CFI Flash on the Cogent EDB7312 board.
+  If you have such a board, say 'Y' here.
+
+  If compiled as a module, it will be called edb7312.o.
+
+JEDEC Flash device mapped on impA7
+CONFIG_MTD_IMPA7
+  This enables access to the NOR Flash on the impA7 board of
+  implementa GmbH. If you have such a board, say 'Y' here.
+
+  If compiled as a module, it will be called impa7.o.
+
+JEDEC Flash device mapped on Ceiva/Polaroid PhotoMax Digital Picture Frame
+CONFIG_MTD_CEIVA
+  This enables access to the flash chips on the Ceiva/Polaroid
+  PhotoMax Digital Picture Frame.
+  If you have such a device, say 'Y'.
+
+  If compiled as a module, it will be called ceiva.o.
+
+System flash on MBX860 board
+CONFIG_MTD_MBX860
+  This enables access routines for the flash chips on the Motorola
+  MBX860 board. If you have one of these boards and would like
+  to use the flash chips on it, say 'Y'.
+
+  If compiled as a module, it will be called mbx860.o.
+
+PCI MTD driver
+CONFIG_MTD_PCI
+  Mapping for accessing flash devices on add-in cards like the Intel XScale
+  IQ80310 card, and the Intel EBSA285 card in blank ROM programming mode
+  (please see the manual for the link settings).
+
+  If compiled as a module, it will be called pci.o.
+
+  If you are not sure, say N.
+
+PCMCIA MTD driver
+CONFIG_MTD_PCMCIA
+  Map driver for accessing PCMCIA linear flash memory cards. These
+  cards are usually around 4-16MiB in size. This does not include
+  Compact Flash cards which are treated as IDE devices.
+
+  If compiled as a module, it will be called pcmciamtd.o.
+
+Generic uClinux RAM/ROM filesystem support
+CONFIG_MTD_UCLINUX
+  Map driver to support image based filesystems for uClinux.
+
+  If compiled as a module, it will be called uclinux.o.
+
+NatSemi SCx200 I2C using GPIO pins
+CONFIG_SCx200_GPIO
+  Enable the use of two GPIO pins of a SCx200 processor as an I2C bus.
+
+  If you don't know what to do here, say N.
+
+  If compiled as a module, it will be called scx200_i2c.o.
+
+GPIO pin used for SCL
+CONFIG_SCx200_I2C_SCL
+  Enter the GPIO pin number used for the SCL signal.  This value can
+  also be specified with a module parameter.
+
+GPIO pin used for SDA
+CONFIG_SCx200_I2C_SDA
+  Enter the GPIO pin number used for the SSA signal.  This value can
+  also be specified with a module parameter.
+
+NatSemi SCx200 ACCESS.bus
+CONFIG_SCx200_ACB
+  Enable the use of the ACCESS.bus controllers of a SCx200 processor.
+
+  If you don't know what to do here, say N.
+
+  If compiled as a module, it will be called scx200_acb.o.
+
+IPMI top-level message handler
+CONFIG_IPMI_HANDLER
+  This enables the central IPMI message handler, required for IPMI
+  to work.  Note that you must have this enabled to do any other IPMI
+  things.
+
+  IPMI is a standard for managing sensors (temperature,
+  voltage, etc.) in a system.
+
+  See Documentation/IPMI.txt for more details on the driver.
+
+  If unsure, say N.
+
+Generate a panic event to all BMCs on a panic
+CONFIG_IPMI_PANIC_EVENT
+  When a panic occurs, this will cause the IPMI message handler to
+  generate an IPMI event describing the panic to each interface
+  registered with the message handler.
+
+Device interface for IPMI
+CONFIG_IPMI_DEVICE_INTERFACE
+  This provides an IOCTL interface to the IPMI message handler so
+  userland processes may use IPMI.  It supports poll() and select().
+
+IPMI KCS handler
+CONFIG_IPMI_KCS
+  Provides a driver for a KCS-style interface to a BMC.
+
+IPMI Watchdog Timer
+CONFIG_IPMI_WATCHDOG
+  This enables the IPMI watchdog timer.
+
+CRC32 functions
+CONFIG_CRC32
+  This option is provided for the case where no in-kernel-tree
+  modules require CRC32 functions, but a module built outside the
+  kernel tree does. Such modules that use library CRC32 functions
+  require that you say M or Y here.
+
+CONFIG_CRYPTO
+  This option provides the core Cryptographic API.
+
+CONFIG_CRYPTO_HMAC
+  HMAC: Keyed-Hashing for Message Authentication (RFC2104).
+  This is required for IPSec.
+
+CONFIG_CRYPTO_NULL
+  These are 'Null' algorithms, used by IPsec, which do nothing.
+
+CONFIG_CRYPTO_MD4
+  MD4 message digest algorithm (RFC1320).
+  
+CONFIG_CRYPTO_MD5
+  MD5 message digest algorithm (RFC1321).
+
+CONFIG_CRYPTO_SHA1
+  SHA-1 secure hash standard (FIPS 180-1/DFIPS 180-2).
+
+CONFIG_CRYPTO_SHA256
+  SHA256 secure hash standard (DFIPS 180-2).
+
+  This version of SHA implements a 256 bit hash with 128 bits of
+  security against collision attacks.
+
+CONFIG_CRYPTO_SHA512
+  SHA512 secure hash standard (DFIPS 180-2).
+
+  This version of SHA implements a 512 bit hash with 256 bits of
+  security against collision attacks.
+
+  This code also includes SHA-384, a 384 bit hash with 192 bits
+  of security against collision attacks.
+
+CONFIG_CRYPTO_DES
+  DES cipher algorithm (FIPS 46-2), and Triple DES EDE (FIPS 46-3).
+
+CONFIG_CRYPTO_BLOWFISH
+  Blowfish cipher algorithm, by Bruce Schneier.
+
+  This is a variable key length cipher which can use keys from 32
+  bits to 448 bits in length.  It's fast, simple and specifically
+  designed for use on "large microprocessors".
+
+  See also <http://www.counterpane.com/blowfish.html>.
+
+CONFIG_CRYPTO_TWOFISH
+  Twofish cipher algorithm.
+
+  Twofish was submitted as an AES (Advanced Encryption Standard)
+  candidate cipher by researchers at CounterPane Systems.  It is a
+  16 round block cipher supporting key sizes of 128, 192, and 256
+  bits.
+
+  See also:
+  http://www.counterpane.com/twofish.html
+
+CONFIG_CRYPTO_SERPENT
+  Serpent cipher algorithm, by Anderson, Biham & Knudsen.
+
+  Keys are allowed to be from 0 to 256 bits in length, in steps
+  of 8 bits.
+
+  See also:
+  http://www.cl.cam.ac.uk/~rja14/serpent.html
+
+CONFIG_CRYPTO_AES
+  AES cipher algorithms (FIPS-197). AES uses the Rijndael 
+  algorithm.
+
+  Rijndael appears to be consistently a very good performer in
+  both hardware and software across a wide range of computing 
+  environments regardless of its use in feedback or non-feedback 
+  modes. Its key setup time is excellent, and its key agility is 
+  good. Rijndael's very low memory requirements make it very well 
+  suited for restricted-space environments, in which it also 
+  demonstrates excellent performance. Rijndael's operations are 
+  among the easiest to defend against power and timing attacks.        
+
+  The AES specifies three key sizes: 128, 192 and 256 bits       
+
+  See http://csrc.nist.gov/encryption/aes/ for more information.
+
+CONFIG_CRYPTO_DEFLATE
+  This is the Deflate algorithm (RFC1951), specified for use in
+  IPSec with the IPCOMP protocol (RFC3173, RFC2394).
+
+  You will most probably want this if using IPSec.
+
+CONFIG_CRYPTO_TEST
+  Quick & dirty crypto test module.
+
+#
+# A couple of things I keep forgetting:
+#   capitalize: AppleTalk, Ethernet, DOS, DMA, FAT, FTP, Internet,
+#               Intel, IRQ, ISDN, Linux, MSDOS, NetWare, NetWinder,
+#               NFS, PCI, SCSI, SPARC
+#   two words:  file system, hard drive, hard disk, home page,
+#               user space, web site
+#   other:      it's safe to save; daemon; use --, not - or ---;
+#               use KB for 1024 bytes, not kB or K.
+#
+#
+# This is used by Emacs' spell checker ispell.el:
+#
+# LocalWords:  CONFIG coprocessor DX Pentium SX lilo loadlin HOWTO ftp ibiblio
+# LocalWords:  unc edu docs emu README kB BLK DEV FD Thinkpad fd MFM RLL IDE gz
+# LocalWords:  cdrom diskless netboot nfs xzvf ATAPI MB ide pavia rubini pl pd
+# LocalWords:  HD CD-ROMs IDECD NEC MITSUMI filesystem XT XD PCI BIOS cezar ATEN
+# LocalWords:  ISA EISA Microchannel VESA BIOSes IPC SYSVIPC ipc Ctrl dmesg hlt
+# LocalWords:  BINFMT Linkable http ac uk jo html GCC SPARC AVANTI CABRIOLET EB
+# LocalWords:  netscape gcc LD CC toplevel MODVERSIONS insmod rmmod modprobe IP
+# LocalWords:  genksyms INET loopback gatewaying Ethernet PPP ARP Arp MEMSIZE
+# LocalWords:  howto multicasting MULTICAST MBONE firewalling ipfw ACCT resp ip
+# LocalWords:  proc acct IPIP encapsulator decapsulator klogd RARP EXT PS
+# LocalWords:  telnetting subnetted NAGLE rlogin NOSR ttyS TGA techinfo mbone nl
+# LocalWords:  Mb SKB IPX Novell dosemu DDP ATALK vmalloc visar ehome
+# LocalWords:  SD CHR scsi thingy SG CD LUNs LUN jukebox Adaptec BusLogic EATA
+# LocalWords:  buslogic DMA DPT ATT eata dma PIO UltraStor fdomain umsdos ext
+# LocalWords:  QLOGIC qlogic TMC seagate Trantor ultrastor FASST wd NETDEVICES
+# LocalWords:  unix BBS linux CSLIP PLIP Kirch's LDP CSlip SL SCC IRQ csustan
+# LocalWords:  Turbo Laplink plip NCSA port's ReQuest IRQs EQL SMC AMD PCnet NE
+# LocalWords:  COM ELPLUS Com EtherLinkIII VLB Arcnet Cabletron DEPCA DE carlos
+# LocalWords:  depca EtherWorks EWRK ewrk SEEQ EtherExpress EEXPRESS NI xxx dia
+# LocalWords:  EtherExpress WaveLAN wavelan PCLAN HPLAN VG SK Ansel Xen de ZNET
+# LocalWords:  PCMCIA cb stanford LAN TEC RealTek ATP atp DLINK NetTools VISWS
+# LocalWords:  TR Sony CDU caddyless cdu Mitsumi MCD cd mcd XA MultiSession CDA
+# LocalWords:  Matsushita Panasonic SBPCD Soundblaster Longshine sbpcd Aztech
+# LocalWords:  Okano Wearnes AZTCD CDD SE aztcd sonycd Goldstar GSCD Philips fs
+# LocalWords:  LMS OPTCD Sanyo SJCD minix faqs xiafs XIA msdos mtools Cichocki
+# LocalWords:  std softlinks umssync NetworkFileSharing nfsd mountd CDs HPFS TI
+# LocalWords:  hpfs SYSV SCO iBCS Wyse WordPerfect tsx mit unixes sysv NR irisa
+# LocalWords:  SMB WfW Cyclades async mux Logitech busmouse MouseSystem aka AST
+# LocalWords:  PSMOUSE Compaq trackballs Travelmate Inport ATIXL ATI busmice ld
+# LocalWords:  gpm config QIC DYNCONF FTAPE Stor Ftape ftape pcsndrv manpage NT
+# LocalWords:  readprofile diskdrives org com masq EtherTalk tcp netrom sunacm
+# LocalWords:  misc AIC aic pio scc Portmaster eql GIS PhotoCDs MCDX Perell PG
+# LocalWords:  mcdx gscd optcd sjcd ISP hdparm Workgroups Lan samba PARIDE PCD
+# LocalWords:  filesystems smbfs ATA ppp PCTech RZ www powerquest txt CMD ESDI
+# LocalWords:  chipset FB multicast MROUTE appletalk ifconfig IBMTR multiport
+# LocalWords:  Multisession STALDRV EasyIO EC EasyConnection ISTALLION ONboard
+# LocalWords:  Brumby pci TNC cis ohio faq usenet NETLINK dev hydra ca Tyne mem
+# LocalWords:  carleton DECstation SUNFD JENSEN Noname XXXM SLiRP LILO's amifb
+# LocalWords:  pppd Zilog ZS SRM bootloader ez mainmenu rarp ipfwadm paride pcd
+# LocalWords:  RTNETLINK mknod xos MTU lwared Macs netatalk macs cs Wolff
+# LocalWords:  dartmouth flowerpt MultiMaster FlashPoint tudelft etherexpress
+# LocalWords:  ICL EtherTeam ETH IDESCSI TXC SmartRAID SmartCache httpd sjc dlp
+# LocalWords:  thesphere TwoServers BOOTP DHCP ncpfs BPQETHER BPQ MG HIPPI cern
+# LocalWords:  bsd comp SPARCstation le SunOS ie Gracilis PackeTwin PT pt LU FX
+# LocalWords:  FX TEAC CR LCS mS ramdisk IDETAPE cmd fperllo encis tcfs unisa
+# LocalWords:  Vertos Genoa Funai hsfs NCP NetWare tgz APM apm ioctls UltraLite
+# LocalWords:  TravelMate CDT LCD backlight VC RPC Mips AXP barlow cdrtools pg
+# LocalWords:  PMAX MILO Alphas Multia Tseng linuxelf endian mipsel mips drv HT
+# LocalWords:  kerneld callouts AdvanSys advansys Admin WDT DataStor EP verden
+# LocalWords:  wdt hdb hdc bugfix SiS vlb Acculogic CSA DTC dtc Holtek ht QDI
+# LocalWords:  QD qd UMC umc ALI ali lena fnet fr azstarnet cdr fb MDA ps esdi
+# LocalWords:  Avanti XL AlphaStations Jensen DECpc AXPpci UDB Cabriolet MCA RC
+# LocalWords:  AlphaPC mca AOUT OUTput PPro sipx gwdg lo nwe FourPort Boca unm
+# LocalWords:  Keepalive linefill RELCOM keepalive analogue CDR conf CDI INIT
+# LocalWords:  OPTi isp irq noisp VFAT vfat NTFS losetup dmsdosfs dosfs ISDN MP
+# LocalWords:  NOWAYOUT behaviour dialin isdn callback BTX Teles  XXXX LVM lvm
+# LocalWords:  ICN EDSS Cisco
+# LocalWords:  ipppd syncppp RFC MPP VJ downloaded icn NICCY Creatix shmem ufr
+# LocalWords:  ibp md ARCnet ether encap NDIS arcether ODI Amigas AmiTCP NetBSD
+# LocalWords:  initrd tue util DES funet des OnNet BIOSP smc Travan Iomega CMS
+# LocalWords:  FC DC dc PPA IOMEGA's ppa RNFS FMV Fujitsu ARPD arpd loran layes
+# LocalWords:  FRAD indiana framerelay DLCI DCLIs Sangoma SDLA mrouted sync sec
+# LocalWords:  Starmode Metricom MosquitoNet mosquitonet kbit nfsroot Digiboard
+# LocalWords:  DIGI Xe Xeve digiboard UMISC touchscreens mtu Ethernets HBAs MEX
+# LocalWords:  Shifflett netcom js jshiffle WIC DECchip ELCP EtherPower dst RTC
+# LocalWords:  rtc SMP lp Digi Intl RightSwitch DGRS dgrs AFFS Amiga UFS SDL AP
+# LocalWords:  Solaris RISCom riscom syncPPP PCBIT pcbit sparc anu au artoo MFB
+# LocalWords:  hitchcock Crynwr cnam pktdrvr NCSA's CyDROM CyCD-ROM FreeBSD NeXT
+# LocalWords:  NeXTstep disklabel disklabels SMD FFS tm AmigaOS diskfiles Un IQ
+# LocalWords:  Bernd informatik rwth aachen uae affs multihosting bytecode java
+# LocalWords:  applets applet JDK ncsa cabi SNI Alphatronix readme LANs scarab
+# LocalWords:  winsock RNIS caltech OSPF honour Honouring Mbit LocalTalk DEFRAG
+# LocalWords:  localtalk download Packetwin Baycom baycom interwork ASCII JNT
+# LocalWords:  Camtec proxying indyramp defragment defragmented UDP FAS FASXX
+# LocalWords:  FastSCSI SIO FDC qlogicfas QLogic qlogicisp setbaycom ife ee LJ
+# LocalWords:  ethz ch Travelmates ProAudioSpectrum ProAudio SoundMan SB SBPro
+# LocalWords:  Thunderboard SM OPL FM ADLIB TSR Gravis MPU PSS ADI SW DSP codec
+# LocalWords:  ADSP ESC ASIC daughtercard GUSMAX MSS NX AdLib Excell Ensoniq YM
+# LocalWords:  SoundScape Spea MediaTriX AudioTriX WSS OTI ThunderBoard VoxWare
+# LocalWords:  Soundscape SSCAPE TRIX MediaTrix PnP Maui dsp midixx EIA getty
+# LocalWords:  mgetty sendfax gert greenie muc lowlevel Lasermate LanManager io
+# LocalWords:  OOPSes trackball binghamton mobileip ncr IOMAPPED settags ns ser
+# LocalWords:  setsync NEGO MPARITY autotuning prefetch PIIX cdwrite utils rc
+# LocalWords:  PCWATCHDOG berkprod bitgate boldt ucsb jf kyoto jp euc Tetsuyasu
+# LocalWords:  YAMADA tetsu cauchy nslab ntt nevod perm su doc kaf kheops wsc
+# LocalWords:  traduc Bourgin dbourgin menuconfig kfill READMEs HOWTOs Virge WA
+# LocalWords:  IDEDISK IDEFLOPPY EIDE firewalls QMAGIC ZMAGIC LocalWords opti
+# LocalWords:  SVGATextMode vga svga Xkernel syr jmwobus comfaqs dhcp flakey GD
+# LocalWords:  IPv IPng interoperability ipng ipv radio's tapr pkthome PLP nano
+# LocalWords:  Ses Mhz sethdlc SOUNDMODEM WindowsSoundSystem smdiag pcf inka ES
+# LocalWords:  smmixer ptt circ soundmodem MKISS FDDI DEFEA DEFPA DEFXX redhat
+# LocalWords:  HyperNews khg mconv sed lina wuftpd MicroChannel netlink irc cum
+# LocalWords:  raudio RealAudio PPROP NETBIOS GUI IBMMCA ELMC Racal Interlan fi
+# LocalWords:  eth shapecfg src esp PCWD PREVSTAT bootparam sig bitwizard SBC
+# LocalWords:  downloads AFSK TCM FP Karn KA FSK RUH LinkSys cron mouseman LLC
+# LocalWords:  SyQuest SyQuest's CCITT MicroSolutions BPCD bpcd ESPSERIAL PROM
+# LocalWords:  SUNESP openprom OPENPROMIO quango themall al TT MC MMU LC RMW AA
+# LocalWords:  INSNS Ataris AutoConfig ZORRO OCS AMIFB Agnus Denise ECS CDTV GB
+# LocalWords:  AGA Cybervision CYBER GSP TMS DMI Zorro ACSI ROMs SLM BioNet GVP
+# LocalWords:  PAMsNet TekMagic Cyberstorm MkI CYBERSTORMII MkII BLZ onboard cx
+# LocalWords:  Village Tronic ATARILANCE RieblCard PAMCard VME MFP sangoma LAPB
+# LocalWords:  Rhotron BioData's Multiface AMIGAMOUSE COPCON Amiga's bitplanes
+# LocalWords:  ATARIMOUSE MFPSER SCC's MegaSTE ESCC Atari's GVPIOEXT DMASOUND
+# LocalWords:  fdutils cisco univercd rpcg htm iface lapb LAPBETHER tpqic qic
+# LocalWords:  SYNTH xd en binfmt aout ipip terra ipx sd sr sg wic framebuffer
+# LocalWords:  ibmmca lapbether mkiss dlci sdla fmv eepro eexpress ni hp ne es
+# LocalWords:  ibmtr isofs ROMFS romfs pcxx cyclades istallion psaux msbusmouse
+# LocalWords:  atixlmouse sbin softdog pcwd USS Lite ACI miroSOUND PCM miroPCM
+# LocalWords:  microcontroller miro Voxware downloading teles acsi slm gvp ltpc
+# LocalWords:  atari ariadne amigamouse atarimouse builtin IPDDP maths bradford
+# LocalWords:  AppleTalk Farallon PhoneNet Zubkoff lnz SCCB HAPN WANs vesafb nt
+# LocalWords:  wanrouter WANPIPE multiprotocol Mbps wanpipe EtherWORKS nodma SC
+# LocalWords:  smp HiSax SiemensChipSet Siemens AVM Elsa ITK hisax PCC MICROR
+# LocalWords:  Mircolink EURO DSS Spellcaster BRI sc spellcast Digiboards GPIO
+# LocalWords:  SYMBIOS COMPAT SDMS rev ASUS Tekram HX VX API ibmmcascsi ASY asy
+# LocalWords:  loader's PCnetPCI automounter AUTOFS amd autofs VT Gallant's Pnp
+# LocalWords:  AEDSP aedsp enskip tik Sysctl sysctl PARPORT parport pnp IDs EPP
+# LocalWords:  Autoprobe bart patrickr HDLS READBACK AB usr DAMA DS SparQ aten
+# LocalWords:  Symbios PCscsi tmscsim RoamAbout GHz Hinds contrib mathematik ok
+# LocalWords:  darmstadt okir DIGIEPCA International's Xem digiepca epca bootup
+# LocalWords:  zorro CAPI AVMB capi avmb VP SYN syncookies EM em pc Ethertalk
+# LocalWords:  Dayna DL Daynatalk LT PhoneNET ATB Daystar queueing CMDS SCBs ls
+# LocalWords:  SCB STATS Thinnet ThunderLAN TLAN Netelligent NetFlex tlan james
+# LocalWords:  caldera Preload Preloading slowdowns schoebel uni NBD nbd prog
+# LocalWords:  stuttgart rdist TRANS hostnames mango jukeboxes ESS userland PD
+# LocalWords:  hardlinked NAMETRANS env mtab fstab umount nologin runlevel gid
+# LocalWords:  adm Nodename hostname uname Kernelname bootp nmi DI OV StegFS
+# LocalWords:  KERNNAME kname ktype kernelname Kerneltype KERNTYPE Alt RX mdafb
+# LocalWords:  dataless kerneltype SYSNAME Comtrol Rocketport palmtop fbset EGS
+# LocalWords:  nvram SYSRQ SysRq PrintScreen sysrq NVRAMs NvRAM Shortwave RTTY
+# LocalWords:  Sitor Amtor Pactor GTOR hayes TX TMOUT JFdocs BIGMEM DAC IRQ's
+# LocalWords:  IDEPCI IDEDMA PDC pdc TRM trm raidtools luthien nuclecu BAGET VR
+# LocalWords:  unam mx miguel koobera uic EMUL solaris pp ieee lpsg co DMAs TOS
+# LocalWords:  BLDCONFIG preloading jumperless BOOTINIT modutils multipath GRE
+# LocalWords:  misconfigured autoconfiguration IPGRE ICMP tracert ipautofw PIM
+# LocalWords:  netis rlynch autofw ipportfw monmouth ipsubs portforwarding pimd
+# LocalWords:  portfw PIMSM netweb usc pim pf EUI aggregatable PB decapsulate
+# LocalWords:  ipddp Decapsulation DECAP bool HAMRADIO tcpdump af CDs tx FBCON
+# LocalWords:  ethertap multisession PPC MMIO GDT GDTH ICP gdth hamradio  bpp
+# LocalWords:  lmh weejock AIMSlab RadioTrack RTRACK HZP OptoSCC TRX rx TRXECHO
+# LocalWords:  DMASCC paccomm dmascc addr cfg oevsv oe kib picpar FDX baudrate
+# LocalWords:  baudrates fdx HDX hdx PSK kanren frforum QoS SCHED CBQ SCH sched
+# LocalWords:  sch cbq CSZ Shenker Zhang csz SFQ sfq TBF tbf PFIFO fifo PRIO RW
+# LocalWords:  prio Micom xIO dwmw rimi OMIRR omirr omirrd unicode ntfs cmu NIC
+# LocalWords:  Braam braam Schmidt's freiburg nls codepages codepage Romanian
+# LocalWords:  Slovak Slovenian Sorbian Nordic iso Catalan Faeroese Galician SZ
+# LocalWords:  Valencian Slovene Esperanto Estonian Latvian Belarusian KOI mt
+# LocalWords:  charset Inuit Greenlandic Sami Lappish koi Alexey Kuznetsov's sa
+# LocalWords:  Specialix specialix DTR RTS RTSCTS cycladesZ Exabyte ftape's inr
+# LocalWords:  Iomega's LBFM claus ZFTAPE VFS zftape zft William's lzrw DFLT kb
+# LocalWords:  MTSETBLK MTIOCTOP qft setblk zftape's tar's afio's setdrvbuffer
+# LocalWords:  Procfs Exabyte's THR FCD sysvinit init PSC pscwdt VMIDI Euro SAB
+# LocalWords:  Mostek Fastlane PowerMac PReP PMAC PowerPC Macintoshes Starmax
+# LocalWords:  PowerStack Starmaxes MCOMMON DEVICETREE ATY IMS IMSTT videodev
+# LocalWords:  BT Hauppauge STB bttv Quickcam BW BWQCAM bw qcam Mediavision PMS
+# LocalWords:  pms Avatar Freecom Imation Superdisk BPCK bpck COMM comm DSTR ru
+# LocalWords:  dstr EPAT EPEZ epat EPIA epia FreeCom FRPW frpw KingByte KBIC HW
+# LocalWords:  KingByte's kbic OnSpec ValuStore FASTROUTE fastroute FLOWCONTROL
+# LocalWords:  struct APIC realtime OSs LynxOS CNC tmp cvf HFS hfs ADFS Risc os
+# LocalWords:  adfs ncpmount namespace SUBDIR reexport NDS kcore FT SPX spx DAT
+# LocalWords:  interserver BLKSZ NUMBUFFERS apmd Tadpole ANA roestock QuickCam
+# LocalWords:  isapnptools Colour CQCAM colour Connectix QuickClip prive mentre
+# LocalWords:  KMOD kmod conformant utexas kharker UnixWare Mwave cgi cl ts ibm
+# LocalWords:  eXchange threepio oakland simtel pre ULTRAMCA EtherLink isa luik
+# LocalWords:  EtherLink OpenBSD pts DEVPTS devpts ptmx ttyp glibc readback SA
+# LocalWords:  mwave OLDCARD isdnloop linklevel loopctrl Eicon Diehl DIEHLDIVA
+# LocalWords:  ASUSCOM AsusCom TELEINT semiactiv Sedlbauer Sportster TA MIC ITH
+# LocalWords:  NETjet NetJet Niccy Neuhaus sparcs AOC AOCD AOCE Microlink SAA
+# LocalWords:  teletext WinTV saa iproute tc Quadra Performa PowerBook tor AUN
+# LocalWords:  setserial compsoc steve Econet econet AUNUDP psched TEQL TLE CLS
+# LocalWords:  teql FW Ingres TwistedPair MTRR MTRRs mtrr cfs crypto TD ktti KT
+# LocalWords:  PHd ICS ipchains adelaide rustcorp syslog Cumana steganography
+# LocalWords:  AcornSCSI EcoSCSI EESOX EESOXSCSI Powertec POWERTECSCSI dec SF
+# LocalWords:  RadioReveal gatekeeper aimslab aztech FMI sf fmi RTL rtl cesdis
+# LocalWords:  Yellowfin gsfc nasa gov yellowfin pcnet Mylex LNE lne EtherH hs
+# LocalWords:  EBSA chattr RiscOS Winmodem AGP Atomwide DUALSP pcsp robinson CT
+# LocalWords:  SGALAXY Waverider DSPxxx TRXPRO AudioTrix OSWF MOT CFB DSY kbps
+# LocalWords:  tuwien kkudielk LVD mega lun MAXTAGS Gbps arcnet Olicom SNA PAE
+# LocalWords:  SysKonnect tms sna etherboot ufs NetBEUI MultiSound MSNDCLAS GX
+# LocalWords:  MSNDINIT MSNDPERM MSNDPIN PNDSPINI PNDSPERM Ensoniq's RetinaZ SS
+# LocalWords:  AudioPCI lspci SonicVibes sonicvibes SPARCs roadrunner CLgen UPA
+# LocalWords:  swansea shtml Zoltrix zoltrix BINUTILS EGCS binutils VIDC DACs
+# LocalWords:  CyberVision Cirrus PowerBooks Topcat SBUS CGsix TurboGX BWtwo SS
+# LocalWords:  CGthree TCX unswappable vfb fbcon hicolor truecolor AFB ILBM SOC
+# LocalWords:  IPLAN gracilis Fibre SBus SparcSTORAGE SV jnewbigin swin QNX qnx
+# LocalWords:  PTY PTYS ptyxx ttyxx PTYs ssh sb Avance ALS pss pvv kerneli hd
+# LocalWords:  synth WaveFront MSND NONPNP AudioExcelDSP STRAM APUS CHRP MBX Nx
+# LocalWords:  PowerMac's BMAC radiotrack rtrack miropcm OFFBOARD HPT UDMA DVD
+# LocalWords:  hpt fokus gmd Cyrix DXL SLC DLC NexGen MediaGX GXm IDT WinChip
+# LocalWords:  MMX MII valkyrie mdacon vdolive VDOLive cuseeme CU hippi rrunner
+# LocalWords:  SeeMe ipmasqadm juanjox ipmarkfw markfw TNCs Microdyne rhine lib
+# LocalWords:  libc jsX gamepad gameport CHF FCS FPGaming MadCatz ASSASIN GrIP
+# LocalWords:  Assasin gamepads GamePad PDPI gamecards gamecard WingMan BSP WCS
+# LocalWords:  ThunderPad CyberMan SideWinder ThrustMaster DirectConnect NES XF
+# LocalWords:  Millenium SNES PSX Multisystem Nintendo PlayStation Amstrad CPC
+# LocalWords:  Sega TurboGraFX Steffen Schwenke Multiststem PDIF FIFOSIZE EPLUS
+# LocalWords:  PowerUP RoadRunner tahallah dos functionkey setterm imladris Woz
+# LocalWords:  PowerMacs Winbond Algorithmics ALGOR algor ECOFF IRIX SGI SGI's
+# LocalWords:  gfx virtualized Xpmac mklinux XFree FBDev Woodhouse mvhi Seeq fp
+# LocalWords:  SGISEEQ HIgh ADB ADBMOUSE crosscompiler CROSSCOMPILE FPE GDB gdb
+# LocalWords:  JOYPORT rp spoofing DawiControl NOGENSUPP EEPROM HSSI Alessandro
+# LocalWords:  singleprocessor tex MATHEMU FRIQ Maxell friq Alcor XLT AlphaBook
+# LocalWords:  AlphaPCI DP LX Miata Mikasa Noritake RPX UX BX Takara EV PRIMO
+# LocalWords:  TSC Matrox Productiva matroxfb matrox multihead ia linuxhq MFW
+# LocalWords:  mfw AAA MCS Initio XXU initio imm AutoDetect IZIP CTR usec HDLC
+# LocalWords:  COSA SRP muni cz kas cosa Alteon AceNIC acenic VTOC OSes GMT SAx
+# LocalWords:  Inspiron localtime INTS Thinkpads Ralf Brown's Flightstick NNN
+# LocalWords:  Xterminator Blackhawk NN mpu ioports DCA HPDCA HPLANCE DIO Corel
+# LocalWords:  GemTek gemtek CMDLINE IrDA PDA's irmanager irattach RR AVA DN rg
+# LocalWords:  uit dagb irda LSAP IrLMP RR's IrLAP IR alloc skb's kfree skb's
+# LocalWords:  GZIP IrLAN NetbeamIR ESI JetEye IrOBEX IrCOMM TTY's minicom dti
+# LocalWords:  ircomm ircomm pluto thiguchi IrTTY Linux's bps NetWinder MIR NSC
+# LocalWords:  ACTiSYS dongle dongles esi actisys IrMate tekram BVM MVME
+# LocalWords:  BVME BVME WRITETHROUGH copyback writethrough fwmark syncookie tu
+# LocalWords:  alphalinux GOBIOS csn chemnitz nat ACARD AMI MegaRAID megaraid
+# LocalWords:  QNXFS ISI isicom xterms Apollos VPN RCPCI rcpci sgi visws pcmcia
+# LocalWords:  IrLPT UIRCC Tecra Strebel jstrebel suse Eichwalder ke INI INIA
+# LocalWords:  FCP qlogicfc sym isapnp DTLK DoubleTalk rcsys dtlk DMAP SGIVW ar
+# LocalWords:  dmabuf EcoRadio MUTEFREQ GIrBIL girbil tepkom vol mha diplom PQS
+# LocalWords:  bmac Microgate SyncLink synclink hdlc excl ioaddr Tane tanep TCQ
+# LocalWords:  PDS SMALLDOS charsets bigfoot kernelfr mcs cls fw rsvp SKnet sk
+# LocalWords:  SKMC USB UHCI OHCI intel compaq usb ohci HCD Virt Compaq's hcd
+# LocalWords:  VROOTHUB KBD ARRs MCRs NWBUTTON nwbutton NUM WaveArtist APNE cpu
+# LocalWords:  apne blackhawke PlanB lu mlan planb NWFPE FPA nwfpe unbootable
+# LocalWords:  FPEmulator ds vmlinux initialization discardable pgtable PGT mdw
+# LocalWords:  quicklist pagetable arthur StrongARM podule podules Autodetect
+# LocalWords:  dodgy IrPORT irport Litelink litelink SuSE rtfm internet hda CY
+# LocalWords:  multmode DriveReady SeekComplete DriveStatusError miscompile AEC
+# LocalWords:  mainboard's Digital's alim FastTrak aec PIIXn piix Gayle Eyetech
+# LocalWords:  Catweasel IDEDOUBLER Powerbook Centris ICSIDE RapIDE OSM HDM IOP
+# LocalWords:  HDM's OSM's lan FibreChannel ECP autoprobe itg lbl ipmasq cjb IC
+# LocalWords:  bieringer Caulfield's dreamtime decnet SIOCFIGCONF SIOCGIFCONF
+# LocalWords:  rtnetlink Endnode Aironet Arlan Telxon ylenurme arlan ACB aeschi
+# LocalWords:  Sealevel sealevel Cyclom br wanconfig tarball conectiva cycsyn
+# LocalWords:  devel bazar cyclomx NetGear GA IBMOL Lanstreamer uhci eu efs CYZ
+# LocalWords:  olympic linuxtr usbcore acm EZUSB downloader EFS XFS INTR op IIC
+# LocalWords:  heine soundcore JavaStations JavaStation GemTeks TerraTec TODO
+# LocalWords:  ActiveRadio Standalone terratec Rolf Offermanns rolf offermanns
+# LocalWords:  Zoran ZR Buz LML CPQ DA cpqarray PPDEV deviceid vlp ppdev atyfb
+# LocalWords:  AcceleRAID eXtremeRAID NETFILTER Netfilter masqueraded netfilter
+# LocalWords:  kernelnotes Cardbus PCMCIA's CardBus clgenfb Permedia YAM MMAP
+# LocalWords:  mmapped ATM atm PVCs SVCs InARP ATMARP neighbour neighbours MPOA
+# LocalWords:  VCs ENI FPGA Tonga MMF MF UTP printks ZeitNet ZN ZATM uPD SAR PN
+# LocalWords:  approx NICStAR NICs ForeRunnerLE Madge Collage ATMizer Dxxxx VCI
+# LocalWords:  ServeRAID IPS ips ipslinux gzip BSDCOMP LZW RAYCS Interphase app
+# LocalWords:  Tachyon IPHASE Surfboard NextLevel SURFboard jacksonville Tigon
+# LocalWords:  fventuri adelphia siglercm linuxpower AceNICs Starfire starfire
+# LocalWords:  ISOC CPiA cpia uss ACPI UDF DirectCD udf CDRW's OSF Manx acpi DM
+# LocalWords:  Unixware cymru Computone IntelliPort Intelliport computone SI sx
+# LocalWords:  adbmouse DRI DRM dlabs GMX PLCs Applicom fieldbus applicom int
+# LocalWords:  VWSND eg ESSSOLO CFU CFNR scribed eiconctrl eicon hylafax KFPU
+# LocalWords:  EXTRAPREC fpu mainboards KHTTPD kHTTPd khttpd Xcelerator SBNI tw
+# LocalWords:  LOGIBUSMOUSE Granch granch sbni Raylink NOHIGHMEM Athlon SIM sim
+# LocalWords:  hpl Tourrilhes DuraLAN starfire Davicom davicom dmfe auk tms tr
+# LocalWords:  TokenExpress Belkin Peracom eTek DVDs infradead Cxxx Adlib AV ZX
+# LocalWords:  NeoMagic CPi CPt Celeron decapsulation Undeletion BFS bfs nVidia
+# LocalWords:  OnStream Irongate Riva phonedev QuickNet LineJack PhoneJack IXJ
+# LocalWords:  Quicknet PhoneJACK LineJACK ixj pnpdump Quicknet's Joandi SSID
+# LocalWords:  aironet quickconfig adhoc btw bap NONCS cardservices Xircom lin
+# LocalWords:  Netwave AirSurfer netwave HomePNA failover MVP iMacs ALi aktual
+# LocalWords:  Aladin HIDBP usbkbd KEYBDEV MOUSEDEV JOYDEV EVDEV UAB WhiteHEAT
+# LocalWords:  Handspring ov DABUSB URB URB's dabusb CRAMFS NFSv ELV IOAPIC WIP
+# LocalWords:  NLMv SMBus ALGOBIT algo PHILIPSPAR philips elv Velleman velleman
+# LocalWords:  ALGOPCF Elektor elektor CHARDEV dfx TDFX tdfx Extensa dof gravis
+# LocalWords:  assasin logitech Overdrive thrustmaster DWave Aureal magellan db
+# LocalWords:  SpaceTec SpaceOrb SpaceBall spaceorb FLX spaceball turbografx zr
+# LocalWords:  amiga ESS's WaveWatcher Maxi belkin RW's ata glx GART MPV Baget
+# LocalWords:  OpenGL Xserver agpgart HOTPLUG CyberPro Integraphics Netwinder
+# LocalWords:  aty FONTWIDTH eni zatm nicstar ForeRunner OC DECstations DEC's
+# LocalWords:  PHYsical SUNI reinsertion ChipSAR KVC PHY ClassID iphase iadbg
+# LocalWords:  DEVS FireWire PCILynx pcilynx LOCALRAM miro's DV RAWIO GRED Mk
+# LocalWords:  Diffserv DSMARK Ingress Qdisc TCINDEX TMSPCI tmspci Ringode JE
+# LocalWords:  MADGEMC madgemc TokenRing SMCTR TokenCard smctr Wacom Graphire
+# LocalWords:  mousedev ConnectTech HandSpring Xirlink IBMCAM ibmcam SN
+# LocalWords:  DEVICEFS yyy Cymraeg Dwave SIMM JSFLASH JavaStation's multilink
+# LocalWords:  nsc ircc DDB Vrc CMN TB PROMs Vino rivafb DDC Matroxes MGA TVO
+# LocalWords:  MAVEN fbdev crtc maven matroxset NTSC PCA SBA AAL SKFP DAS SAS
+# LocalWords:  skfp Intuos ADMtek's pegasus PLUSB plusb pointopoint mp rio Xeon
+# LocalWords:  DEVFS devfs dd bs EDSS german TELESPCI FRITZPCI HFC HFCS BDS HST
+# LocalWords:  ISURF ISAR Saphir HSTSAPHIR Telekom BKM Scitel Quadro SCT Gazel
+# LocalWords:  SP PRI Hypercope HYSDN Hypercope's hysdn IbssJoinNetTimeout FTDI
+# LocalWords:  ARCNet Keyspan PDA ADMtek sgalaxy sgbase opl mpuio mpuirq sbio
+# LocalWords:  sbirq sbdma gus uart mssio mssirq mssdma sscape maui mouirq iph
+# LocalWords:  CHDLC UPS's usbmouse wacom wmforce keybdev joydev fibre Trunking
+# LocalWords:  Etherchannel IOC Moxa Intellio moxa SmartIO mxser Mixcom EFI ir
+# LocalWords:  MIXCOMWD mixcomwd SENDCOMPLETE GMAC iBook gmac OAKNET oaknet PCG
+# LocalWords:  diffserv irlan irtty toshoboe IrCC Lifebook idex AUTODMA FIP Cxx
+# LocalWords:  Yenta Databook TCIC FMVJ fmvj NMCLAN LiveWire nmclan XIRC xirc
+# LocalWords:  loadkeys setfont shm SuperIO soc SOCAL socal FCAL fc fcal COMX
+# LocalWords:  MultiGate ITConsult comx CMX HiCOMX downloadable hw LoCOMX PROTO
+# LocalWords:  locomx MixCOM mixcom proto MyriCOM MYRI Sbus myri sbus IBMLS hme
+# LocalWords:  lanstreamer baseT HAPPYMEAL qfe sunhme SUNLANCE sunlance BigMAC
+# LocalWords:  SUNBMAC sunbmac QuadEthernet SUNQE qe FastEthernet sunqe DSB PTI
+# LocalWords:  DSBR dsbr procinfo QLOGICPTI qpti ptisp QLGC qlogicpti se LBA NF
+# LocalWords:  OPENPROMFS OpenPROM openpromfs OBP OpenBoot flashable Multiboard
+# LocalWords:  SPARCAUDIO SparcClassic Ultras DBRI Sparcbook sparcaudio SUNBPP
+# LocalWords:  UltraDMA WDC CRC CONNTRACK IPTABLES iptables nfmark interface's
+# LocalWords:  tdfxfb TNTx HGA hgafb VERBOSEDEBUG SunTrunking SunSoft XIRTULIP
+# LocalWords:  ethercards PNIC Macronix MXIC ASIX xircom Mustek MDC gphoto mdc
+# LocalWords:  CramFs Cramfs uid cramfs AVM's kernelcapi PCIV cdrdao Cdparanoia
+# LocalWords:  DMX Domex dmx wellington ftdi sio Accton Billington Corega FEter
+# LocalWords:  MELCO LUA PNA Linksys SNC chkdsk AWACS Webcam RAMFS Ramfs ramfs
+# LocalWords:  ramfiles MAKEDEV pty WDTPCI APA apa
+#
+# The following sets edit modes for GNU EMACS
+# Local Variables:
+# case-fold-search:nil
+# fill-prefix:"  "
+# adaptive-fill:nil
+# fill-column:70
+# End:
diff --git a/xenolinux-2.4.22-sparse/Makefile b/xenolinux-2.4.22-sparse/Makefile
new file mode 100644 (file)
index 0000000..5974b04
--- /dev/null
@@ -0,0 +1,584 @@
+VERSION = 2
+PATCHLEVEL = 4
+SUBLEVEL = 22
+EXTRAVERSION = -xeno
+
+KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
+
+ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
+
+# Xeno hack XXX
+ARCH    := xeno
+SUBARCH := i386
+
+KERNELPATH=kernel-$(shell echo $(KERNELRELEASE) | sed -e "s/-//g")
+
+CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
+         else if [ -x /bin/bash ]; then echo /bin/bash; \
+         else echo sh; fi ; fi)
+TOPDIR := $(shell /bin/pwd)
+
+HPATH          = $(TOPDIR)/include
+FINDHPATH      = $(HPATH)/asm $(HPATH)/linux $(HPATH)/scsi $(HPATH)/net $(HPATH)/math-emu
+
+HOSTCC         = gcc
+HOSTCFLAGS     = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
+
+CROSS_COMPILE  =
+
+#
+# Include the make variables (CC, etc...)
+#
+
+AS             = $(CROSS_COMPILE)as
+LD             = $(CROSS_COMPILE)ld
+CC             = $(CROSS_COMPILE)gcc
+CPP            = $(CC) -E
+AR             = $(CROSS_COMPILE)ar
+NM             = $(CROSS_COMPILE)nm
+STRIP          = $(CROSS_COMPILE)strip
+OBJCOPY                = $(CROSS_COMPILE)objcopy
+OBJDUMP                = $(CROSS_COMPILE)objdump
+MAKEFILES      = $(TOPDIR)/.config
+GENKSYMS       = /sbin/genksyms
+DEPMOD         = /sbin/depmod
+MODFLAGS       = -DMODULE
+CFLAGS_KERNEL  =
+PERL           = perl
+AWK            = awk
+RPM            := $(shell if [ -x "/usr/bin/rpmbuild" ]; then echo rpmbuild; \
+                       else echo rpm; fi)
+
+export VERSION PATCHLEVEL SUBLEVEL EXTRAVERSION KERNELRELEASE ARCH \
+       CONFIG_SHELL TOPDIR HPATH HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC \
+       CPP AR NM STRIP OBJCOPY OBJDUMP MAKE MAKEFILES GENKSYMS MODFLAGS PERL AWK
+
+all:   do-it-all
+
+#
+# Make "config" the default target if there is no configuration file or
+# "depend" the target if there is no top-level dependency information.
+#
+
+ifeq (.config,$(wildcard .config))
+include .config
+ifeq (.depend,$(wildcard .depend))
+include .depend
+do-it-all:     Version vmlinux
+else
+CONFIGURATION = depend
+do-it-all:     depend
+endif
+else
+CONFIGURATION = config
+do-it-all:     config
+endif
+
+#
+# INSTALL_PATH specifies where to place the updated kernel and system map
+# images.  Uncomment if you want to place them anywhere other than root.
+#
+
+#export        INSTALL_PATH=/boot
+
+#
+# INSTALL_MOD_PATH specifies a prefix to MODLIB for module directory
+# relocations required by build roots.  This is not defined in the
+# makefile but the arguement can be passed to make if needed.
+#
+
+MODLIB := $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)
+export MODLIB
+
+#
+# standard CFLAGS
+#
+
+CPPFLAGS := -D__KERNEL__ -I$(HPATH)
+
+CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes -Wno-trigraphs -O2 \
+         -fno-strict-aliasing -fno-common
+ifndef CONFIG_FRAME_POINTER
+CFLAGS += -fomit-frame-pointer
+endif
+AFLAGS := -D__ASSEMBLY__ $(CPPFLAGS)
+
+#
+# ROOT_DEV specifies the default root-device when making the image.
+# This can be either FLOPPY, CURRENT, /dev/xxxx or empty, in which case
+# the default of FLOPPY is used by 'build'.
+# This is i386 specific.
+#
+
+export ROOT_DEV = CURRENT
+
+#
+# If you want to preset the SVGA mode, uncomment the next line and
+# set SVGA_MODE to whatever number you want.
+# Set it to -DSVGA_MODE=NORMAL_VGA if you just want the EGA/VGA mode.
+# The number is the same as you would ordinarily press at bootup.
+# This is i386 specific.
+#
+
+export SVGA_MODE = -DSVGA_MODE=NORMAL_VGA
+
+#
+# If you want the RAM disk device, define this to be the size in blocks.
+# This is i386 specific.
+#
+
+#export RAMDISK = -DRAMDISK=512
+
+CORE_FILES     =kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o
+NETWORKS       =net/network.o
+
+LIBS           =$(TOPDIR)/lib/lib.a
+SUBDIRS                =kernel drivers mm fs net ipc lib crypto
+
+DRIVERS-n :=
+DRIVERS-y :=
+DRIVERS-m :=
+DRIVERS-  :=
+
+DRIVERS-$(CONFIG_ACPI_BOOT) += drivers/acpi/acpi.o
+DRIVERS-$(CONFIG_PARPORT) += drivers/parport/driver.o
+DRIVERS-y += drivers/char/char.o \
+       drivers/block/block.o \
+       drivers/misc/misc.o \
+       drivers/net/net.o
+DRIVERS-$(CONFIG_AGP) += drivers/char/agp/agp.o
+DRIVERS-$(CONFIG_DRM_NEW) += drivers/char/drm/drm.o
+DRIVERS-$(CONFIG_DRM_OLD) += drivers/char/drm-4.0/drm.o
+DRIVERS-$(CONFIG_NUBUS) += drivers/nubus/nubus.a
+DRIVERS-$(CONFIG_NET_FC) += drivers/net/fc/fc.o
+DRIVERS-$(CONFIG_DEV_APPLETALK) += drivers/net/appletalk/appletalk.o
+DRIVERS-$(CONFIG_TR) += drivers/net/tokenring/tr.o
+DRIVERS-$(CONFIG_WAN) += drivers/net/wan/wan.o
+DRIVERS-$(CONFIG_ARCNET) += drivers/net/arcnet/arcnetdrv.o
+DRIVERS-$(CONFIG_ATM) += drivers/atm/atm.o
+DRIVERS-$(CONFIG_IDE) += drivers/ide/idedriver.o
+DRIVERS-$(CONFIG_FC4) += drivers/fc4/fc4.a
+DRIVERS-$(CONFIG_SCSI) += drivers/scsi/scsidrv.o
+DRIVERS-$(CONFIG_FUSION_BOOT) += drivers/message/fusion/fusion.o
+DRIVERS-$(CONFIG_IEEE1394) += drivers/ieee1394/ieee1394drv.o
+
+ifneq ($(CONFIG_CD_NO_IDESCSI)$(CONFIG_BLK_DEV_IDECD)$(CONFIG_BLK_DEV_SR)$(CONFIG_PARIDE_PCD),)
+DRIVERS-y += drivers/cdrom/driver.o
+endif
+
+DRIVERS-$(CONFIG_SOUND) += drivers/sound/sounddrivers.o
+DRIVERS-$(CONFIG_PCI) += drivers/pci/driver.o
+DRIVERS-$(CONFIG_MTD) += drivers/mtd/mtdlink.o
+DRIVERS-$(CONFIG_PCMCIA) += drivers/pcmcia/pcmcia.o
+DRIVERS-$(CONFIG_NET_PCMCIA) += drivers/net/pcmcia/pcmcia_net.o
+DRIVERS-$(CONFIG_NET_WIRELESS) += drivers/net/wireless/wireless_net.o
+DRIVERS-$(CONFIG_PCMCIA_CHRDEV) += drivers/char/pcmcia/pcmcia_char.o
+DRIVERS-$(CONFIG_DIO) += drivers/dio/dio.a
+DRIVERS-$(CONFIG_SBUS) += drivers/sbus/sbus_all.o
+DRIVERS-$(CONFIG_ZORRO) += drivers/zorro/driver.o
+DRIVERS-$(CONFIG_FC4) += drivers/fc4/fc4.a
+DRIVERS-$(CONFIG_PPC32) += drivers/macintosh/macintosh.o
+DRIVERS-$(CONFIG_MAC) += drivers/macintosh/macintosh.o
+DRIVERS-$(CONFIG_ISAPNP) += drivers/pnp/pnp.o
+DRIVERS-$(CONFIG_SGI_IP22) += drivers/sgi/sgi.a
+DRIVERS-$(CONFIG_VT) += drivers/video/video.o
+DRIVERS-$(CONFIG_PARIDE) += drivers/block/paride/paride.a
+DRIVERS-$(CONFIG_HAMRADIO) += drivers/net/hamradio/hamradio.o
+DRIVERS-$(CONFIG_TC) += drivers/tc/tc.a
+DRIVERS-$(CONFIG_USB) += drivers/usb/usbdrv.o
+DRIVERS-y +=drivers/media/media.o
+DRIVERS-$(CONFIG_INPUT) += drivers/input/inputdrv.o
+DRIVERS-$(CONFIG_HIL) += drivers/hil/hil.o
+DRIVERS-$(CONFIG_I2O) += drivers/message/i2o/i2o.o
+DRIVERS-$(CONFIG_IRDA) += drivers/net/irda/irda.o
+DRIVERS-$(CONFIG_I2C) += drivers/i2c/i2c.o
+DRIVERS-$(CONFIG_PHONE) += drivers/telephony/telephony.o
+DRIVERS-$(CONFIG_MD) += drivers/md/mddev.o
+DRIVERS-$(CONFIG_GSC) += drivers/gsc/gscbus.o
+DRIVERS-$(CONFIG_BLUEZ) += drivers/bluetooth/bluetooth.o
+DRIVERS-$(CONFIG_HOTPLUG_PCI) += drivers/hotplug/vmlinux-obj.o
+DRIVERS-$(CONFIG_ISDN_BOOL) += drivers/isdn/vmlinux-obj.o
+DRIVERS-$(CONFIG_CRYPTO) += crypto/crypto.o
+
+DRIVERS := $(DRIVERS-y)
+
+
+# files removed with 'make clean'
+CLEAN_FILES = \
+       kernel/ksyms.lst include/linux/compile.h \
+       vmlinux System.map \
+       .tmp* \
+       drivers/char/consolemap_deftbl.c drivers/video/promcon_tbl.c \
+       drivers/char/conmakehash \
+       drivers/char/drm/*-mod.c \
+       drivers/pci/devlist.h drivers/pci/classlist.h drivers/pci/gen-devlist \
+       drivers/zorro/devlist.h drivers/zorro/gen-devlist \
+       drivers/sound/bin2hex drivers/sound/hex2hex \
+       drivers/atm/fore200e_mkfirm drivers/atm/{pca,sba}*{.bin,.bin1,.bin2} \
+       drivers/scsi/aic7xxx/aicasm/aicasm \
+       drivers/scsi/aic7xxx/aicasm/aicasm_gram.c \
+       drivers/scsi/aic7xxx/aicasm/aicasm_gram.h \
+       drivers/scsi/aic7xxx/aicasm/aicasm_macro_gram.c \
+       drivers/scsi/aic7xxx/aicasm/aicasm_macro_gram.h \
+       drivers/scsi/aic7xxx/aicasm/aicasm_macro_scan.c \
+       drivers/scsi/aic7xxx/aicasm/aicasm_scan.c \
+       drivers/scsi/aic7xxx/aicasm/aicdb.h \
+       drivers/scsi/aic7xxx/aicasm/y.tab.h \
+       drivers/scsi/53c700_d.h \
+       net/khttpd/make_times_h \
+       net/khttpd/times.h \
+       submenu*
+# directories removed with 'make clean'
+CLEAN_DIRS = \
+       modules
+
+# files removed with 'make mrproper'
+MRPROPER_FILES = \
+       include/linux/autoconf.h include/linux/version.h \
+       lib/crc32table.h lib/gen_crc32table \
+       drivers/net/hamradio/soundmodem/sm_tbl_{afsk1200,afsk2666,fsk9600}.h \
+       drivers/net/hamradio/soundmodem/sm_tbl_{hapn4800,psk4800}.h \
+       drivers/net/hamradio/soundmodem/sm_tbl_{afsk2400_7,afsk2400_8}.h \
+       drivers/net/hamradio/soundmodem/gentbl \
+       drivers/sound/*_boot.h drivers/sound/.*.boot \
+       drivers/sound/msndinit.c \
+       drivers/sound/msndperm.c \
+       drivers/sound/pndsperm.c \
+       drivers/sound/pndspini.c \
+       drivers/atm/fore200e_*_fw.c drivers/atm/.fore200e_*.fw \
+       .version .config* config.in config.old \
+       scripts/tkparse scripts/kconfig.tk scripts/kconfig.tmp \
+       scripts/lxdialog/*.o scripts/lxdialog/lxdialog \
+       .menuconfig.log \
+       include/asm \
+       .hdepend scripts/mkdep scripts/split-include scripts/docproc \
+       $(TOPDIR)/include/linux/modversions.h \
+       kernel.spec
+
+# directories removed with 'make mrproper'
+MRPROPER_DIRS = \
+       include/config \
+       $(TOPDIR)/include/linux/modules
+
+
+include arch/$(ARCH)/Makefile
+
+# Extra cflags for kbuild 2.4.  The default is to forbid includes by kernel code
+# from user space headers.  Some UML code requires user space headers, in the
+# UML Makefiles add 'kbuild_2_4_nostdinc :=' before include Rules.make.  No
+# other kernel code should include user space headers, if you need
+# 'kbuild_2_4_nostdinc :=' or -I/usr/include for kernel code and you are not UML
+# then your code is broken!  KAO.
+
+kbuild_2_4_nostdinc    := -nostdinc -iwithprefix include
+export kbuild_2_4_nostdinc
+
+export CPPFLAGS CFLAGS CFLAGS_KERNEL AFLAGS AFLAGS_KERNEL
+
+export NETWORKS DRIVERS LIBS HEAD LDFLAGS LINKFLAGS MAKEBOOT ASFLAGS
+
+.S.s:
+       $(CPP) $(AFLAGS) $(AFLAGS_KERNEL) -traditional -o $*.s $<
+.S.o:
+       $(CC) $(AFLAGS) $(AFLAGS_KERNEL) -traditional -c -o $*.o $<
+
+Version: dummy
+       @rm -f include/linux/compile.h
+
+boot: vmlinux
+       @$(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" -C arch/$(ARCH)/boot
+
+vmlinux: include/linux/version.h $(CONFIGURATION) init/main.o init/version.o init/do_mounts.o linuxsubdirs
+       $(LD) $(LINKFLAGS) $(HEAD) init/main.o init/version.o init/do_mounts.o \
+               --start-group \
+               $(CORE_FILES) \
+               $(DRIVERS) \
+               $(NETWORKS) \
+               $(LIBS) \
+               --end-group \
+               -o vmlinux
+       $(NM) vmlinux | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map
+
+symlinks:
+       rm -f include/asm
+       ( cd include ; ln -sf asm-$(ARCH) asm)
+       @if [ ! -d include/linux/modules ]; then \
+               mkdir include/linux/modules; \
+       fi
+
+oldconfig: symlinks
+       $(CONFIG_SHELL) scripts/Configure -d arch/$(ARCH)/config.in
+
+xconfig: symlinks
+       $(MAKE) -C scripts kconfig.tk
+       wish -f scripts/kconfig.tk
+
+menuconfig: include/linux/version.h symlinks
+       $(MAKE) -C scripts/lxdialog all
+       $(CONFIG_SHELL) scripts/Menuconfig arch/$(ARCH)/config.in
+
+config: symlinks
+       $(CONFIG_SHELL) scripts/Configure arch/$(ARCH)/config.in
+
+include/config/MARKER: scripts/split-include include/linux/autoconf.h
+       scripts/split-include include/linux/autoconf.h include/config
+       @ touch include/config/MARKER
+
+linuxsubdirs: $(patsubst %, _dir_%, $(SUBDIRS))
+
+$(patsubst %, _dir_%, $(SUBDIRS)) : dummy include/linux/version.h include/config/MARKER
+       $(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" -C $(patsubst _dir_%, %, $@)
+
+$(TOPDIR)/include/linux/version.h: include/linux/version.h
+$(TOPDIR)/include/linux/compile.h: include/linux/compile.h
+
+newversion:
+       . scripts/mkversion > .tmpversion
+       @mv -f .tmpversion .version
+
+uts_len                := 64
+uts_truncate   := sed -e 's/\(.\{1,$(uts_len)\}\).*/\1/'
+
+include/linux/compile.h: $(CONFIGURATION) include/linux/version.h newversion
+       @echo -n \#`cat .version` > .ver1
+       @if [ -n "$(CONFIG_SMP)" ] ; then echo -n " SMP" >> .ver1; fi
+       @if [ -f .name ]; then  echo -n \-`cat .name` >> .ver1; fi
+       @LANG=C echo ' '`date` >> .ver1
+       @echo \#define UTS_VERSION \"`cat .ver1 | $(uts_truncate)`\" > .ver
+       @LANG=C echo \#define LINUX_COMPILE_TIME \"`date +%T`\" >> .ver
+       @echo \#define LINUX_COMPILE_BY \"`whoami`\" >> .ver
+       @echo \#define LINUX_COMPILE_HOST \"`hostname | $(uts_truncate)`\" >> .ver
+       @([ -x /bin/dnsdomainname ] && /bin/dnsdomainname > .ver1) || \
+        ([ -x /bin/domainname ] && /bin/domainname > .ver1) || \
+        echo > .ver1
+       @echo \#define LINUX_COMPILE_DOMAIN \"`cat .ver1 | $(uts_truncate)`\" >> .ver
+       @echo \#define LINUX_COMPILER \"`$(CC) $(CFLAGS) -v 2>&1 | tail -n 1`\" >> .ver
+       @mv -f .ver $@
+       @rm -f .ver1
+
+include/linux/version.h: ./Makefile
+       @expr length "$(KERNELRELEASE)" \<= $(uts_len) > /dev/null || \
+         (echo KERNELRELEASE \"$(KERNELRELEASE)\" exceeds $(uts_len) characters >&2; false)
+       @echo \#define UTS_RELEASE \"$(KERNELRELEASE)\" > .ver
+       @echo \#define LINUX_VERSION_CODE `expr $(VERSION) \\* 65536 + $(PATCHLEVEL) \\* 256 + $(SUBLEVEL)` >> .ver
+       @echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))' >>.ver
+       @mv -f .ver $@
+
+comma  := ,
+
+init/version.o: init/version.c include/linux/compile.h include/config/MARKER
+       $(CC) $(CFLAGS) $(CFLAGS_KERNEL) -DUTS_MACHINE='"$(SUBARCH)"' -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F))) -c -o init/version.o init/version.c
+
+init/main.o: init/main.c include/config/MARKER
+       $(CC) $(CFLAGS) $(CFLAGS_KERNEL) $(PROFILING) -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F))) -c -o $@ $<
+
+init/do_mounts.o: init/do_mounts.c include/config/MARKER
+       $(CC) $(CFLAGS) $(CFLAGS_KERNEL) $(PROFILING) -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F))) -c -o $@ $<
+
+fs lib mm ipc kernel drivers net: dummy
+       $(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" $(subst $@, _dir_$@, $@)
+
+TAGS: dummy
+       { find include/asm-${ARCH} -name '*.h' -print ; \
+       find include -type d \( -name "asm-*" -o -name config \) -prune -o -name '*.h' -print ; \
+       find $(SUBDIRS) init arch/${ARCH} -name '*.[chS]' ; } | grep -v SCCS | grep -v '\.svn' | etags -
+
+# Exuberant ctags works better with -I
+tags: dummy
+       CTAGSF=`ctags --version | grep -i exuberant >/dev/null && echo "-I __initdata,__exitdata,EXPORT_SYMBOL,EXPORT_SYMBOL_NOVERS"`; \
+       ctags $$CTAGSF `find include/asm-$(ARCH) -name '*.h'` && \
+       find include -type d \( -name "asm-*" -o -name config \) -prune -o -name '*.h' -print | xargs ctags $$CTAGSF -a && \
+       find $(SUBDIRS) init -name '*.[ch]' | xargs ctags $$CTAGSF -a
+
+ifdef CONFIG_MODULES
+ifdef CONFIG_MODVERSIONS
+MODFLAGS += -DMODVERSIONS -include $(HPATH)/linux/modversions.h
+endif
+
+.PHONY: modules
+modules: $(patsubst %, _mod_%, $(SUBDIRS))
+
+.PHONY: $(patsubst %, _mod_%, $(SUBDIRS))
+$(patsubst %, _mod_%, $(SUBDIRS)) : include/linux/version.h include/config/MARKER
+       $(MAKE) -C $(patsubst _mod_%, %, $@) CFLAGS="$(CFLAGS) $(MODFLAGS)" MAKING_MODULES=1 modules
+
+.PHONY: modules_install
+modules_install: _modinst_ $(patsubst %, _modinst_%, $(SUBDIRS)) _modinst_post
+
+.PHONY: _modinst_
+_modinst_:
+       @rm -rf $(MODLIB)/kernel
+       @rm -f $(MODLIB)/build
+       @mkdir -p $(MODLIB)/kernel
+       @ln -s $(TOPDIR) $(MODLIB)/build
+
+# If System.map exists, run depmod.  This deliberately does not have a
+# dependency on System.map since that would run the dependency tree on
+# vmlinux.  This depmod is only for convenience to give the initial
+# boot a modules.dep even before / is mounted read-write.  However the
+# boot script depmod is the master version.
+ifeq "$(strip $(INSTALL_MOD_PATH))" ""
+depmod_opts    :=
+else
+depmod_opts    := -b $(INSTALL_MOD_PATH) -r
+endif
+.PHONY: _modinst_post
+_modinst_post: _modinst_post_pcmcia
+#      if [ -r System.map ]; then $(DEPMOD) -ae -F System.map $(depmod_opts) $(KERNELRELEASE); fi
+
+# Backwards compatibilty symlinks for people still using old versions
+# of pcmcia-cs with hard coded pathnames on insmod.  Remove
+# _modinst_post_pcmcia for kernel 2.4.1.
+.PHONY: _modinst_post_pcmcia
+_modinst_post_pcmcia:
+       cd $(MODLIB); \
+       mkdir -p pcmcia; \
+       find kernel -path '*/pcmcia/*' -name '*.o' | xargs -i -r ln -sf ../{} pcmcia
+
+.PHONY: $(patsubst %, _modinst_%, $(SUBDIRS))
+$(patsubst %, _modinst_%, $(SUBDIRS)) :
+       $(MAKE) -C $(patsubst _modinst_%, %, $@) modules_install
+
+# modules disabled....
+
+else
+modules modules_install: dummy
+       @echo
+       @echo "The present kernel configuration has modules disabled."
+       @echo "Type 'make config' and enable loadable module support."
+       @echo "Then build a kernel with module support enabled."
+       @echo
+       @exit 1
+endif
+
+clean: archclean
+       find . \( -name '*.[oas]' -o -name core -o -name '.*.flags' \) -type f -print \
+               | grep -v lxdialog/ | xargs rm -f
+       rm -f $(CLEAN_FILES)
+       rm -rf $(CLEAN_DIRS)
+       $(MAKE) -C Documentation/DocBook clean
+
+mrproper: clean archmrproper
+       find . \( -size 0 -o -name .depend \) -type f -print | xargs rm -f
+       rm -f $(MRPROPER_FILES)
+       rm -rf $(MRPROPER_DIRS)
+       $(MAKE) -C Documentation/DocBook mrproper
+
+distclean: mrproper
+       rm -f core `find . \( -not -type d \) -and \
+               \( -name '*.orig' -o -name '*.rej' -o -name '*~' \
+               -o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
+               -o -name '.*.rej' -o -name '.SUMS' -o -size 0 \) -type f -print` TAGS tags
+
+backup: mrproper
+       cd .. && tar cf - linux/ | gzip -9 > backup.gz
+       sync
+
+sgmldocs: 
+       chmod 755 $(TOPDIR)/scripts/docgen
+       chmod 755 $(TOPDIR)/scripts/gen-all-syms
+       chmod 755 $(TOPDIR)/scripts/kernel-doc
+       $(MAKE) -C $(TOPDIR)/Documentation/DocBook books
+
+psdocs: sgmldocs
+       $(MAKE) -C Documentation/DocBook ps
+
+pdfdocs: sgmldocs
+       $(MAKE) -C Documentation/DocBook pdf
+
+htmldocs: sgmldocs
+       $(MAKE) -C Documentation/DocBook html
+
+mandocs:
+       chmod 755 $(TOPDIR)/scripts/kernel-doc
+       chmod 755 $(TOPDIR)/scripts/split-man
+       $(MAKE) -C Documentation/DocBook man
+
+sums:
+       find . -type f -print | sort | xargs sum > .SUMS
+
+dep-files: scripts/mkdep archdep include/linux/version.h
+       rm -f .depend .hdepend
+       $(MAKE) $(patsubst %,_sfdep_%,$(SUBDIRS)) _FASTDEP_ALL_SUB_DIRS="$(SUBDIRS)"
+ifdef CONFIG_MODVERSIONS
+       $(MAKE) update-modverfile
+endif
+       scripts/mkdep -- `find $(FINDHPATH) \( -name SCCS -o -name .svn \) -prune -o -follow -name \*.h ! -name modversions.h -print` > .hdepend
+       scripts/mkdep -- init/*.c > .depend
+
+ifdef CONFIG_MODVERSIONS
+MODVERFILE := $(TOPDIR)/include/linux/modversions.h
+else
+MODVERFILE :=
+endif
+export MODVERFILE
+
+depend dep: dep-files
+
+checkconfig:
+       find * -name '*.[hcS]' -type f -print | sort | xargs $(PERL) -w scripts/checkconfig.pl
+
+checkhelp:
+       find * -name [cC]onfig.in -print | sort | xargs $(PERL) -w scripts/checkhelp.pl
+
+checkincludes:
+       find * -name '*.[hcS]' -type f -print | sort | xargs $(PERL) -w scripts/checkincludes.pl
+
+ifdef CONFIGURATION
+..$(CONFIGURATION):
+       @echo
+       @echo "You have a bad or nonexistent" .$(CONFIGURATION) ": running 'make" $(CONFIGURATION)"'"
+       @echo
+       $(MAKE) $(CONFIGURATION)
+       @echo
+       @echo "Successful. Try re-making (ignore the error that follows)"
+       @echo
+       exit 1
+
+#dummy: ..$(CONFIGURATION)
+dummy:
+
+else
+
+dummy:
+
+endif
+
+include Rules.make
+
+#
+# This generates dependencies for the .h files.
+#
+
+scripts/mkdep: scripts/mkdep.c
+       $(HOSTCC) $(HOSTCFLAGS) -o scripts/mkdep scripts/mkdep.c
+
+scripts/split-include: scripts/split-include.c
+       $(HOSTCC) $(HOSTCFLAGS) -o scripts/split-include scripts/split-include.c
+
+#
+# RPM target
+#
+#      If you do a make spec before packing the tarball you can rpm -ta it
+#
+spec:
+       . scripts/mkspec >kernel.spec
+
+#
+#      Build a tar ball, generate an rpm from it and pack the result
+#      There arw two bits of magic here
+#      1) The use of /. to avoid tar packing just the symlink
+#      2) Removing the .dep files as they have source paths in them that
+#         will become invalid
+#
+rpm:   clean spec
+       find . \( -size 0 -o -name .depend -o -name .hdepend \) -type f -print | xargs rm -f
+       set -e; \
+       cd $(TOPDIR)/.. ; \
+       ln -sf $(TOPDIR) $(KERNELPATH) ; \
+       tar -cvz --exclude CVS -f $(KERNELPATH).tar.gz $(KERNELPATH)/. ; \
+       rm $(KERNELPATH) ; \
+       cd $(TOPDIR) ; \
+       . scripts/mkversion > .version ; \
+       $(RPM) -ta $(TOPDIR)/../$(KERNELPATH).tar.gz ; \
+       rm $(TOPDIR)/../$(KERNELPATH).tar.gz
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/Makefile b/xenolinux-2.4.22-sparse/arch/xeno/Makefile
new file mode 100644 (file)
index 0000000..89777dc
--- /dev/null
@@ -0,0 +1,107 @@
+#
+# xeno/Makefile
+#
+# This file is included by the global makefile so that you can add your own
+# architecture-specific flags and dependencies. Remember to do have actions
+# for "archclean" and "archdep" for cleaning up and making dependencies for
+# this architecture
+#
+# This file is subject to the terms and conditions of the GNU General Public
+# License.  See the file "COPYING" in the main directory of this archive
+# for more details.
+#
+# Copyright (C) 1994 by Linus Torvalds
+#
+# 19990713  Artur Skawina <skawina@geocities.com>
+#           Added '-march' and '-mpreferred-stack-boundary' support
+#
+
+LD=$(CROSS_COMPILE)ld -m elf_i386
+OBJCOPY=$(CROSS_COMPILE)objcopy -O binary -R .note -R .comment -S
+LDFLAGS=-e stext
+LINKFLAGS =-T $(TOPDIR)/arch/xeno/vmlinux.lds $(LDFLAGS)
+
+CFLAGS += -pipe
+
+check_gcc = $(shell if $(CC) $(1) -S -o /dev/null -xc /dev/null > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi)
+
+# prevent gcc from keeping the stack 16 byte aligned
+CFLAGS += $(call check_gcc,-mpreferred-stack-boundary=2,)
+
+ifdef CONFIG_M686
+CFLAGS += -march=i686
+endif
+
+ifdef CONFIG_MPENTIUMIII
+CFLAGS += -march=i686
+endif
+
+ifdef CONFIG_MPENTIUM4
+CFLAGS += -march=i686
+endif
+
+ifdef CONFIG_MK7
+CFLAGS += $(call check_gcc,-march=athlon,-march=i686 -malign-functions=4)
+endif
+
+HEAD := arch/xeno/kernel/head.o arch/xeno/kernel/init_task.o
+
+SUBDIRS += arch/xeno/kernel arch/xeno/mm arch/xeno/lib
+SUBDIRS += arch/xeno/drivers/console arch/xeno/drivers/network
+SUBDIRS += arch/xeno/drivers/block arch/xeno/drivers/balloon
+ifdef CONFIG_XENO_PRIV
+SUBDIRS += arch/xeno/drivers/dom0 
+endif
+
+CORE_FILES += arch/xeno/kernel/kernel.o arch/xeno/mm/mm.o
+CORE_FILES += arch/xeno/drivers/console/con.o
+CORE_FILES += arch/xeno/drivers/block/blk.o
+CORE_FILES += arch/xeno/drivers/network/net.o
+ifdef CONFIG_XENO_PRIV
+CORE_FILES += arch/xeno/drivers/dom0/dom0.o
+endif
+CORE_FILES += arch/xeno/drivers/balloon/balloon_driver.o
+LIBS := $(TOPDIR)/arch/xeno/lib/lib.a $(LIBS) $(TOPDIR)/arch/xeno/lib/lib.a
+
+arch/xeno/kernel: dummy
+       $(MAKE) linuxsubdirs SUBDIRS=arch/xeno/kernel
+
+arch/xeno/mm: dummy
+       $(MAKE) linuxsubdirs SUBDIRS=arch/xeno/mm
+
+arch/xeno/drivers/console: dummy
+       $(MAKE) linuxsubdirs SUBDIRS=arch/xeno/drivers/console
+
+arch/xeno/drivers/network: dummy
+       $(MAKE) linuxsubdirs SUBDIRS=arch/xeno/drivers/network
+
+arch/xeno/drivers/block: dummy
+       $(MAKE) linuxsubdirs SUBDIRS=arch/xeno/drivers/block
+
+arch/xeno/drivers/dom0: dummy
+       $(MAKE) linuxsubdirs SUBDIRS=arch/xeno/drivers/dom0
+
+arch/xeno/drivers/balloon: dummy
+       $(MAKE) linuxsubdirs SUBDIRS=arch/xeno/drivers/balloon
+
+MAKEBOOT = $(MAKE) -C arch/$(ARCH)/boot
+
+vmlinux: arch/xeno/vmlinux.lds
+
+FORCE: ;
+
+.PHONY: bzImage compressed clean archclean archmrproper archdep
+
+bzImage: vmlinux
+       @$(MAKEBOOT) image.gz
+
+install: bzImage
+       cp -a arch/$(ARCH)/boot/image.gz ../install/boot/xenolinux.gz
+
+archclean:
+       @$(MAKEBOOT) clean
+
+archmrproper:
+
+archdep:
+       @$(MAKEBOOT) dep
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/boot/Makefile b/xenolinux-2.4.22-sparse/arch/xeno/boot/Makefile
new file mode 100644 (file)
index 0000000..252daf5
--- /dev/null
@@ -0,0 +1,22 @@
+#
+# arch/xeno/boot/Makefile
+#
+
+image.gz: image
+       gzip -f -9 < $< > $@
+
+image: $(TOPDIR)/vmlinux
+       # Guest OS header -- first 8 bytes are identifier 'XenoGues'.
+       echo -e -n 'XenoGues' >$@ 
+       # Guest OS header -- next 4 bytes are load address (0xC0000000).
+       echo -e -n '\000\000\000\300' >>$@
+       $(OBJCOPY) $< image.body
+       # Guest OS header is immediately followed by raw OS image.
+       # Start address must be at byte 0.
+       cat image.body >>$@
+       rm -f image.body
+
+dep:
+
+clean:
+       rm -f image image.gz
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/config.in b/xenolinux-2.4.22-sparse/arch/xeno/config.in
new file mode 100644 (file)
index 0000000..67bdbb8
--- /dev/null
@@ -0,0 +1,173 @@
+#
+# For a description of the syntax of this configuration file,
+# see Documentation/kbuild/config-language.txt.
+#
+mainmenu_name "Linux Kernel Configuration"
+
+define_bool CONFIG_XENO y
+
+define_bool CONFIG_X86 y
+define_bool CONFIG_ISA y
+define_bool CONFIG_SBUS n
+
+define_bool CONFIG_UID16 y
+
+mainmenu_option next_comment
+comment 'Privileged guest OS'
+bool 'Support for privileged operations (domain 0)' CONFIG_XENO_PRIV
+endmenu
+
+mainmenu_option next_comment
+comment 'Code maturity level options'
+bool 'Prompt for development and/or incomplete code/drivers' CONFIG_EXPERIMENTAL
+endmenu
+
+mainmenu_option next_comment
+comment 'Loadable module support'
+bool 'Enable loadable module support' CONFIG_MODULES
+if [ "$CONFIG_MODULES" = "y" ]; then
+   bool '  Set version information on all module symbols' CONFIG_MODVERSIONS
+   bool '  Kernel module loader' CONFIG_KMOD
+fi
+endmenu
+
+mainmenu_option next_comment
+comment 'Processor type and features'
+choice 'Processor family' \
+       "Pentium-Pro/Celeron/Pentium-II         CONFIG_M686 \
+        Pentium-III/Celeron(Coppermine)        CONFIG_MPENTIUMIII \
+        Pentium-4                              CONFIG_MPENTIUM4 \
+        Athlon/Duron/K7                        CONFIG_MK7" Pentium-Pro
+
+   define_bool CONFIG_X86_WP_WORKS_OK y
+   define_bool CONFIG_X86_INVLPG y
+   define_bool CONFIG_X86_CMPXCHG y
+   define_bool CONFIG_X86_XADD y
+   define_bool CONFIG_X86_BSWAP y
+   define_bool CONFIG_X86_POPAD_OK y
+   define_bool CONFIG_RWSEM_GENERIC_SPINLOCK n
+   define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM y
+
+   define_bool CONFIG_X86_GOOD_APIC y
+   define_bool CONFIG_X86_PGE y
+   define_bool CONFIG_X86_USE_PPRO_CHECKSUM y
+   define_bool CONFIG_X86_TSC y
+
+if [ "$CONFIG_M686" = "y" ]; then
+   define_int  CONFIG_X86_L1_CACHE_SHIFT 5
+fi
+if [ "$CONFIG_MPENTIUMIII" = "y" ]; then
+   define_int  CONFIG_X86_L1_CACHE_SHIFT 5
+fi
+if [ "$CONFIG_MPENTIUM4" = "y" ]; then
+   define_int  CONFIG_X86_L1_CACHE_SHIFT 7
+fi
+if [ "$CONFIG_MK7" = "y" ]; then
+   define_int  CONFIG_X86_L1_CACHE_SHIFT 6
+   define_bool CONFIG_X86_USE_3DNOW y
+fi
+
+choice 'High Memory Support' \
+       "off    CONFIG_NOHIGHMEM \
+        4GB    CONFIG_HIGHMEM4G \
+        64GB   CONFIG_HIGHMEM64G" off
+if [ "$CONFIG_HIGHMEM4G" = "y" ]; then
+   define_bool CONFIG_HIGHMEM y
+fi
+if [ "$CONFIG_HIGHMEM64G" = "y" ]; then
+   define_bool CONFIG_HIGHMEM y
+   define_bool CONFIG_X86_PAE y
+fi
+
+#bool 'Symmetric multi-processing support' CONFIG_SMP
+#if [ "$CONFIG_SMP" = "y" -a "$CONFIG_X86_CMPXCHG" = "y" ]; then
+#   define_bool CONFIG_HAVE_DEC_LOCK y
+#fi
+endmenu
+
+mainmenu_option next_comment
+comment 'General setup'
+
+bool 'Networking support' CONFIG_NET
+
+bool 'System V IPC' CONFIG_SYSVIPC
+bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT
+bool 'Sysctl support' CONFIG_SYSCTL
+if [ "$CONFIG_PROC_FS" = "y" ]; then
+   choice 'Kernel core (/proc/kcore) format' \
+       "ELF            CONFIG_KCORE_ELF        \
+        A.OUT          CONFIG_KCORE_AOUT" ELF
+fi
+tristate 'Kernel support for a.out binaries' CONFIG_BINFMT_AOUT
+tristate 'Kernel support for ELF binaries' CONFIG_BINFMT_ELF
+tristate 'Kernel support for MISC binaries' CONFIG_BINFMT_MISC
+
+endmenu
+
+if [ "$CONFIG_NET" = "y" ]; then
+   source net/Config.in
+fi
+
+
+#
+# Block device driver configuration
+#
+mainmenu_option next_comment
+comment 'Block devices'
+tristate 'Loopback device support' CONFIG_BLK_DEV_LOOP
+dep_tristate 'Network block device support' CONFIG_BLK_DEV_NBD $CONFIG_NET
+tristate 'RAM disk support' CONFIG_BLK_DEV_RAM
+if [ "$CONFIG_BLK_DEV_RAM" = "y" -o "$CONFIG_BLK_DEV_RAM" = "m" ]; then
+   int '  Default RAM disk size' CONFIG_BLK_DEV_RAM_SIZE 4096
+fi
+dep_bool '  Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD $CONFIG_BLK_DEV_RAM
+bool 'Per partition statistics in /proc/partitions' CONFIG_BLK_STATS
+bool 'XenoLinux virtual block device support' CONFIG_XENOLINUX_BLOCK
+endmenu
+define_bool CONFIG_BLK_DEV_IDE_MODES n
+define_bool CONFIG_BLK_DEV_HD n
+
+
+mainmenu_option next_comment
+comment 'Character devices'
+
+bool 'Xen console support' CONFIG_XEN_CONSOLE
+comment 'The options below are alpha-stage and will probably not work'
+bool 'Virtual terminal' CONFIG_VT
+if [ "$CONFIG_VT" = "y" ]; then
+   bool '  Support for console on virtual terminal' CONFIG_VT_CONSOLE
+   bool '  Support for VGA Video' CONFIG_VGA_CONSOLE
+   bool '  Support for Dummy Video (for testing)' CONFIG_DUMMY_CONSOLE
+   bool '  PS/2 mouse (aka "auxiliary device") support' CONFIG_PSMOUSE
+fi
+
+bool 'Unix98 PTY support' CONFIG_UNIX98_PTYS
+if [ "$CONFIG_UNIX98_PTYS" = "y" ]; then
+   int 'Maximum number of Unix98 PTYs in use (0-2048)' CONFIG_UNIX98_PTY_COUNT 256
+fi
+
+endmenu
+
+source fs/Config.in
+
+mainmenu_option next_comment
+comment 'Kernel hacking'
+
+bool 'Kernel debugging' CONFIG_DEBUG_KERNEL
+if [ "$CONFIG_DEBUG_KERNEL" != "n" ]; then
+   bool '  Debug high memory support' CONFIG_DEBUG_HIGHMEM
+   bool '  Debug memory allocations' CONFIG_DEBUG_SLAB
+   bool '  Memory mapped I/O debugging' CONFIG_DEBUG_IOVIRT
+   bool '  Magic SysRq key' CONFIG_MAGIC_SYSRQ
+   bool '  Spinlock debugging' CONFIG_DEBUG_SPINLOCK
+   bool '  Verbose BUG() reporting (adds 70K)' CONFIG_DEBUG_BUGVERBOSE
+   bool '  Load all symbols for debugging' CONFIG_KALLSYMS
+   bool '  Compile the kernel with frame pointers' CONFIG_FRAME_POINTER
+fi
+
+source drivers/acpi/Config.in
+
+endmenu
+
+source crypto/Config.in
+source lib/Config.in
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/defconfig b/xenolinux-2.4.22-sparse/arch/xeno/defconfig
new file mode 100644 (file)
index 0000000..5e5ee7b
--- /dev/null
@@ -0,0 +1,319 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_XENO=y
+CONFIG_X86=y
+CONFIG_ISA=y
+# CONFIG_SBUS is not set
+CONFIG_UID16=y
+
+#
+# Privileged guest OS
+#
+CONFIG_XENO_PRIV=y
+
+#
+# Code maturity level options
+#
+# CONFIG_EXPERIMENTAL is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODVERSIONS=y
+CONFIG_KMOD=y
+
+#
+# Processor type and features
+#
+CONFIG_M686=y
+# CONFIG_MPENTIUMIII is not set
+# CONFIG_MPENTIUM4 is not set
+# CONFIG_MK7 is not set
+CONFIG_X86_WP_WORKS_OK=y
+CONFIG_X86_INVLPG=y
+CONFIG_X86_CMPXCHG=y
+CONFIG_X86_XADD=y
+CONFIG_X86_BSWAP=y
+CONFIG_X86_POPAD_OK=y
+# CONFIG_RWSEM_GENERIC_SPINLOCK is not set
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_X86_GOOD_APIC=y
+CONFIG_X86_PGE=y
+CONFIG_X86_USE_PPRO_CHECKSUM=y
+CONFIG_X86_TSC=y
+CONFIG_X86_L1_CACHE_SHIFT=5
+CONFIG_NOHIGHMEM=y
+# CONFIG_HIGHMEM4G is not set
+# CONFIG_HIGHMEM64G is not set
+
+#
+# General setup
+#
+CONFIG_NET=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+CONFIG_KCORE_ELF=y
+# CONFIG_KCORE_AOUT is not set
+CONFIG_BINFMT_AOUT=y
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+# CONFIG_NETLINK_DEV is not set
+# CONFIG_NETFILTER is not set
+CONFIG_FILTER=y
+CONFIG_UNIX=y
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_INET_ECN is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_VLAN_8021Q is not set
+
+#
+#  
+#
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+
+#
+# Appletalk devices
+#
+# CONFIG_DEV_APPLETALK is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_XD is not set
+# CONFIG_PARIDE is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_CISS_SCSI_TAPE is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_NBD=y
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_BLK_STATS is not set
+CONFIG_XENOLINUX_BLOCK=y
+# CONFIG_BLK_DEV_IDE_MODES is not set
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# Console drivers
+#
+CONFIG_VGA_CONSOLE=y
+# CONFIG_VIDEO_SELECT is not set
+CONFIG_DUMMY_CONSOLE=y
+
+
+#
+# Character devices
+#
+CONFIG_XEN_CONSOLE=y
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+# CONFIG_UNIX98_PTYS is not set
+
+#
+# Mice
+#
+# CONFIG_BUSMOUSE is not set
+CONFIG_MOUSE=y
+CONFIG_PSMOUSE=y
+# CONFIG_82C710_MOUSE is not set
+# CONFIG_PC110_PAD is not set
+# CONFIG_MK712_MOUSE is not set
+
+
+#
+# File systems
+#
+# CONFIG_QUOTA is not set
+CONFIG_AUTOFS_FS=y
+CONFIG_AUTOFS4_FS=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_REISERFS_PROC_INFO is not set
+# CONFIG_ADFS_FS is not set
+# CONFIG_ADFS_FS_RW is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BEFS_DEBUG is not set
+# CONFIG_BFS_FS is not set
+CONFIG_EXT3_FS=y
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+# CONFIG_FAT_FS is not set
+# CONFIG_MSDOS_FS is not set
+# CONFIG_UMSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_JFFS_FS is not set
+# CONFIG_JFFS2_FS is not set
+# CONFIG_CRAMFS is not set
+CONFIG_TMPFS=y
+CONFIG_RAMFS=y
+CONFIG_ISO9660_FS=y
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+# CONFIG_JFS_FS is not set
+# CONFIG_JFS_DEBUG is not set
+# CONFIG_JFS_STATISTICS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_NTFS_FS is not set
+# CONFIG_NTFS_RW is not set
+# CONFIG_HPFS_FS is not set
+CONFIG_PROC_FS=y
+# CONFIG_DEVFS_FS is not set
+# CONFIG_DEVFS_MOUNT is not set
+# CONFIG_DEVFS_DEBUG is not set
+# CONFIG_DEVPTS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_QNX4FS_RW is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_EXT2_FS=y
+# CONFIG_SYSV_FS is not set
+# CONFIG_UDF_FS is not set
+# CONFIG_UDF_RW is not set
+# CONFIG_UFS_FS is not set
+# CONFIG_UFS_FS_WRITE is not set
+
+#
+# Network File Systems
+#
+# CONFIG_CODA_FS is not set
+# CONFIG_INTERMEZZO_FS is not set
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+CONFIG_ROOT_NFS=y
+CONFIG_NFSD=y
+CONFIG_NFSD_V3=y
+# CONFIG_NFSD_TCP is not set
+CONFIG_SUNRPC=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+# CONFIG_SMB_FS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_NCPFS_PACKET_SIGNING is not set
+# CONFIG_NCPFS_IOCTL_LOCKING is not set
+# CONFIG_NCPFS_STRONG is not set
+# CONFIG_NCPFS_NFS_NS is not set
+# CONFIG_NCPFS_OS2_NS is not set
+# CONFIG_NCPFS_SMALLDOS is not set
+# CONFIG_NCPFS_NLS is not set
+# CONFIG_NCPFS_EXTRAS is not set
+CONFIG_ZISOFS_FS=y
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_XENO_PARTITION=y
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+# CONFIG_SMB_NLS is not set
+CONFIG_NLS=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS_DEFAULT="iso8559-1"
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+CONFIG_NLS_ISO8859_1=y
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Kernel hacking
+#
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_HIGHMEM is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_IOVIRT is not set
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_BUGVERBOSE is not set
+CONFIG_KALLSYMS=y
+# CONFIG_FRAME_POINTER is not set
+
+#
+# Library routines
+#
+CONFIG_ZLIB_INFLATE=y
+# CONFIG_ZLIB_DEFLATE is not set
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/drivers/balloon/Makefile b/xenolinux-2.4.22-sparse/arch/xeno/drivers/balloon/Makefile
new file mode 100644 (file)
index 0000000..f780a51
--- /dev/null
@@ -0,0 +1,3 @@
+O_TARGET := balloon_driver.o
+obj-y := balloon.o
+include $(TOPDIR)/Rules.make
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/drivers/balloon/balloon.c b/xenolinux-2.4.22-sparse/arch/xeno/drivers/balloon/balloon.c
new file mode 100644 (file)
index 0000000..e1a6d30
--- /dev/null
@@ -0,0 +1,282 @@
+/******************************************************************************
+ * balloon.c
+ *
+ * Xeno balloon driver - enables returning/claiming memory to/from xen
+ *
+ * Copyright (c) 2003, B Dragovic
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/errno.h>
+#include <linux/proc_fs.h>
+
+#include <linux/mm.h>
+#include <linux/mman.h>
+#include <linux/smp_lock.h>
+#include <linux/pagemap.h>
+
+#include <asm/hypervisor.h>
+#include <asm/pgalloc.h>
+#include <asm/pgtable.h>
+#include <asm/uaccess.h>
+#include <asm/tlb.h>
+
+#include "dom_mem_ops.h"
+
+/* USER DEFINES -- THESE SHOULD BE COPIED TO USER-SPACE TOOLS */
+#define USER_INFLATE_BALLOON  1   /* return mem to hypervisor */
+#define USER_DEFLATE_BALLOON  2   /* claim mem from hypervisor */
+typedef struct user_balloon_op {
+    unsigned int  op;
+    unsigned long size;
+} user_balloon_op_t;
+/* END OF USER DEFINE */
+
+/* Dead entry written into ballon-owned entries in the PMT. */
+#define DEAD 0xdeadbeef
+
+#define BALLOON_ENTRY    "balloon"
+extern struct proc_dir_entry *xeno_base;
+
+static struct proc_dir_entry *balloon_pde;
+unsigned long credit;
+
+static inline unsigned long get_ppte(unsigned long addr)
+{
+    unsigned long ppte;
+    pgd_t *pgd; pmd_t *pmd; pte_t *ptep;
+    pgd = pgd_offset_k(addr);
+
+    if ( pgd_none(*pgd) || pgd_bad(*pgd) ) BUG();
+
+    pmd = pmd_offset(pgd, addr);
+    if ( pmd_none(*pmd) || pmd_bad(*pmd) ) BUG();
+
+    ptep = pte_offset(pmd, addr);
+    ppte = (unsigned long)__pa(ptep);
+
+    return ppte;
+}
+
+/* main function for relinquishing bit of memory */
+static unsigned long inflate_balloon(unsigned long num_pages)
+{
+    dom_mem_op_t dom_mem_op;
+    unsigned long *parray;
+    unsigned long *currp;
+    unsigned long curraddr;
+    unsigned long ret = 0;
+    unsigned long vaddr;
+    unsigned long i, j;
+
+    parray = (unsigned long *)kmalloc(num_pages *
+                                      sizeof(unsigned long), GFP_KERNEL);
+    currp = parray;
+
+    for ( i = 0; i < num_pages; i++ )
+    {
+        /* try to obtain a free page, has to be done with GFP_ATOMIC
+         * as we do not want to sleep indefinately.
+         */
+        vaddr = __get_free_page(GFP_ATOMIC);
+
+        /* if allocation fails, free all reserved pages */
+        if(!vaddr){
+            printk("Unable to inflate balloon by %ld, only %ld pages free.",
+                   num_pages, i);
+            currp = parray;
+            for(j = 0; j < i; j++){
+                free_page(*currp++);
+            }
+            goto cleanup;
+        }
+
+        *currp++ = vaddr;
+    }
+
+
+    currp = parray;
+    for ( i = 0; i < num_pages; i++ )
+    {
+        curraddr = *currp;
+        *currp = virt_to_machine(*currp) >> PAGE_SHIFT;
+        queue_l1_entry_update(get_ppte(curraddr) | PGREQ_NORMAL, 0);
+        phys_to_machine_mapping[__pa(curraddr) >> PAGE_SHIFT] = DEAD;
+        currp++;
+    }
+
+    XENO_flush_page_update_queue();
+
+    dom_mem_op.op = BALLOON_INFLATE_OP;
+    dom_mem_op.u.balloon_inflate.size  = num_pages;
+    dom_mem_op.u.balloon_inflate.pages = parray;
+    if ( (ret = HYPERVISOR_dom_mem_op(&dom_mem_op)) != num_pages )
+    {
+        printk("Unable to inflate balloon, error %lx\n", ret);
+        goto cleanup;
+    }
+
+    credit += num_pages;
+    ret = num_pages;
+
+ cleanup:
+    kfree(parray);
+
+    return ret;
+}
+
+/* install new mem pages obtained by deflate_balloon. function walks 
+ * phys->machine mapping table looking for DEAD entries and populates
+ * them.
+ */
+static unsigned long process_new_pages(unsigned long * parray, 
+                                       unsigned long num)
+{
+    /* currently, this function is rather simplistic as 
+     * it is assumed that domain reclaims only number of 
+     * pages previously released. this is to change soon
+     * and the code to extend page tables etc. will be 
+     * incorporated here.
+     */
+     
+    unsigned long tot_pages = start_info.nr_pages;   
+    unsigned long * curr = parray;
+    unsigned long num_installed;
+    unsigned long i;
+
+    num_installed = 0;
+    for ( i = 0; (i < tot_pages) && (num_installed < num); i++ )
+    {
+        if ( phys_to_machine_mapping[i] == DEAD )
+        {
+            printk(KERN_ALERT "bd240 debug: proc_new_pages: i %lx, mpt %lx, %lx\n", i, i << PAGE_SHIFT, get_ppte((unsigned long)__va(i << PAGE_SHIFT)) | PGREQ_NORMAL);
+            phys_to_machine_mapping[i] = *curr;
+            queue_l1_entry_update((i << PAGE_SHIFT) | PGREQ_MPT_UPDATE, i);
+            queue_l1_entry_update(
+                get_ppte((unsigned long)__va(i << PAGE_SHIFT)) | PGREQ_NORMAL, 
+                ((*curr) << PAGE_SHIFT) | L1_PROT);
+
+            *curr = (unsigned long)__va(i << PAGE_SHIFT);
+            curr++;
+            num_installed++;
+        }
+    }
+
+    /* now, this is tricky (and will also change for machine addrs that 
+      * are mapped to not previously released addresses). we free pages
+      * that were allocated by get_free_page (the mappings are different 
+      * now, of course).
+      */
+    curr = parray;
+    for ( i = 0; i < num_installed; i++ )
+    {
+        free_page(*curr);
+        curr++;
+    }
+
+    return num_installed;
+}
+
+unsigned long deflate_balloon(unsigned long num_pages)
+{
+    dom_mem_op_t dom_mem_op;
+    unsigned long ret;
+    unsigned long * parray;
+
+    printk(KERN_ALERT "bd240 debug: deflate balloon called for %lx pages\n", num_pages);
+
+    if ( num_pages > credit )
+    {
+        printk("Can not allocate more pages than previously released.\n");
+        return -EAGAIN;
+    }
+
+    parray = (unsigned long *)kmalloc(num_pages * sizeof(unsigned long), 
+                                      GFP_KERNEL);
+
+    dom_mem_op.op = BALLOON_DEFLATE_OP;
+    dom_mem_op.u.balloon_deflate.size = num_pages;
+    dom_mem_op.u.balloon_deflate.pages = parray;
+    if((ret = HYPERVISOR_dom_mem_op(&dom_mem_op)) != num_pages){
+        printk("Unable to deflate balloon, error %lx\n", ret);
+        goto cleanup;
+    }
+
+    if((ret = process_new_pages(parray, num_pages)) < num_pages){
+        printk("Unable to deflate balloon by specified %lx pages, only %lx.\n",
+               num_pages, ret);
+        goto cleanup;
+    }
+
+    ret = num_pages;
+    credit -= num_pages;
+
+ cleanup:
+    kfree(parray);
+
+    return ret;
+}
+
+static int balloon_write(struct file *file, const char *buffer,
+                         u_long count, void *data)
+{
+    user_balloon_op_t bop;
+
+    /* Only admin can play with the balloon :) */
+    if ( !capable(CAP_SYS_ADMIN) )
+        return -EPERM;
+
+    if ( copy_from_user(&bop, buffer, sizeof(bop)) )
+        return -EFAULT;
+
+    switch ( bop.op )
+    {
+    case USER_INFLATE_BALLOON:
+        if ( inflate_balloon(bop.size) < bop.size )
+            return -EAGAIN;
+        break;
+        
+    case USER_DEFLATE_BALLOON:
+        deflate_balloon(bop.size);
+        break;
+
+    default:
+        printk("Unknown command to balloon driver.");
+        return -EFAULT;
+    }
+
+    return sizeof(bop);
+}
+
+/*
+ * main balloon driver initialization function.
+ */
+static int __init init_module(void)
+{
+    printk(KERN_ALERT "Starting Xeno Balloon driver\n");
+
+    credit = 0;
+
+    balloon_pde = create_proc_entry(BALLOON_ENTRY, 0600, xeno_base);
+    if ( balloon_pde == NULL )
+    {
+        printk(KERN_ALERT "Unable to create balloon driver proc entry!");
+        return -1;
+    }
+
+    balloon_pde->write_proc = balloon_write;
+
+    return 0;
+}
+
+static void __exit cleanup_module(void)
+{
+}
+
+module_init(init_module);
+module_exit(cleanup_module);
+
+
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/drivers/balloon/dom_mem_ops.h b/xenolinux-2.4.22-sparse/arch/xeno/drivers/balloon/dom_mem_ops.h
new file mode 100644 (file)
index 0000000..c473f19
--- /dev/null
@@ -0,0 +1,32 @@
+/******************************************************************************
+ * dom_mem_ops.h
+ *
+ * Header file supporting domain related memory operations. N.B. keep in sync
+ * with xen version. 
+ *
+ * Copyright (c) 2003, B Dragovic
+ */
+
+#define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_USER|_PAGE_ACCESSED)
+#define BALLOON_DEFLATE_OP   0
+#define BALLOON_INFLATE_OP   1
+
+typedef struct balloon_deflate_op {
+    unsigned long   size;
+    unsigned long   * pages;
+} balloon_def_op_t;
+
+typedef struct balloon_inflate_op {
+    unsigned long   size;
+    unsigned long   * pages;
+} balloon_inf_op_t;
+
+typedef struct dom_mem_ops
+{
+    unsigned int op;
+    union
+    {
+        balloon_def_op_t balloon_deflate;
+        balloon_inf_op_t balloon_inflate;
+    }u;
+} dom_mem_op_t;
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/drivers/block/Makefile b/xenolinux-2.4.22-sparse/arch/xeno/drivers/block/Makefile
new file mode 100644 (file)
index 0000000..6423104
--- /dev/null
@@ -0,0 +1,3 @@
+O_TARGET := blk.o
+obj-y := xl_block.o xl_ide.o xl_scsi.o xl_segment.o xl_segment_proc.o
+include $(TOPDIR)/Rules.make
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_block.c b/xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_block.c
new file mode 100644 (file)
index 0000000..743ecd9
--- /dev/null
@@ -0,0 +1,616 @@
+/******************************************************************************
+ * xl_block.c
+ * 
+ * Xenolinux virtual block-device driver.
+ * 
+ */
+
+#include "xl_block.h"
+#include <linux/blk.h>
+#include <linux/cdrom.h>
+
+typedef unsigned char byte; /* from linux/ide.h */
+
+#define XLBLK_RESPONSE_IRQ _EVENT_BLKDEV
+#define DEBUG_IRQ          _EVENT_DEBUG 
+
+static blk_ring_t *blk_ring;
+static unsigned int resp_cons; /* Response consumer for comms ring. */
+static unsigned int req_prod;  /* Private request producer.         */
+static xen_disk_info_t xlblk_disk_info;
+static int xlblk_control_msg_pending;
+
+#define RING_FULL (BLK_RING_INC(req_prod) == resp_cons)
+
+/*
+ * Request queues with outstanding work, but ring is currently full.
+ * We need no special lock here, as we always access this with the
+ * io_request_lock held. We only need a small maximum list.
+ */
+#define MAX_PENDING 8
+static request_queue_t *pending_queues[MAX_PENDING];
+static int nr_pending;
+
+static kdev_t        sg_dev;
+static int           sg_operation = -1;
+static unsigned long sg_next_sect;
+#define DISABLE_SCATTERGATHER() (sg_operation = -1)
+
+static inline void signal_requests_to_xen(void)
+{
+    DISABLE_SCATTERGATHER();
+    blk_ring->req_prod = req_prod;
+    HYPERVISOR_block_io_op();
+}
+
+
+inline kdev_t physdev_to_xldev(unsigned short physdev)
+{
+    switch (physdev & XENDEV_TYPE_MASK) {
+    case XENDEV_IDE:
+        if ( (physdev & XENDEV_IDX_MASK) < XLIDE_DEVS_PER_MAJOR) {
+           return MKDEV(XLIDE_MAJOR_0,
+                        (physdev & XENDEV_IDX_MASK) << XLIDE_PARTN_SHIFT);
+       } else if ( (physdev & XENDEV_IDX_MASK) < (XLIDE_DEVS_PER_MAJOR * 2)) {
+           return MKDEV(XLIDE_MAJOR_1,
+                        (physdev & XENDEV_IDX_MASK) << XLIDE_PARTN_SHIFT);
+       }
+       break;
+    case XENDEV_SCSI:
+       return MKDEV(XLSCSI_MAJOR,
+                    (physdev & XENDEV_IDX_MASK) << XLSCSI_PARTN_SHIFT);
+    case XENDEV_VIRTUAL:
+       return MKDEV(XLVIRT_MAJOR,
+                    (physdev & XENDEV_IDX_MASK) << XLVIRT_PARTN_SHIFT);
+    }
+
+    return 0;
+}
+
+
+/* Convert from a XenoLinux major device to the Xen-level 'physical' device */
+inline unsigned short xldev_to_physdev(kdev_t xldev) 
+{
+    unsigned short physdev = 0;
+
+    switch ( MAJOR(xldev) ) 
+    { 
+    case XLIDE_MAJOR_0: 
+        physdev = XENDEV_IDE + (0*XLIDE_DEVS_PER_MAJOR) +
+            (MINOR(xldev) >> XLIDE_PARTN_SHIFT);
+       break; 
+
+    case XLIDE_MAJOR_1:
+       physdev = XENDEV_IDE + (1*XLIDE_DEVS_PER_MAJOR) +
+            (MINOR(xldev) >> XLIDE_PARTN_SHIFT);
+        break;
+
+    case XLSCSI_MAJOR: 
+        physdev = XENDEV_SCSI + (MINOR(xldev) >> XLSCSI_PARTN_SHIFT);
+       break; 
+
+    case XLVIRT_MAJOR:
+        physdev = XENDEV_VIRTUAL + (MINOR(xldev) >> XLVIRT_PARTN_SHIFT);
+        break;
+    } 
+
+    return physdev;
+}
+
+
+static inline struct gendisk *xldev_to_gendisk(kdev_t xldev) 
+{
+    struct gendisk *gd = NULL;
+
+    switch ( MAJOR(xldev) ) 
+    { 
+    case XLIDE_MAJOR_0: 
+        gd = xlide_gendisk[0];
+       break; 
+       
+    case XLIDE_MAJOR_1: 
+        gd = xlide_gendisk[1];
+       break; 
+       
+    case XLSCSI_MAJOR: 
+        gd = xlscsi_gendisk;
+       break; 
+
+    case XLVIRT_MAJOR:
+        gd = xlsegment_gendisk;
+        break;
+    }
+
+    if ( gd == NULL ) BUG();
+
+    return gd;
+}
+
+
+static inline xl_disk_t *xldev_to_xldisk(kdev_t xldev)
+{
+    struct gendisk *gd = xldev_to_gendisk(xldev);
+    return (xl_disk_t *)gd->real_devices + 
+        (MINOR(xldev) >> PARTN_SHIFT(xldev));
+}
+
+
+int xenolinux_block_open(struct inode *inode, struct file *filep)
+{
+    xl_disk_t *disk = xldev_to_xldisk(inode->i_rdev);
+    disk->usage++;
+    DPRINTK("xenolinux_block_open\n");
+    return 0;
+}
+
+
+int xenolinux_block_release(struct inode *inode, struct file *filep)
+{
+    xl_disk_t *disk = xldev_to_xldisk(inode->i_rdev);
+    disk->usage--;
+    DPRINTK("xenolinux_block_release\n");
+    return 0;
+}
+
+/*
+ * handle ioctl calls
+ *
+ * individual ioctls are defined in /usr/include/linux/fs.h
+ */
+
+int xenolinux_block_ioctl(struct inode *inode, struct file *filep,
+                         unsigned command, unsigned long argument)
+{
+    kdev_t dev = inode->i_rdev;
+    struct hd_geometry *geo = (struct hd_geometry *)argument;
+    struct gendisk *gd;     
+    struct hd_struct *part; 
+    
+    DPRINTK("xenolinux_block_ioctl\n"); 
+
+    /* check permissions */
+    if (!capable(CAP_SYS_ADMIN)) return -EPERM;
+    if (!inode)                  return -EINVAL;
+
+    DPRINTK_IOCTL("command: 0x%x, argument: 0x%lx, dev: 0x%04x\n",
+                  command, (long) argument, dev); 
+  
+    gd = xldev_to_gendisk(dev);
+    part = &gd->part[MINOR(dev)]; 
+
+    switch ( command )
+    {
+    case BLKGETSIZE:
+        DPRINTK_IOCTL("   BLKGETSIZE: %x %lx\n", BLKGETSIZE, part->nr_sects); 
+       return put_user(part->nr_sects, (unsigned long *) argument);
+
+    case BLKRRPART:                               /* re-read partition table */
+        DPRINTK_IOCTL("   BLKRRPART: %x\n", BLKRRPART); 
+        return xenolinux_block_revalidate(dev);
+
+    case BLKSSZGET:
+       switch ( MAJOR(dev) )
+        {
+       case XLIDE_MAJOR_0: 
+           DPRINTK_IOCTL("   BLKSSZGET: %x 0x%x\n", BLKSSZGET, 
+                         xlide_hwsect(MINOR(dev)));
+           return xlide_hwsect(MINOR(dev)); 
+
+       case XLSCSI_MAJOR: 
+           DPRINTK_IOCTL("   BLKSSZGET: %x 0x%x\n", BLKSSZGET,
+                         xlscsi_hwsect(MINOR(dev)));
+           return xlscsi_hwsect(MINOR(dev)); 
+
+        case XLVIRT_MAJOR:
+           DPRINTK_IOCTL("   BLKSSZGET: %x 0x%x\n", BLKSSZGET, 
+                         xlsegment_hwsect(MINOR(dev)));
+           return xlsegment_hwsect(MINOR(dev)); 
+
+       default: 
+           printk(KERN_ALERT "BLKSSZGET ioctl() on bogus disk!\n"); 
+            return 0;
+       }
+
+    case BLKBSZGET:                                        /* get block size */
+        DPRINTK_IOCTL("   BLKBSZGET: %x\n", BLKBSZGET);
+        break;
+
+    case BLKBSZSET:                                        /* set block size */
+        DPRINTK_IOCTL("   BLKBSZSET: %x\n", BLKBSZSET);
+       break;
+
+    case BLKRASET:                                         /* set read-ahead */
+        DPRINTK_IOCTL("   BLKRASET: %x\n", BLKRASET);
+       break;
+
+    case BLKRAGET:                                         /* get read-ahead */
+        DPRINTK_IOCTL("   BLKRAFET: %x\n", BLKRAGET);
+       break;
+
+    case HDIO_GETGEO:
+        /* note: these values are complete garbage */
+        DPRINTK_IOCTL("   HDIO_GETGEO: %x\n", HDIO_GETGEO);
+       if (!argument) return -EINVAL;
+       if (put_user(0x00,  (unsigned long *) &geo->start)) return -EFAULT;
+       if (put_user(0xff,  (byte *)&geo->heads)) return -EFAULT;
+       if (put_user(0x3f,  (byte *)&geo->sectors)) return -EFAULT;
+       if (put_user(0x106, (unsigned short *)&geo->cylinders)) return -EFAULT;
+       return 0;
+
+    case HDIO_GETGEO_BIG: 
+        /* note: these values are complete garbage */
+        DPRINTK_IOCTL("   HDIO_GETGEO_BIG: %x\n", HDIO_GETGEO_BIG);
+       if (!argument) return -EINVAL;
+       if (put_user(0x00,  (unsigned long *) &geo->start))  return -EFAULT;
+       if (put_user(0xff,  (byte *)&geo->heads))   return -EFAULT;
+       if (put_user(0x3f,  (byte *)&geo->sectors)) return -EFAULT;
+       if (put_user(0x106, (unsigned int *) &geo->cylinders)) return -EFAULT;
+       return 0;
+
+    case CDROMMULTISESSION:
+        printk("FIXME: support multisession CDs later\n");
+        memset((struct cdrom_multisession *)argument, 0, 
+               sizeof(struct cdrom_multisession));
+        return 0;
+
+    default:
+        printk("ioctl %08x not supported by xl_block\n", command);
+       return -ENOSYS;
+    }
+    
+    return 0;
+}
+
+int xenolinux_block_check(kdev_t dev)
+{
+    DPRINTK("xenolinux_block_check\n");
+    return 0;
+}
+
+int xenolinux_block_revalidate(kdev_t dev)
+{
+    struct gendisk *gd = xldev_to_gendisk(dev);
+    xl_disk_t *disk = xldev_to_xldisk(dev);
+    unsigned long flags;
+    int i, partn_shift = PARTN_SHIFT(dev);
+    int xdev = dev & XENDEV_IDX_MASK;
+    
+    DPRINTK("xenolinux_block_revalidate: %d %d %d\n", 
+           dev, xdev, XENDEV_IDX_MASK);
+
+    spin_lock_irqsave(&io_request_lock, flags);
+    if ( disk->usage > 1 )
+    {
+        spin_unlock_irqrestore(&io_request_lock, flags);
+        return -EBUSY;
+    }
+    spin_unlock_irqrestore(&io_request_lock, flags);
+
+    for ( i = 0; i < (1 << partn_shift); i++ )
+    {
+        invalidate_device(xdev + i, 1);
+        gd->part[xdev + i].start_sect = 0;
+        gd->part[xdev + i].nr_sects = 0;
+    }
+
+    grok_partitions(gd, MINOR(dev) >> partn_shift,
+                    1 << partn_shift, disk->capacity);
+
+    return 0;
+}
+
+
+/*
+ * hypervisor_request
+ *
+ * request block io 
+ * 
+ * id: for guest use only.
+ * operation: XEN_BLOCK_{READ,WRITE,PROBE*,SEG*}
+ * buffer: buffer to read/write into. this should be a
+ *   virtual address in the guest os.
+ */
+static int hypervisor_request(unsigned long   id,
+                              int             operation,
+                              char *          buffer,
+                              unsigned long   sector_number,
+                              unsigned short  nr_sectors,
+                              kdev_t          device)
+{
+    unsigned long buffer_ma = phys_to_machine(virt_to_phys(buffer)); 
+    kdev_t phys_device = (kdev_t) 0;
+    struct gendisk *gd;
+    blk_ring_req_entry_t *req;
+    struct buffer_head *bh;
+
+    if ( nr_sectors >= (1<<9) ) BUG();
+    if ( (buffer_ma & ((1<<9)-1)) != 0 ) BUG();
+
+    switch ( operation )
+    {
+    case XEN_BLOCK_SEG_CREATE:
+    case XEN_BLOCK_SEG_DELETE:
+    case XEN_BLOCK_PHYSDEV_GRANT:
+    case XEN_BLOCK_PHYSDEV_PROBE:
+    case XEN_BLOCK_PROBE_BLK:
+    case XEN_BLOCK_PROBE_SEG:
+    case XEN_BLOCK_PROBE_SEG_ALL:
+        if ( RING_FULL ) return 1;
+       phys_device = (kdev_t) 0;
+       sector_number = 0;
+        DISABLE_SCATTERGATHER();
+        break;
+
+    case XEN_BLOCK_READ:
+    case XEN_BLOCK_WRITE:
+        phys_device = xldev_to_physdev(device);
+       gd = xldev_to_gendisk(device); 
+
+       sector_number += gd->part[MINOR(device)].start_sect;
+        if ( (sg_operation == operation) &&
+             (sg_dev == phys_device) &&
+             (sg_next_sect == sector_number) )
+        {
+            req = &blk_ring->ring[(req_prod-1)&(BLK_RING_SIZE-1)].req;
+            bh = (struct buffer_head *)id;
+            bh->b_reqnext = (struct buffer_head *)req->id;
+            req->id = id;
+            req->buffer_and_sects[req->nr_segments] = buffer_ma | nr_sectors;
+            if ( ++req->nr_segments < MAX_BLK_SEGS )
+                sg_next_sect += nr_sectors;
+            else
+                DISABLE_SCATTERGATHER();
+            return 0;
+        }
+        else if ( RING_FULL )
+        {
+            return 1;
+        }
+        else
+        {
+            sg_operation = operation;
+            sg_dev       = phys_device;
+            sg_next_sect = sector_number + nr_sectors;
+        }
+        break;
+
+    default:
+        panic("unknown op %d\n", operation);
+    }
+
+    /* Fill out a communications ring structure. */
+    req = &blk_ring->ring[req_prod].req;
+    req->id            = id;
+    req->operation     = operation;
+    req->sector_number = sector_number;
+    req->device        = phys_device;
+    req->nr_segments   = 1;
+    req->buffer_and_sects[0] = buffer_ma | nr_sectors;
+    req_prod = BLK_RING_INC(req_prod);
+
+    return 0;
+}
+
+
+/*
+ * do_xlblk_request
+ *  read a block; request is in a request queue
+ */
+void do_xlblk_request(request_queue_t *rq)
+{
+    struct request *req;
+    struct buffer_head *bh, *next_bh;
+    int rw, nsect, full, queued = 0;
+    
+    DPRINTK("xlblk.c::do_xlblk_request for '%s'\n", DEVICE_NAME); 
+
+    while ( !rq->plugged && !list_empty(&rq->queue_head))
+    {
+       if ( (req = blkdev_entry_next_request(&rq->queue_head)) == NULL ) 
+           goto out;
+               
+        DPRINTK("do_xlblk_request %p: cmd %i, sec %lx, (%li/%li) bh:%p\n",
+                req, req->cmd, req->sector,
+                req->current_nr_sectors, req->nr_sectors, req->bh);
+
+        rw = req->cmd;
+        if ( rw == READA ) rw = READ;
+        if ((rw != READ) && (rw != WRITE))
+            panic("XenoLinux Virtual Block Device: bad cmd: %d\n", rw);
+
+       req->errors = 0;
+
+        bh = req->bh;
+        while ( bh != NULL )
+       {
+            next_bh = bh->b_reqnext;
+            bh->b_reqnext = NULL;
+
+            full = hypervisor_request(
+                (unsigned long)bh,
+                (rw == READ) ? XEN_BLOCK_READ : XEN_BLOCK_WRITE, 
+                bh->b_data, bh->b_rsector, bh->b_size>>9, bh->b_rdev);
+
+            if ( full )
+            {
+                bh->b_reqnext = next_bh;
+                pending_queues[nr_pending++] = rq;
+                if ( nr_pending >= MAX_PENDING ) BUG();
+                goto out;
+            }
+
+            queued++;
+
+            /* Dequeue the buffer head from the request. */
+            nsect = bh->b_size >> 9;
+            bh = req->bh = next_bh;
+            
+            if ( bh != NULL )
+            {
+                /* There's another buffer head to do. Update the request. */
+                req->hard_sector += nsect;
+                req->hard_nr_sectors -= nsect;
+                req->sector = req->hard_sector;
+                req->nr_sectors = req->hard_nr_sectors;
+                req->current_nr_sectors = bh->b_size >> 9;
+                req->buffer = bh->b_data;
+            }
+            else
+            {
+                /* That was the last buffer head. Finalise the request. */
+                if ( end_that_request_first(req, 1, "XenBlk") ) BUG();
+                blkdev_dequeue_request(req);
+                end_that_request_last(req);
+            }
+        }
+    }
+
+ out:
+    if ( queued != 0 ) signal_requests_to_xen();
+}
+
+
+static void xlblk_response_int(int irq, void *dev_id, struct pt_regs *ptregs)
+{
+    int i; 
+    unsigned long flags; 
+    struct buffer_head *bh, *next_bh;
+    
+    spin_lock_irqsave(&io_request_lock, flags);            
+
+    for ( i  = resp_cons;
+         i != blk_ring->resp_prod;
+         i  = BLK_RING_INC(i) )
+    {
+       blk_ring_resp_entry_t *bret = &blk_ring->ring[i].resp;
+       switch (bret->operation)
+       {
+        case XEN_BLOCK_READ:
+        case XEN_BLOCK_WRITE:
+            if ( bret->status )
+                DPRINTK("Bad return from blkdev data request: %lx\n",
+                        bret->status);
+            for ( bh = (struct buffer_head *)bret->id; 
+                  bh != NULL; 
+                  bh = next_bh )
+            {
+                next_bh = bh->b_reqnext;
+                bh->b_reqnext = NULL;
+                bh->b_end_io(bh, !bret->status);
+            }
+           break;
+           
+        case XEN_BLOCK_SEG_CREATE:
+        case XEN_BLOCK_SEG_DELETE:
+        case XEN_BLOCK_PROBE_SEG:
+       case XEN_BLOCK_PROBE_SEG_ALL:
+        case XEN_BLOCK_PROBE_BLK:
+       case XEN_BLOCK_PHYSDEV_GRANT:
+       case XEN_BLOCK_PHYSDEV_PROBE:
+            xlblk_control_msg_pending = bret->status;
+            break;
+         
+        default:
+            BUG();
+       }
+    }
+    
+    resp_cons = i;
+
+    /* We kick pending request queues if the ring is reasonably empty. */
+    if ( (nr_pending != 0) && 
+         (((req_prod - resp_cons) & (BLK_RING_SIZE - 1)) < 
+          (BLK_RING_SIZE >> 1)) )
+    {
+        /* Attempt to drain the queue, but bail if the ring becomes full. */
+        while ( nr_pending != 0 )
+        {
+            do_xlblk_request(pending_queues[--nr_pending]);
+            if ( RING_FULL ) break;
+        }
+    }
+
+    spin_unlock_irqrestore(&io_request_lock, flags);
+}
+
+
+/* Send a synchronous message to Xen. */
+int xenolinux_control_msg(int operation, char *buffer, int size)
+{
+    unsigned long flags;
+    char *aligned_buf;
+
+    /* We copy from an aligned buffer, as interface needs sector alignment. */
+    aligned_buf = (char *)get_free_page(GFP_KERNEL);
+    if ( aligned_buf == NULL ) BUG();
+    memcpy(aligned_buf, buffer, size);
+
+    xlblk_control_msg_pending = 2;
+    spin_lock_irqsave(&io_request_lock, flags);
+    /* Note that size gets rounded up to a sector-sized boundary. */
+    if ( hypervisor_request(0, operation, aligned_buf, 0, (size+511)/512, 0) )
+        return -EAGAIN;
+    signal_requests_to_xen();
+    spin_unlock_irqrestore(&io_request_lock, flags);
+    while ( xlblk_control_msg_pending == 2 ) barrier();
+
+    memcpy(buffer, aligned_buf, size);
+    free_page((unsigned long)aligned_buf);
+    
+    return xlblk_control_msg_pending ? -EINVAL : 0;
+}
+
+
+int __init xlblk_init(void)
+{
+    int error;
+
+    xlblk_control_msg_pending = 0;
+    nr_pending = 0;
+
+    /* This mapping was created early at boot time. */
+    blk_ring = (blk_ring_t *)fix_to_virt(FIX_BLKRING_BASE);
+    blk_ring->req_prod = blk_ring->resp_prod = resp_cons = req_prod = 0;
+    
+    error = request_irq(XLBLK_RESPONSE_IRQ, xlblk_response_int, 
+                        SA_SAMPLE_RANDOM, "blkdev", NULL);
+    if ( error )
+    {
+       printk(KERN_ALERT "Could not allocate receive interrupt\n");
+       goto fail;
+    }
+
+    /* Probe for disk information. */
+    memset(&xlblk_disk_info, 0, sizeof(xlblk_disk_info));
+    error = xenolinux_control_msg(XEN_BLOCK_PROBE_BLK, 
+                                  (char *)&xlblk_disk_info,
+                                  sizeof(xen_disk_info_t));
+    if ( error )
+    {
+        printk(KERN_ALERT "Could not probe disks (%d)\n", error);
+        free_irq(XLBLK_RESPONSE_IRQ, NULL);
+        goto fail;
+    }
+
+    /* Pass the information to our fake IDE and SCSI susbystems. */
+    xlide_init(&xlblk_disk_info);
+    xlscsi_init(&xlblk_disk_info);
+
+    return 0;
+
+ fail:
+    return error;
+}
+
+static void __exit xlblk_cleanup(void)
+{
+    xlide_cleanup();
+    xlscsi_cleanup();
+    free_irq(XLBLK_RESPONSE_IRQ, NULL);
+}
+
+
+#ifdef MODULE
+module_init(xlblk_init);
+module_exit(xlblk_cleanup);
+#endif
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_block.h b/xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_block.h
new file mode 100644 (file)
index 0000000..00056bf
--- /dev/null
@@ -0,0 +1,110 @@
+/******************************************************************************
+ * xl_block.h
+ * 
+ * Shared definitions between all levels of XenoLinux Virtual block devices.
+ */
+
+#ifndef __XL_BLOCK_H__
+#define __XL_BLOCK_H__
+
+#include <linux/config.h>
+#include <linux/module.h>
+
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/errno.h>
+
+#include <linux/fs.h>
+#include <linux/hdreg.h>
+#include <linux/blkdev.h>
+#include <linux/major.h>
+
+#include <asm/hypervisor-ifs/block.h>
+#include <asm/hypervisor-ifs/hypervisor-if.h>
+#include <asm/io.h>
+#include <asm/atomic.h>
+#include <asm/uaccess.h>
+
+#if 0
+#define DPRINTK(_f, _a...) printk ( KERN_ALERT _f , ## _a )
+#else
+#define DPRINTK(_f, _a...) ((void)0)
+#endif
+
+#if 0
+#define DPRINTK_IOCTL(_f, _a...) printk ( KERN_ALERT _f , ## _a )
+#else
+#define DPRINTK_IOCTL(_f, _a...) ((void)0)
+#endif
+
+/* XL IDE and SCSI use same major/minor numbers as normal Linux devices. */
+#define XLIDE_MAJOR_0 IDE0_MAJOR
+#define XLIDE_MAJOR_1 IDE1_MAJOR
+#define XLSCSI_MAJOR SCSI_DISK0_MAJOR
+
+#define XLIDE_PARTN_SHIFT  6
+#define XLSCSI_PARTN_SHIFT 4
+#define XLVIRT_PARTN_SHIFT 4
+
+static inline int PARTN_SHIFT(kdev_t dev)
+{
+    switch ( MAJOR(dev) )
+    {
+    case XLIDE_MAJOR_0:
+    case XLIDE_MAJOR_1:
+        return XLIDE_PARTN_SHIFT;
+    case XLSCSI_MAJOR:
+        return XLSCSI_PARTN_SHIFT;
+    case XLVIRT_MAJOR:
+        return XLVIRT_PARTN_SHIFT;
+    default:
+        BUG();
+    }
+}
+
+#define XLIDE_DEVS_PER_MAJOR   2
+#define XLSCSI_DEVS_PER_MAJOR 16
+#define XLVIRT_DEVS_PER_MAJOR 16
+
+/*
+ * We have one of these per XL-IDE, XL-SCSI, and XL-VIRT device.
+ * They hang in an array off the gendisk structure. We may end up putting
+ * all kinds of interesting stuff here :-)
+ */
+typedef struct xl_disk {
+    int usage;
+    unsigned long capacity;
+} xl_disk_t;
+
+/* Generic layer. */
+extern int xenolinux_control_msg(int operration, char *buffer, int size);
+extern int xenolinux_block_open(struct inode *inode, struct file *filep);
+extern int xenolinux_block_release(struct inode *inode, struct file *filep);
+extern int xenolinux_block_ioctl(struct inode *inode, struct file *filep,
+                                unsigned command, unsigned long argument);
+extern int xenolinux_block_check(kdev_t dev);
+extern int xenolinux_block_revalidate(kdev_t dev);
+extern void do_xlblk_request (request_queue_t *rq); 
+
+/* Fake IDE subsystem. */
+extern int  xlide_init(xen_disk_info_t *xdi);
+extern int  xlide_hwsect(int minor); 
+extern void xlide_cleanup(void); 
+extern struct gendisk *xlide_gendisk[];
+
+/* Fake SCSI subsystem. */
+extern int  xlscsi_init(xen_disk_info_t *xdi);
+extern int  xlscsi_hwsect(int minor); 
+extern void xlscsi_cleanup(void); 
+extern struct gendisk *xlscsi_gendisk;
+
+/* Virtual block-device subsystem. */
+extern int  xlsegment_hwsect(int minor); 
+extern struct gendisk *xlsegment_gendisk;
+
+extern unsigned short xldev_to_physdev(kdev_t xldev);
+extern kdev_t physdev_to_xldev(unsigned short physdev);
+
+#endif /* __XL_BLOCK_H__ */
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_ide.c b/xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_ide.c
new file mode 100644 (file)
index 0000000..714c6bf
--- /dev/null
@@ -0,0 +1,204 @@
+/******************************************************************************
+ * xl_ide.c
+ * 
+ * Xenolinux virtual IDE block-device driver.
+ */
+
+#include "xl_block.h"
+#include <linux/blk.h>
+
+#define XLIDE_MAX         256
+#define XLIDE_MAJOR_NAME "hd"
+static int xlide_blksize_size[XLIDE_MAX];
+static int xlide_hardsect_size[XLIDE_MAX];
+static int xlide_max_sectors[XLIDE_MAX];
+
+#define XLIDE_NR_MAJORS     2
+
+struct gendisk *xlide_gendisk[XLIDE_NR_MAJORS] = { NULL };
+
+static struct block_device_operations xlide_block_fops = 
+{
+    open:               xenolinux_block_open,
+    release:            xenolinux_block_release,
+    ioctl:              xenolinux_block_ioctl,
+    check_media_change: xenolinux_block_check,
+    revalidate:         xenolinux_block_revalidate,
+};
+
+int xlide_hwsect(int minor) 
+{
+    return xlide_hardsect_size[minor]; 
+} 
+
+static int get_major(int major)
+{
+    int r = register_blkdev(major, XLIDE_MAJOR_NAME, &xlide_block_fops);
+    if ( r < 0 )
+        printk (KERN_ALERT "XL IDE: can't get major %d\n", XLIDE_MAJOR_0);
+    return r;
+}
+
+static void setup_major(struct gendisk **pgd, 
+                        xen_disk_info_t *xdi, int base, int major)
+{
+    int i, minors, disk, units = XLIDE_DEVS_PER_MAJOR;
+    unsigned short minor; 
+    unsigned char buf[64];
+    struct gendisk *gd;
+
+    blk_size[major]      = NULL;
+    blksize_size[major]  = xlide_blksize_size + base*(1<<XLIDE_PARTN_SHIFT);
+    hardsect_size[major] = xlide_hardsect_size + base*(1<<XLIDE_PARTN_SHIFT);
+    max_sectors[major]   = xlide_max_sectors + base*(1<<XLIDE_PARTN_SHIFT);
+    read_ahead[major]    = 8;
+
+    blk_init_queue(BLK_DEFAULT_QUEUE(major), do_xlblk_request);
+
+    /*
+     * Turn off barking 'headactive' mode. We dequeue buffer heads as soon as 
+     * we pass them down to Xen.
+     */
+    blk_queue_headactive(BLK_DEFAULT_QUEUE(major), 0);
+
+    /* Construct an appropriate gendisk structure. */
+    minors    = units * (1<<XLIDE_PARTN_SHIFT);
+    gd        = kmalloc(sizeof(struct gendisk), GFP_KERNEL);
+    gd->sizes = kmalloc(minors * sizeof(int), GFP_KERNEL);
+    gd->part  = kmalloc(minors * sizeof(struct hd_struct), GFP_KERNEL);
+    gd->major        = major;
+    gd->major_name   = XLIDE_MAJOR_NAME;
+    gd->minor_shift  = XLIDE_PARTN_SHIFT; 
+    gd->max_p       = 1<<XLIDE_PARTN_SHIFT;
+    gd->nr_real             = units;           
+    gd->real_devices = kmalloc(units * sizeof(xl_disk_t), GFP_KERNEL);
+    gd->next        = NULL;            
+    gd->fops         = &xlide_block_fops;
+    gd->de_arr       = kmalloc(sizeof(*gd->de_arr) * units, GFP_KERNEL);
+    gd->flags       = kmalloc(sizeof(*gd->flags) * units, GFP_KERNEL);
+    memset(gd->sizes, 0, minors * sizeof(int));
+    memset(gd->part,  0, minors * sizeof(struct hd_struct));
+    memset(gd->de_arr, 0, sizeof(*gd->de_arr) * units);
+    memset(gd->flags, 0, sizeof(*gd->flags) * units);
+    memset(gd->real_devices, 0, sizeof(xl_disk_t) * units);
+    *pgd = gd;
+    add_gendisk(gd);
+    
+    /* Now register each disk in turn. */
+    for ( i = 0; i < xdi->count; i++ )
+    {
+        disk  = xdi->disks[i].device & XENDEV_IDX_MASK;
+        minor = (disk-base) << XLIDE_PARTN_SHIFT; 
+
+        if ( !IS_IDE_XENDEV(xdi->disks[i].device) ||
+             (disk < base) || (disk >= (base + XLIDE_DEVS_PER_MAJOR)) ) 
+            continue;
+
+        ((xl_disk_t *)gd->real_devices)[disk].capacity =
+            xdi->disks[i].capacity;
+
+        switch (xdi->disks[i].type) 
+        { 
+        case XD_TYPE_CDROM:
+            set_device_ro(MKDEV(major, minor), 1); 
+
+        case XD_TYPE_FLOPPY: 
+        case XD_TYPE_TAPE:
+            gd->flags[disk] = GENHD_FL_REMOVABLE; 
+            printk(KERN_ALERT "Skipping partition check on %s /dev/%s\n", 
+                   xdi->disks[i].type==XD_TYPE_CDROM ? "cdrom" : 
+                   (xdi->disks[i].type==XD_TYPE_TAPE ? "tape" : "floppy"), 
+                   disk_name(gd, minor, buf)); 
+            break; 
+
+        case XD_TYPE_DISK: 
+            register_disk(gd, 
+                          MKDEV(major, minor), 
+                          1<<XLIDE_PARTN_SHIFT, 
+                          &xlide_block_fops, xdi->disks[i].capacity);
+            break; 
+
+        default: 
+            printk(KERN_ALERT "XenoLinux: unknown ide device type %d\n", 
+                   xdi->disks[i].type); 
+            break; 
+        }
+    }
+
+    return;
+}
+
+
+int xlide_init(xen_disk_info_t *xdi) 
+{
+    int i, units;
+
+    /* If we don't have any usable IDE devices we may as well bail now. */
+    units = 0;
+    for ( i = 0; i < xdi->count; i++ )
+        if ( IS_IDE_XENDEV(xdi->disks[i].device) &&
+             ((xdi->disks[i].device & XENDEV_IDX_MASK) <
+              (XLIDE_NR_MAJORS*XLIDE_DEVS_PER_MAJOR)) ) 
+            units++;
+    if ( units == 0 ) return 0;
+
+    SET_MODULE_OWNER(&xlide_block_fops);
+    
+    if ( get_major(XLIDE_MAJOR_0) < 0 )
+        return 0;
+    if ( get_major(XLIDE_MAJOR_1) < 0 )
+    {
+        (void)unregister_blkdev(XLIDE_MAJOR_0, XLIDE_MAJOR_NAME);
+        return 0;
+    }
+
+    /* Initialize global arrays. */
+    for ( i = 0; i < XLIDE_MAX; i++ )
+    {
+        xlide_blksize_size[i]  = 512;
+        xlide_hardsect_size[i] = 512;
+        xlide_max_sectors[i]   = 128;
+    }
+
+    setup_major(&xlide_gendisk[0], xdi, 0*XLIDE_DEVS_PER_MAJOR, XLIDE_MAJOR_0);
+    setup_major(&xlide_gendisk[1], xdi, 1*XLIDE_DEVS_PER_MAJOR, XLIDE_MAJOR_1);
+
+    return 0;
+}
+
+
+static void cleanup_major(int major)
+{
+    blk_cleanup_queue(BLK_DEFAULT_QUEUE(major));
+
+    read_ahead[major] = 0;
+
+    if ( blksize_size[major] != NULL )
+    { 
+       kfree(blksize_size[major]);
+        blksize_size[major] = NULL;
+    }
+
+    if ( hardsect_size[major] != NULL )
+    { 
+       kfree(hardsect_size[major]);
+        hardsect_size[major] = NULL;
+    }
+    
+    if ( max_sectors[major] != NULL )
+    { 
+       kfree(max_sectors[major]);
+        max_sectors[major] = NULL;
+    }
+    
+    (void)unregister_blkdev(major, XLIDE_MAJOR_NAME);
+}
+
+void xlide_cleanup(void)
+{
+    if ( xlide_gendisk[0] == NULL ) return;
+    xlide_gendisk[0] = NULL;
+    cleanup_major(XLIDE_MAJOR_0);
+    cleanup_major(XLIDE_MAJOR_1);
+}
+
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_scsi.c b/xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_scsi.c
new file mode 100644 (file)
index 0000000..c0f389f
--- /dev/null
@@ -0,0 +1,168 @@
+/******************************************************************************
+ * xl_scsi.c
+ * 
+ * Xenolinux virtual SCSI block-device driver.
+ */
+
+#include "xl_block.h"
+
+#define MAJOR_NR XLSCSI_MAJOR
+#include <linux/blk.h>
+
+#define XLSCSI_MAX        256
+#define XLSCSI_MAJOR_NAME "sd"
+static int xlscsi_blksize_size[XLSCSI_MAX];
+static int xlscsi_hardsect_size[XLSCSI_MAX];
+static int xlscsi_max_sectors[XLSCSI_MAX];
+
+struct gendisk *xlscsi_gendisk = NULL;
+
+static struct block_device_operations xlscsi_block_fops = 
+{
+    open:               xenolinux_block_open,
+    release:            xenolinux_block_release,
+    ioctl:              xenolinux_block_ioctl,
+    check_media_change: xenolinux_block_check,
+    revalidate:         xenolinux_block_revalidate,
+};
+
+
+/* tiny inteface fn */
+int xlscsi_hwsect(int minor) 
+{
+    return xlscsi_hardsect_size[minor]; 
+} 
+
+
+int xlscsi_init(xen_disk_info_t *xdi) 
+{
+    int i, result, units, minors, disk;
+    struct gendisk *gd;
+
+    /* If we don't have any usable SCSI devices we may as well bail now. */
+    units = 0;
+    for ( i = 0; i < xdi->count; i++ )
+        if ( IS_SCSI_XENDEV(xdi->disks[i].device) &&
+             ((xdi->disks[i].device & XENDEV_IDX_MASK) <
+              XLSCSI_DEVS_PER_MAJOR) ) 
+            units++;
+    if ( units == 0 ) return 0;
+
+    SET_MODULE_OWNER(&xlscsi_block_fops);
+
+    result = register_blkdev(XLSCSI_MAJOR, XLSCSI_MAJOR_NAME, 
+                             &xlscsi_block_fops);
+    if ( result < 0 )
+    {
+       printk (KERN_ALERT "XL SCSI: can't get major %d\n", XLSCSI_MAJOR);
+       return result;
+    }
+
+    /* Initialize global arrays. */
+    for ( i = 0; i < XLSCSI_MAX; i++ )
+    {
+       xlscsi_blksize_size[i]  = 1024; //XXX 512;
+       xlscsi_hardsect_size[i] = 512;
+       xlscsi_max_sectors[i]   = 128*8; //XXX 128
+    }
+
+    blk_size[XLSCSI_MAJOR]      = NULL;
+    blksize_size[XLSCSI_MAJOR]  = xlscsi_blksize_size;
+    hardsect_size[XLSCSI_MAJOR] = xlscsi_hardsect_size;
+    max_sectors[XLSCSI_MAJOR]   = xlscsi_max_sectors;
+    read_ahead[XLSCSI_MAJOR]    = 0; //XXX8;
+
+    blk_init_queue(BLK_DEFAULT_QUEUE(XLSCSI_MAJOR), do_xlblk_request);
+
+    /*
+     * Turn off barking 'headactive' mode. We dequeue buffer heads as
+     * soon as we pass them down to Xen.
+     */
+    blk_queue_headactive(BLK_DEFAULT_QUEUE(XLSCSI_MAJOR), 0);
+
+    units = XLSCSI_MAX >> XLSCSI_PARTN_SHIFT;
+
+    /* Construct an appropriate gendisk structure. */
+    minors    = units * (1<<XLSCSI_PARTN_SHIFT);
+    gd        = kmalloc(sizeof(struct gendisk), GFP_KERNEL);
+    gd->sizes = kmalloc(minors * sizeof(int), GFP_KERNEL);
+    gd->part  = kmalloc(minors * sizeof(struct hd_struct), GFP_KERNEL);
+    gd->major        = XLSCSI_MAJOR;
+    gd->major_name   = XLSCSI_MAJOR_NAME;
+    gd->minor_shift  = XLSCSI_PARTN_SHIFT; 
+    gd->max_p       = 1<<XLSCSI_PARTN_SHIFT;
+    gd->nr_real             = units;           
+    gd->real_devices = kmalloc(units * sizeof(xl_disk_t), GFP_KERNEL);
+    gd->next        = NULL;            
+    gd->fops         = &xlscsi_block_fops;
+    gd->de_arr       = kmalloc(sizeof(*gd->de_arr) * units, GFP_KERNEL);
+    gd->flags       = kmalloc(sizeof(*gd->flags) * units, GFP_KERNEL);
+    memset(gd->sizes, 0, minors * sizeof(int));
+    memset(gd->part,  0, minors * sizeof(struct hd_struct));
+    memset(gd->de_arr, 0, sizeof(*gd->de_arr) * units);
+    memset(gd->flags, 0, sizeof(*gd->flags) * units);
+    memset(gd->real_devices, 0, sizeof(xl_disk_t) * units);
+    xlscsi_gendisk = gd;
+    add_gendisk(gd);
+
+    /* Now register each disk in turn. */
+    for ( i = 0; i < xdi->count; i++ )
+    {
+        disk = xdi->disks[i].device & XENDEV_IDX_MASK;
+
+        if ( !IS_SCSI_XENDEV(xdi->disks[i].device) || 
+             (disk >= XLSCSI_DEVS_PER_MAJOR) )
+            continue;
+
+        ((xl_disk_t *)gd->real_devices)[disk].capacity =
+            xdi->disks[i].capacity;
+        register_disk(gd,
+                      MKDEV(XLSCSI_MAJOR, disk<<XLSCSI_PARTN_SHIFT), 
+                      1<<XLSCSI_PARTN_SHIFT, 
+                      &xlscsi_block_fops, 
+                      xdi->disks[i].capacity);
+    }
+   
+    printk(KERN_ALERT 
+          "XenoLinux Virtual SCSI Device Driver installed [device: %d]\n",
+          XLSCSI_MAJOR);
+
+    return 0;
+}
+
+
+void xlscsi_cleanup(void)
+{
+    if ( xlscsi_gendisk == NULL ) return;
+
+    blk_cleanup_queue(BLK_DEFAULT_QUEUE(XLSCSI_MAJOR));
+
+    xlscsi_gendisk = NULL;
+
+    read_ahead[XLSCSI_MAJOR] = 0;
+
+    if ( blksize_size[XLSCSI_MAJOR] != NULL )
+    { 
+       kfree(blksize_size[XLSCSI_MAJOR]);
+        blksize_size[XLSCSI_MAJOR] = NULL;
+    }
+
+    if ( hardsect_size[XLSCSI_MAJOR] != NULL )
+    { 
+       kfree(hardsect_size[XLSCSI_MAJOR]);
+        hardsect_size[XLSCSI_MAJOR] = NULL;
+    }
+    
+    if ( max_sectors[XLSCSI_MAJOR] != NULL )
+    { 
+       kfree(max_sectors[XLSCSI_MAJOR]);
+        max_sectors[XLSCSI_MAJOR] = NULL;
+    }
+    
+    if ( unregister_blkdev(XLSCSI_MAJOR, XLSCSI_MAJOR_NAME) != 0 )
+    {
+       printk(KERN_ALERT
+              "XenoLinux Virtual SCSI Device Driver uninstalled w/ errs\n");
+    }
+}
+
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_segment.c b/xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_segment.c
new file mode 100644 (file)
index 0000000..e746e2d
--- /dev/null
@@ -0,0 +1,182 @@
+/******************************************************************************
+ * xl_segment.c
+ * 
+ * Xenolinux virtual block-device driver (xvd).
+ * 
+ */
+
+#include "xl_block.h"
+
+#define MAJOR_NR XLVIRT_MAJOR
+#include <linux/blk.h>
+
+/* Copied from linux/ide.h */
+typedef unsigned char byte; 
+
+#define XLVIRT_MAX        256
+#define XLVIRT_MAJOR_NAME "xvd"
+static int xlseg_blksize_size[XLVIRT_MAX];
+static int xlseg_hardsect_size[XLVIRT_MAX];
+static int xlseg_max_sectors[XLVIRT_MAX];
+
+struct gendisk *xlsegment_gendisk = NULL;
+
+static xen_disk_info_t xlseg_disk_info;
+
+static struct block_device_operations xlsegment_block_fops = 
+{
+    open:               xenolinux_block_open,
+    release:            xenolinux_block_release,
+    ioctl:              xenolinux_block_ioctl,
+    check_media_change: xenolinux_block_check,
+    revalidate:         xenolinux_block_revalidate,
+};
+
+
+int xlsegment_hwsect(int minor) 
+{
+    return xlseg_hardsect_size[minor]; 
+} 
+
+
+int __init xlseg_init(void)
+{
+    int i, result, units, minors, disk;
+    xen_disk_info_t *xdi = &xlseg_disk_info;
+    struct gendisk *gd;
+
+    SET_MODULE_OWNER(&xlsegment_block_fops);
+
+    /* Probe for disk information. */
+    memset(xdi, 0, sizeof(*xdi));
+    xenolinux_control_msg(XEN_BLOCK_PROBE_SEG, (char *)xdi, sizeof(*xdi));
+
+    DPRINTK("xvd block device probe:\n");
+    for ( i = 0; i < xdi->count; i++ )
+    { 
+       DPRINTK("  %2d: device: %d, capacity: %ld\n",
+               i, xdi->disks[i].device, xdi->disks[i].capacity);
+    }
+
+    result = register_blkdev(XLVIRT_MAJOR, XLVIRT_MAJOR_NAME,
+                             &xlsegment_block_fops);
+    if ( result < 0 )
+    {
+       printk(KERN_ALERT "XL Segment: can't get major %d\n", XLVIRT_MAJOR);
+       return result;
+    }
+
+    /* Initialize global arrays. */
+    for (i = 0; i < XLVIRT_MAX; i++) 
+    {
+        xlseg_blksize_size[i]  = 512;
+        xlseg_hardsect_size[i] = 512;
+        xlseg_max_sectors[i]   = 128;
+    }
+
+    blk_size[XLVIRT_MAJOR]      = NULL;
+    blksize_size[XLVIRT_MAJOR]  = xlseg_blksize_size;
+    hardsect_size[XLVIRT_MAJOR] = xlseg_hardsect_size;
+    max_sectors[XLVIRT_MAJOR]   = xlseg_max_sectors;
+    read_ahead[XLVIRT_MAJOR]    = 8;
+
+    blk_init_queue(BLK_DEFAULT_QUEUE(XLVIRT_MAJOR), do_xlblk_request);
+
+    /*
+     * Turn off barking 'headactive' mode. We dequeue buffer heads as
+     * soon as we pass them down to Xen.
+     */
+    blk_queue_headactive(BLK_DEFAULT_QUEUE(XLVIRT_MAJOR), 0);
+
+    units = XLVIRT_MAX >> XLVIRT_PARTN_SHIFT;
+
+    /* Construct an appropriate gendisk structure. */
+    minors    = units * (1<<XLVIRT_PARTN_SHIFT);
+    gd        = kmalloc(sizeof(struct gendisk), GFP_KERNEL);
+    gd->sizes = kmalloc(minors * sizeof(int), GFP_KERNEL);
+    gd->part  = kmalloc(minors * sizeof(struct hd_struct), GFP_KERNEL);
+    gd->major        = XLVIRT_MAJOR;
+    gd->major_name   = XLVIRT_MAJOR_NAME;
+    gd->minor_shift  = XLVIRT_PARTN_SHIFT; 
+    gd->max_p       = 1<<XLVIRT_PARTN_SHIFT;
+    gd->nr_real             = units;           
+    gd->real_devices = kmalloc(units * sizeof(xl_disk_t), GFP_KERNEL);
+    gd->next        = NULL;            
+    gd->fops         = &xlsegment_block_fops;
+    gd->de_arr       = kmalloc(sizeof(*gd->de_arr) * units, GFP_KERNEL);
+    gd->flags       = kmalloc(sizeof(*gd->flags) * units, GFP_KERNEL);
+    memset(gd->sizes, 0, minors * sizeof(int));
+    memset(gd->part,  0, minors * sizeof(struct hd_struct));
+    memset(gd->de_arr, 0, sizeof(*gd->de_arr) * units);
+    memset(gd->flags, 0, sizeof(*gd->flags) * units);
+    memset(gd->real_devices, 0, sizeof(xl_disk_t) * units);
+    xlsegment_gendisk = gd;
+    add_gendisk(gd);
+
+    /* Now register each disk in turn. */
+    for ( i = 0; i < xdi->count; i++ )
+    {
+        disk = xdi->disks[i].device & XENDEV_IDX_MASK;
+
+        if ( !IS_VIRTUAL_XENDEV(xdi->disks[i].device) || 
+             (disk >= XLVIRT_DEVS_PER_MAJOR) )
+            continue;
+
+        ((xl_disk_t *)gd->real_devices)[disk].capacity =
+            xdi->disks[i].capacity;
+        register_disk(gd, 
+                      MKDEV(XLVIRT_MAJOR, disk<<XLVIRT_PARTN_SHIFT), 
+                      1<<XLVIRT_PARTN_SHIFT, 
+                      &xlsegment_block_fops, 
+                      xdi->disks[i].capacity);
+    }
+
+    printk(KERN_ALERT 
+          "XenoLinux Virtual Segment Device Driver installed [device: %d]\n",
+          XLVIRT_MAJOR);
+
+    return 0;
+}
+
+
+static void __exit xlseg_cleanup(void)
+{
+    if ( xlsegment_gendisk == NULL ) return;
+
+    blk_cleanup_queue(BLK_DEFAULT_QUEUE(XLVIRT_MAJOR));
+
+    xlsegment_gendisk = NULL;
+
+    read_ahead[XLVIRT_MAJOR] = 0;
+
+    if ( blksize_size[XLVIRT_MAJOR] != NULL )
+    { 
+       kfree(blksize_size[XLVIRT_MAJOR]);
+        blksize_size[XLVIRT_MAJOR] = NULL;
+    }
+
+    if ( hardsect_size[XLVIRT_MAJOR] != NULL )
+    { 
+       kfree(hardsect_size[XLVIRT_MAJOR]);
+        hardsect_size[XLVIRT_MAJOR] = NULL;
+    }
+    
+    if ( max_sectors[XLVIRT_MAJOR] != NULL )
+    { 
+       kfree(max_sectors[XLVIRT_MAJOR]);
+        max_sectors[XLVIRT_MAJOR] = NULL;
+    }
+    
+    if ( unregister_blkdev(XLVIRT_MAJOR, XLVIRT_MAJOR_NAME) != 0 )
+    {
+       printk(KERN_ALERT
+              "XenoLinux Virtual Segment Device Driver"
+               " uninstalled w/ errs\n");
+    }
+}
+
+
+#ifdef MODULE
+module_init(xlseg_init);
+module_exit(xlseg_cleanup);
+#endif
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_segment_proc.c b/xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_segment_proc.c
new file mode 100644 (file)
index 0000000..4647073
--- /dev/null
@@ -0,0 +1,333 @@
+/*
+ * xl_segment_proc.c
+ * 
+ * XenoLinux virtual disk proc interface .
+ */
+
+#include "xl_block.h"
+#include <linux/proc_fs.h>
+#include <linux/delay.h>
+#include <linux/seq_file.h>
+#include <asm/hypervisor-ifs/segment.h>
+
+static struct proc_dir_entry *vhd;
+
+static void *proc_vhd_next(struct seq_file *s, void *v, loff_t *pos)
+{
+    xen_segment_info_t *data;
+
+    if ( pos != NULL )
+        ++(*pos); 
+
+    data = v;
+    return data->count-- ? NULL : v;
+}
+
+static void *proc_vhd_start(struct seq_file *s, loff_t *ppos)
+{
+    loff_t pos = *ppos;
+    xen_segment_info_t *data;
+
+    data = kmalloc(sizeof(*data), GFP_KERNEL);
+    xenolinux_control_msg(XEN_BLOCK_PROBE_SEG_ALL, (char *)data, sizeof(*data));
+    data->count -= pos;
+
+    if (data->count > 0)
+       return data;
+
+    kfree(data);
+    return NULL;
+}
+
+static int proc_vhd_show(struct seq_file *s, void *v)
+{ 
+    xen_segment_info_t *data = v;
+
+    seq_printf (s,
+               "%x %x %10.10s %x\n",
+               data->segments[data->count - 1].domain,
+               data->segments[data->count - 1].seg_nr,
+               data->segments[data->count - 1].key,
+               data->segments[data->count - 1].mode);
+
+    return 0;
+}
+
+static void proc_vhd_stop(struct seq_file *s, void *v)
+{
+  kfree(v);
+}
+
+static struct seq_operations proc_vhd_op = {
+    .start         = proc_vhd_start,
+    .next          = proc_vhd_next,
+    .show          = proc_vhd_show,
+    .stop          = proc_vhd_stop
+};
+
+static int proc_open_vhd(struct inode *inode, struct file *file)
+{
+    return seq_open(file, &proc_vhd_op);
+}
+
+
+#define isdelim(c) \
+  (c==' '||c==','||c=='\n'||c=='\r'||c=='\t'||c==':'||c=='('||c==')' ? 1 : 0)
+
+char *get_string(char *string)                          /* a bit like strtok */
+{
+    static char *temp;
+    int loop = 0;
+
+    if (string != NULL)        
+        temp = string;
+    else
+        string = temp;
+
+ try_again:
+
+    while (!isdelim(string[loop]))
+    {
+        if (string[loop] == '\0')
+            return NULL;
+        loop++;
+    }
+
+    string[loop] = '\0';       
+    temp = (string + loop + 1);
+
+    if (loop == 0)
+    {
+        string = temp;
+        goto try_again;
+    }
+
+    return string;
+}
+
+
+#define isdigit(c) (c >= '0' && c <= '9' ? 1 : 0)
+unsigned long to_number(char *string)                                /* atoi */
+{
+    unsigned long value = 0;
+
+    if (string == NULL) return 0;
+
+    while (!isdigit(*string) && *string != '\0') string++;
+
+    while (isdigit(*string))
+    {
+        value = value * 10 + (*string - '0');
+        string++;
+    }
+
+    return value;
+}
+
+static int proc_write_vhd(struct file *file, const char *buffer,
+                         size_t count, loff_t *offp)
+{
+    char *local = kmalloc((count + 1) * sizeof(char), GFP_KERNEL);
+    char *string;
+    int loop;
+    xv_disk_t xvd;
+    int res;
+
+    if (!local)
+      return -ENOMEM;
+
+    memset (&xvd, 0, sizeof(xvd));
+
+    if (copy_from_user(local, buffer, count))
+    {
+       res = -EFAULT;
+       goto out;
+    }
+    local[count] = '\0';
+
+    res = count;
+    string = get_string(local); /* domain specifier */
+    if (string == NULL)
+    {
+       goto out;
+    }
+    if (*string != 'd' && *string != 'D')
+    {
+        printk (KERN_ALERT 
+                "error: domain specifier missing [%s]. should be \"domain\".\n",
+                string);
+       goto out;
+    }
+
+    string = get_string(NULL); /* domain number */
+    if (string == NULL)
+    {
+        printk (KERN_ALERT "error: domain number missing\n");
+       goto out;
+    }
+    xvd.domain = (int) to_number(string);
+
+    string = get_string(NULL);
+    if (string && (strcmp(string, "RO") == 0 || strcmp(string, "ro") == 0))
+    {
+        xvd.mode = XEN_DISK_READ_ONLY;
+    }
+    else if (string && (strcmp(string, "RW") == 0 || strcmp(string, "rw") == 0))
+    {
+        xvd.mode = XEN_DISK_READ_WRITE;
+    }
+    else
+    {
+        printk (KERN_ALERT 
+                "error: bad mode [%s]. should be \"rw\" or \"ro\".\n",
+                string);
+       goto out;
+    }
+
+    string = get_string(NULL);                           /* look for Segment */
+    if (string == NULL || (*string != 's' && *string != 'S'))
+    {
+        printk (KERN_ALERT 
+                "error: segment specifier missing [%s]. should be \"segment\".\n",
+                string);
+       goto out;
+    }
+
+    string = get_string(NULL);                             /* segment number */
+    if (string == NULL)
+    {
+        printk (KERN_ALERT "error: segment number missing\n");
+       goto out;
+    }
+    xvd.segment = (int) to_number(string);
+
+    string = get_string(NULL);                           /* look for key */
+    if (string == NULL || (*string != 'k' && *string != 'K'))
+    {
+        printk (KERN_ALERT 
+                "error: key specifier missing [%s]. should be \"key\".\n",
+                string);
+       goto out;
+    }
+    string = get_string(NULL);
+    if (string == NULL || strlen(string) != XEN_SEGMENT_KEYSIZE)
+    {
+       printk (KERN_ALERT "error: key missing\n");
+       goto out;
+    }
+    memcpy(xvd.key, string, XEN_SEGMENT_KEYSIZE);
+
+    string = get_string(NULL);                           /* look for Extents */
+    if (string == NULL || (*string != 'e' && *string != 'E'))
+    {
+        printk (KERN_ALERT 
+                "error: extents specifier missing [%s]. should be \"extents\".\n",
+                string);
+       goto out;
+    }
+
+    string = get_string(NULL);                          /* number of extents */
+    if (string == NULL)
+    {
+        printk (KERN_ALERT "error: number of extents missing\n");
+       goto out;
+    }
+    xvd.ext_count = (int) to_number(string);
+
+    /* ignore parenthesis */
+
+    for (loop = 0; loop < xvd.ext_count; loop++)
+    {
+        string = get_string(NULL);                          /* look for Disk */
+        if (string == NULL || (*string != 'd' && *string != 'D'))
+        {
+            printk (KERN_ALERT 
+                    "hmm, extent disk specifier missing [%s]. should be \"disk\".\n",
+                    string);
+           goto out;
+        }
+        string = get_string(NULL);                            /* disk number */
+        if (string == NULL)
+        {
+            printk (KERN_ALERT "error: disk number missing\n");
+           goto out;
+        }
+        xvd.extents[loop].disk = xldev_to_physdev((int) to_number(string));
+
+        string = get_string(NULL);                        /* look for Offset */
+        if (string == NULL || (*string != 'o' && *string != 'O'))
+        {
+            printk (KERN_ALERT 
+                    "error: disk offset missing [%s]. should be \"offset\".\n",
+                    string);
+           goto out;
+        }
+        string = get_string(NULL);                                 /* offset */
+        if (string == NULL)
+        {
+            printk (KERN_ALERT "error: offset missing\n");
+           goto out;
+        }
+        xvd.extents[loop].offset =  to_number(string);
+
+        string = get_string(NULL);                          /* look for Size */
+        if (string == NULL || (*string != 's' && *string != 'S'))
+        {
+            printk (KERN_ALERT 
+                    "error: extent size missing [%s]. should be \"size\".\n",
+                    string);
+           goto out;
+        }
+        string = get_string(NULL);                                   /* size */
+        if (string == NULL)
+        {
+            printk (KERN_ALERT "error: extent size missing\n");
+           goto out;
+        }
+        xvd.extents[loop].size =  to_number(string);
+    }
+
+    xenolinux_control_msg(XEN_BLOCK_SEG_CREATE, (char *)&xvd, sizeof(xvd));
+
+ out:
+    kfree(local);
+
+    return res;
+}
+
+static struct file_operations proc_vhd_operations = {
+    open:         proc_open_vhd,
+    read:         seq_read,
+    llseek:       seq_lseek,
+    release:      seq_release,
+    write:        proc_write_vhd
+};
+
+/******************************************************************/
+
+int __init xlseg_proc_init(void)
+{
+    if ( !(start_info.flags & SIF_PRIVILEGED) )
+        return 0;
+
+    vhd = create_proc_entry("xeno/vhd", 0600, NULL);
+    if ( vhd == NULL )
+        panic ("xlseg_init: unable to create vhd proc entry\n");
+
+    vhd->data       = NULL;
+    vhd->proc_fops  = &proc_vhd_operations;
+    vhd->owner      = THIS_MODULE;
+
+    printk(KERN_ALERT "XenoLinux Virtual Disk Device Monitor installed\n");
+    return 0;
+}
+
+static void __exit xlseg_proc_cleanup(void)
+{
+    printk(KERN_ALERT "XenoLinux Virtual Disk Device Monitor uninstalled\n");
+}
+
+#ifdef MODULE
+module_init(xlseg_proc_init);
+module_exit(xlseg_proc_cleanup);
+#endif
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/drivers/console/Makefile b/xenolinux-2.4.22-sparse/arch/xeno/drivers/console/Makefile
new file mode 100644 (file)
index 0000000..546180a
--- /dev/null
@@ -0,0 +1,3 @@
+O_TARGET := con.o
+obj-$(CONFIG_XEN_CONSOLE) := console.o
+include $(TOPDIR)/Rules.make
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/drivers/console/console.c b/xenolinux-2.4.22-sparse/arch/xeno/drivers/console/console.c
new file mode 100644 (file)
index 0000000..e69cd24
--- /dev/null
@@ -0,0 +1,229 @@
+/******************************************************************************
+ * console.c
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/errno.h>
+#include <linux/signal.h>
+#include <linux/sched.h>
+#include <linux/interrupt.h>
+#include <linux/tty.h>
+#include <linux/tty_flip.h>
+#include <linux/serial.h>
+#include <linux/major.h>
+#include <linux/ptrace.h>
+#include <linux/ioport.h>
+#include <linux/mm.h>
+#include <linux/slab.h>
+#include <linux/init.h>
+#include <linux/console.h>
+
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/uaccess.h>
+#include <asm/hypervisor.h>
+
+#define XENO_TTY_MINOR 123
+
+/*** useful function for console debugging -- goes straight to Xen ****/
+
+asmlinkage int xprintk(const char *fmt, ...)
+{
+        va_list args;
+        unsigned long flags;
+        int printed_len;
+        static char printk_buf[1024];
+
+        /* Emit the output into the temporary buffer */
+        va_start(args, fmt);
+        printed_len = vsnprintf(printk_buf, sizeof(printk_buf), fmt, args);
+        va_end(args);
+
+        // Useful Hack if things are going wrong very early in the day
+        (void)HYPERVISOR_console_write(printk_buf, sizeof(printk_buf));
+}
+
+
+
+/******************** Kernel console driver ********************************/
+
+static void xen_console_write(struct console *co, const char *s, unsigned count)
+{
+#define STRLEN 256
+    static char str[STRLEN];
+    static int pos = 0;
+    int len;
+    
+    /* We buffer output until we see a newline, or until the buffer is full. */
+    while ( count != 0 )
+    {
+        len = ((STRLEN - pos) > count) ? count : STRLEN - pos;
+        memcpy(str + pos, s, len);
+        pos   += len;
+        s     += len;
+        count -= len;
+        if ( (pos == STRLEN) || (str[pos-1] == '\n') )
+        {
+            (void)HYPERVISOR_console_write(str, pos);
+            pos = 0;
+        }
+    }
+}
+
+static kdev_t xen_console_device(struct console *c)
+{
+    /*
+     * This is the magic that binds our "struct console" to our
+     * "tty_struct", defined below.
+     */
+    return MKDEV(TTY_MAJOR, XENO_TTY_MINOR);
+}
+
+static struct console xen_console_info = {
+    name:              "xencons", /* Used to be xen_console, but we're only
+                                     actually allowed 8 charcters including
+                                     the terminator... */
+    write:             xen_console_write,
+    device:             xen_console_device,
+    flags:             CON_PRINTBUFFER,
+    index:             -1,
+};
+
+void xen_console_init(void)
+{
+  xprintk("xen_console_init\n");
+  register_console(&xen_console_info);
+}
+
+
+/******************** Initial /dev/console *********************************/
+
+
+static struct tty_driver xeno_console_driver;
+static int xeno_console_refcount;
+static struct tty_struct *xeno_console_table[1];
+static struct termios *xeno_console_termios[1];
+static struct termios *xeno_console_termios_locked[1];
+
+static int xeno_console_write_room(struct tty_struct *tty)
+{
+    return INT_MAX;
+}
+
+static int xeno_console_chars_in_buffer(struct tty_struct *tty)
+{
+    return 0;
+}
+
+static inline int xeno_console_xmit(int ch)
+{
+    char _ch = ch;
+    xen_console_write(NULL, &_ch, 1);
+    return 1;
+}
+
+static int xeno_console_write(struct tty_struct *tty, int from_user,
+                       const u_char * buf, int count)
+{
+    int i;
+
+    if ( from_user && verify_area(VERIFY_READ, buf, count) )
+    {
+        return -EINVAL;
+    }
+
+    for ( i = 0; i < count; i++ )
+    {
+        char ch;
+        if ( from_user )
+        {
+            __get_user(ch, buf + i);
+        }
+        else
+        {
+            ch = buf[i];
+        }
+        xeno_console_xmit(ch);
+    }
+    return i;
+}
+
+static void xeno_console_put_char(struct tty_struct *tty, u_char ch)
+{
+    xeno_console_xmit(ch);
+}
+
+static int xeno_console_open(struct tty_struct *tty, struct file *filp)
+{
+    int line;
+
+    MOD_INC_USE_COUNT;
+    line = MINOR(tty->device) - tty->driver.minor_start;
+    if ( line )
+    {
+        MOD_DEC_USE_COUNT;
+        return -ENODEV;
+    }
+
+    tty->driver_data = NULL;
+
+    return 0;
+}
+
+static void xeno_console_close(struct tty_struct *tty, struct file *filp)
+{
+    MOD_DEC_USE_COUNT;
+}
+
+int __init xeno_con_init(void)
+{
+    memset(&xeno_console_driver, 0, sizeof(struct tty_driver));
+    xeno_console_driver.magic           = TTY_DRIVER_MAGIC;
+    xeno_console_driver.driver_name     = "xeno_console";
+    xeno_console_driver.name            = "xencon";
+    xeno_console_driver.major           = TTY_MAJOR;
+    xeno_console_driver.minor_start     = XENO_TTY_MINOR;
+    xeno_console_driver.num             = 1;
+    xeno_console_driver.type            = TTY_DRIVER_TYPE_SERIAL;
+    xeno_console_driver.subtype         = SERIAL_TYPE_NORMAL;
+    xeno_console_driver.init_termios    = tty_std_termios;
+    xeno_console_driver.flags           = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS;
+    xeno_console_driver.refcount        = &xeno_console_refcount;
+    xeno_console_driver.table           = xeno_console_table;
+    xeno_console_driver.termios         = xeno_console_termios;
+    xeno_console_driver.termios_locked  = xeno_console_termios_locked;
+    /* Functions */
+    xeno_console_driver.open            = xeno_console_open;
+    xeno_console_driver.close           = xeno_console_close;
+    xeno_console_driver.write           = xeno_console_write;
+    xeno_console_driver.write_room      = xeno_console_write_room;
+    xeno_console_driver.put_char        = xeno_console_put_char;
+    xeno_console_driver.chars_in_buffer = xeno_console_chars_in_buffer;
+
+    if ( tty_register_driver(&xeno_console_driver) )
+    {
+        printk(KERN_ERR "Couldn't register Xeno console driver\n");
+    }
+    else
+    {
+        printk("Xeno console successfully installed\n");
+    }
+
+    return 0;
+}
+
+void __exit xeno_con_fini(void)
+{
+    int ret;
+
+    ret = tty_unregister_driver(&xeno_console_driver);
+    if ( ret != 0 )
+    {
+        printk(KERN_ERR "Unable to unregister Xeno console driver: %d\n", ret);
+    }
+}
+
+module_init(xeno_con_init);
+module_exit(xeno_con_fini);
+
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/drivers/dom0/Makefile b/xenolinux-2.4.22-sparse/arch/xeno/drivers/dom0/Makefile
new file mode 100644 (file)
index 0000000..9030801
--- /dev/null
@@ -0,0 +1,3 @@
+O_TARGET := dom0.o
+obj-y := dom0_core.o vfr.o
+include $(TOPDIR)/Rules.make
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/drivers/dom0/dom0_core.c b/xenolinux-2.4.22-sparse/arch/xeno/drivers/dom0/dom0_core.c
new file mode 100644 (file)
index 0000000..20db18a
--- /dev/null
@@ -0,0 +1,161 @@
+/******************************************************************************
+ * dom0_core.c
+ * 
+ * Interface to privileged domain-0 commands.
+ * 
+ * Copyright (c) 2002-2003, K A Fraser, B Dragovic
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/errno.h>
+#include <linux/proc_fs.h>
+#include <linux/mm.h>
+#include <linux/mman.h>
+#include <linux/swap.h>
+#include <linux/smp_lock.h>
+#include <linux/swapctl.h>
+#include <linux/iobuf.h>
+#include <linux/highmem.h>
+#include <linux/pagemap.h>
+#include <linux/seq_file.h>
+
+#include <asm/pgalloc.h>
+#include <asm/pgtable.h>
+#include <asm/uaccess.h>
+#include <asm/tlb.h>
+#include <asm/proc_cmd.h>
+#include <asm/hypervisor-ifs/dom0_ops.h>
+
+#include "../block/xl_block.h"
+
+struct proc_dir_entry *xeno_base;
+static struct proc_dir_entry *privcmd_intf;
+
+
+static int privcmd_ioctl(struct inode *inode, struct file *file,
+                         unsigned int cmd, unsigned long data)
+{
+    int ret = 0;
+
+    switch ( cmd )
+    {
+    case IOCTL_PRIVCMD_HYPERCALL:
+    {
+        privcmd_hypercall_t hypercall;
+  
+        if ( copy_from_user(&hypercall, (void *)data, sizeof(hypercall)) )
+            return -EFAULT;
+
+        __asm__ __volatile__ (
+            "pushl %%ebx; pushl %%ecx; pushl %%edx; pushl %%esi; pushl %%edi; "
+            "movl  4(%%eax),%%ebx ;"
+            "movl  8(%%eax),%%ecx ;"
+            "movl 12(%%eax),%%edx ;"
+            "movl 16(%%eax),%%esi ;"
+            "movl 20(%%eax),%%edi ;"
+            "movl   (%%eax),%%eax ;"
+            TRAP_INSTR "; "
+            "popl %%edi; popl %%esi; popl %%edx; popl %%ecx; popl %%ebx"
+            : "=a" (ret) : "0" (&hypercall) : "memory" );
+    }
+    break;
+
+    case IOCTL_PRIVCMD_BLKMSG:
+    {
+        privcmd_blkmsg_t blkmsg;
+        char            *kbuf;
+        int              ret;
+  
+        if ( copy_from_user(&blkmsg, (void *)data, sizeof(blkmsg)) )
+            return -EFAULT;
+  
+        if ( blkmsg.buf_size > PAGE_SIZE )
+            return -EINVAL;
+  
+        if ( (kbuf = kmalloc(blkmsg.buf_size, GFP_KERNEL)) == NULL )
+            return -ENOMEM;
+  
+        if ( copy_from_user(kbuf, blkmsg.buf, blkmsg.buf_size) ) {
+            kfree(kbuf);
+            return -EFAULT;
+        }
+  
+        ret = xenolinux_control_msg((int)blkmsg.op, kbuf, blkmsg.buf_size);
+        if ( ret != 0 ) {
+            kfree(kbuf);
+            return ret;
+        }
+  
+        if ( copy_to_user(blkmsg.buf, kbuf, blkmsg.buf_size) ) {
+            kfree(kbuf);
+            return -EFAULT;
+        }
+  
+        kfree(kbuf);
+    }
+    break;
+    
+    case IOCTL_PRIVCMD_LINDEV_TO_XENDEV:
+    {
+        ret = (int)xldev_to_physdev((kdev_t)data);
+    }
+    break;
+
+    case IOCTL_PRIVCMD_XENDEV_TO_LINDEV:
+    {
+        ret = (int)physdev_to_xldev((unsigned short)data);
+    }
+    break;
+
+    default:
+    {
+        ret = -EINVAL;
+    }
+    break;
+    }
+
+    return ret;
+}
+
+
+static struct file_operations privcmd_file_ops = {
+  ioctl : privcmd_ioctl
+};
+
+
+static int __init init_module(void)
+{
+    if ( !(start_info.flags & SIF_PRIVILEGED) )
+        return 0;
+
+    /* xeno proc root setup */
+    xeno_base = proc_mkdir("xeno", &proc_root); 
+
+    /* xeno control interface */
+    privcmd_intf = create_proc_entry("privcmd", 0400, xeno_base);
+    if ( privcmd_intf != NULL )
+    {
+        privcmd_intf->owner      = THIS_MODULE;
+        privcmd_intf->nlink      = 1;
+       privcmd_intf->proc_fops  = &privcmd_file_ops;
+    }
+
+    return 0;
+}
+
+
+static void __exit cleanup_module(void)
+{
+    if ( privcmd_intf == NULL ) return;
+    remove_proc_entry("xeno", &proc_root);
+    privcmd_intf = NULL;
+}
+
+
+module_init(init_module);
+module_exit(cleanup_module);
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/drivers/dom0/vfr.c b/xenolinux-2.4.22-sparse/arch/xeno/drivers/dom0/vfr.c
new file mode 100644 (file)
index 0000000..8c9f653
--- /dev/null
@@ -0,0 +1,323 @@
+/******************************************************************************
+ * vfr.c
+ *
+ * Interface to the virtual firewall/router.
+ *
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/errno.h>
+#include <linux/proc_fs.h>
+
+#include <asm/hypervisor-ifs/network.h>
+
+static struct proc_dir_entry *proc_vfr;
+
+static unsigned char readbuf[1024];
+
+extern struct proc_dir_entry *xeno_base;
+
+/* Helpers, implemented at the bottom. */
+u32 getipaddr(const char *buff, unsigned int len);
+u16 antous(const char *buff, int len);
+int anton(const char *buff, int len);
+
+static int vfr_read_proc(char *page, char **start, off_t off,
+                         int count, int *eof, void *data)
+{   
+    strcpy(page, readbuf);
+    *readbuf = '\0';
+    *eof = 1;
+    *start = page;
+    return strlen(page);
+}
+
+/* The format for the vfr interface is as follows:
+ *
+ *  COMMAND <field>=<val> [<field>=<val> [...]]
+ *
+ *  where:
+ *
+ *  COMMAND = { ACCEPT | COUNT }
+ *
+ *  field=val pairs are as follows:
+ *
+ *  field = { srcaddr | dstaddr }
+ *      val is a dot seperated, numeric IP address.
+ *
+ *  field = { srcport | dstport }
+ *      val is a (16-bit) unsigned int
+ *
+ *  field = { proto }
+ *      val = { IP | TCP | UDP | ARP }
+ *
+ */
+
+#define isspace(_x) ( ((_x)==' ')  || ((_x)=='\t') || ((_x)=='\v') || \
+                     ((_x)=='\f') || ((_x)=='\r') || ((_x)=='\n') )
+
+static int vfr_write_proc(struct file *file, const char *buffer,
+                          u_long count, void *data)
+{
+    network_op_t op;
+    int ret, len;
+    int ts, te, tl; // token start, end, and length
+    int fs, fe, fl; // field.
+
+    len = count;
+    ts = te = 0;
+
+    memset(&op, 0, sizeof(network_op_t));
+
+    // get the command:
+    while ( count && isspace(buffer[ts]) ) { ts++; count--; } // skip spaces.
+    te = ts;
+    while ( count && !isspace(buffer[te]) ) { te++; count--; } // command end
+    if ( te <= ts ) goto bad;
+    tl = te - ts;
+  
+    if ( strncmp(&buffer[ts], "ADD", tl) == 0 )
+    {
+        op.cmd = NETWORK_OP_ADDRULE;
+    }
+    else if ( strncmp(&buffer[ts], "DELETE", tl) == 0 )
+    {
+        op.cmd = NETWORK_OP_DELETERULE;
+    }
+    else if ( strncmp(&buffer[ts], "PRINT", tl) == 0 )
+    {
+        op.cmd = NETWORK_OP_GETRULELIST;
+        goto doneparsing;
+    }
+        
+    ts = te;
+  
+    // get the action
+    while ( count && (buffer[ts] == ' ') ) { ts++; count--; } // skip spaces.
+    te = ts;
+    while ( count && (buffer[te] != ' ') ) { te++; count--; } // command end
+    if ( te <= ts ) goto bad;
+    tl = te - ts;
+
+    if ( strncmp(&buffer[ts], "ACCEPT", tl) == 0 ) 
+    {
+        op.u.net_rule.action = NETWORK_ACTION_ACCEPT;
+        goto keyval;
+    }
+    if ( strncmp(&buffer[ts], "COUNT", tl) == 0 ) 
+    {
+        op.u.net_rule.action = NETWORK_ACTION_COUNT;
+        goto keyval;
+    }
+   
+    // default case;
+    return (len);
+  
+
+    // get the key=val pairs.
+ keyval:
+    while (count)
+    {
+        //get field
+        ts = te; while ( count && isspace(buffer[ts]) ) { ts++; count--; }
+        te = ts;
+        while ( count && !isspace(buffer[te]) && (buffer[te] != '=') ) 
+        { te++; count--; }
+        if ( te <= ts )
+            goto doneparsing;
+        tl = te - ts;
+        fs = ts; fe = te; fl = tl; // save the field markers.
+        // skip "   =   " (ignores extra equals.)
+        while ( count && (isspace(buffer[te]) || (buffer[te] == '=')) ) 
+        { te++; count--; }
+        ts = te;
+        while ( count && !isspace(buffer[te]) ) { te++; count--; }
+        tl = te - ts;
+
+        if ( (fl <= 0) || (tl <= 0) ) goto bad;
+
+        /* NB. Prefix matches must go first! */
+        if (strncmp(&buffer[fs], "src", fl) == 0)
+        {
+            op.u.net_rule.src_vif = VIF_ANY_INTERFACE;
+        }
+        else if (strncmp(&buffer[fs], "dst", fl) == 0)
+        {
+            op.u.net_rule.dst_vif = VIF_PHYSICAL_INTERFACE;
+        }
+        else if (strncmp(&buffer[fs], "srcaddr", fl) == 0) 
+        {  
+            op.u.net_rule.src_addr = getipaddr(&buffer[ts], tl);
+        }
+        else if (strncmp(&buffer[fs], "dstaddr", fl) == 0)
+        {    
+            op.u.net_rule.dst_addr = getipaddr(&buffer[ts], tl);
+        }
+        else if (strncmp(&buffer[fs], "srcaddrmask", fl) == 0) 
+        {
+            op.u.net_rule.src_addr_mask = getipaddr(&buffer[ts], tl);
+        }
+        else if (strncmp(&buffer[fs], "dstaddrmask", fl) == 0)
+        {
+            op.u.net_rule.dst_addr_mask = getipaddr(&buffer[ts], tl);
+        }
+        else if (strncmp(&buffer[fs], "srcport", fl) == 0)
+        {
+            op.u.net_rule.src_port = antous(&buffer[ts], tl);
+        }
+        else if (strncmp(&buffer[fs], "dstport", fl) == 0)
+        {
+            op.u.net_rule.dst_port = antous(&buffer[ts], tl);
+        }
+        else if (strncmp(&buffer[fs], "srcportmask", fl) == 0)
+        {
+            op.u.net_rule.src_port_mask = antous(&buffer[ts], tl);
+        }
+        else if (strncmp(&buffer[fs], "dstportmask", fl) == 0)
+        {
+            op.u.net_rule.dst_port_mask = antous(&buffer[ts], tl);
+        }
+        else if (strncmp(&buffer[fs], "srcdom", fl) == 0)
+        {
+            op.u.net_rule.src_vif |= anton(&buffer[ts], tl)<<VIF_DOMAIN_SHIFT;
+        }
+        else if (strncmp(&buffer[fs], "srcidx", fl) == 0)
+        {
+            op.u.net_rule.src_vif |= anton(&buffer[ts], tl);
+        }
+        else if (strncmp(&buffer[fs], "dstdom", fl) == 0)
+        {
+            op.u.net_rule.dst_vif |= anton(&buffer[ts], tl)<<VIF_DOMAIN_SHIFT;
+        }
+        else if (strncmp(&buffer[fs], "dstidx", fl) == 0)
+        {
+            op.u.net_rule.dst_vif |= anton(&buffer[ts], tl);
+        }
+        else if ( (strncmp(&buffer[fs], "proto", fl) == 0))
+        {      
+            if (strncmp(&buffer[ts], "any", tl) == 0) 
+                op.u.net_rule.proto = NETWORK_PROTO_ANY; 
+            if (strncmp(&buffer[ts], "ip", tl) == 0)
+                op.u.net_rule.proto = NETWORK_PROTO_IP;
+            if (strncmp(&buffer[ts], "tcp", tl) == 0) 
+                op.u.net_rule.proto = NETWORK_PROTO_TCP;
+            if (strncmp(&buffer[ts], "udp", tl) == 0)
+                op.u.net_rule.proto = NETWORK_PROTO_UDP;
+            if (strncmp(&buffer[ts], "arp", tl) == 0)
+                op.u.net_rule.proto = NETWORK_PROTO_ARP;
+        }
+    }
+
+ doneparsing:  
+    ret = HYPERVISOR_network_op(&op);
+    return(len);
+
+ bad:
+    return(len);
+    
+    
+}
+
+static int __init init_module(void)
+{
+    *readbuf = '\0';
+    proc_vfr = create_proc_entry ("vfr", 0600, xeno_base);
+    if ( proc_vfr != NULL )
+    {
+        proc_vfr->owner      = THIS_MODULE;
+        proc_vfr->nlink      = 1;
+        proc_vfr->read_proc  = vfr_read_proc;
+        proc_vfr->write_proc = vfr_write_proc;
+        printk("Successfully installed virtual firewall/router interface\n");
+    }
+    return 0;
+}
+
+static void __exit cleanup_module(void)
+{
+    if ( proc_vfr == NULL ) return;
+    remove_proc_entry("vfr", xeno_base);
+    proc_vfr = NULL;
+}
+
+module_init(init_module);
+module_exit(cleanup_module);
+
+/* Helper functions start here: */
+
+int anton(const char *buff, int len)
+{
+    int ret;
+    char c;
+    int sign = 1;
+    
+    ret = 0;
+
+    if (len == 0) return 0;
+    if (*buff == '-') { sign = -1; buff++; len--; }
+
+    while ( (len) && ((c = *buff) >= '0') && (c <= '9') )
+    {
+        ret *= 10;
+        ret += c - '0';
+        buff++; len--;
+    }
+
+    ret *= sign;
+    return ret;
+}
+    
+u16 antous(const char *buff, int len)
+{
+    u16 ret;
+    char c;
+
+    ret = 0;
+
+    while ( (len) && ((c = *buff) >= '0') && (c <= '9') )
+    {
+        ret *= 10;
+        ret += c - '0';
+        buff++; len--;
+    }
+
+    return ret;
+}
+
+u32 getipaddr(const char *buff, unsigned int len)
+{
+    char c;
+    u32 ret, val;
+
+    ret = 0; val = 0;
+
+    while ( len )
+    {
+        if (!((((c = *buff) >= '0') && ( c <= '9')) || ( c == '.' ) ) ) 
+        {
+            return(0); // malformed.
+        }
+
+        if ( c == '.' ) {
+            if (val > 255) return (0); //malformed.
+            ret = ret << 8; 
+            ret += val;
+            val = 0;
+            len--; buff++;
+            continue;
+        }
+        val *= 10;
+        val += c - '0';
+        buff++; len--;
+    }
+    ret = ret << 8;
+    ret += val;
+
+    return (ret);
+}
+
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/drivers/network/Makefile b/xenolinux-2.4.22-sparse/arch/xeno/drivers/network/Makefile
new file mode 100644 (file)
index 0000000..b44a288
--- /dev/null
@@ -0,0 +1,3 @@
+O_TARGET := net.o
+obj-y := network.o
+include $(TOPDIR)/Rules.make
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/drivers/network/network.c b/xenolinux-2.4.22-sparse/arch/xeno/drivers/network/network.c
new file mode 100644 (file)
index 0000000..3d12699
--- /dev/null
@@ -0,0 +1,582 @@
+/******************************************************************************
+ * network.c
+ * 
+ * Virtual network driver for XenoLinux.
+ * 
+ * Copyright (c) 2002-2003, K A Fraser
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/errno.h>
+
+#include <linux/netdevice.h>
+#include <linux/inetdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/skbuff.h>
+#include <linux/init.h>
+
+#include <asm/io.h>
+#include <net/sock.h>
+#include <net/pkt_sched.h>
+
+#define NET_IRQ _EVENT_NET
+
+#define TX_MAX_ENTRIES (TX_RING_SIZE - 2)
+#define RX_MAX_ENTRIES (RX_RING_SIZE - 2)
+
+#define TX_RING_INC(_i)    (((_i)+1) & (TX_RING_SIZE-1))
+#define RX_RING_INC(_i)    (((_i)+1) & (RX_RING_SIZE-1))
+#define TX_RING_ADD(_i,_j) (((_i)+(_j)) & (TX_RING_SIZE-1))
+#define RX_RING_ADD(_i,_j) (((_i)+(_j)) & (RX_RING_SIZE-1))
+
+#define RX_BUF_SIZE ((PAGE_SIZE/2)+1) /* Fool the slab allocator :-) */
+
+static void network_interrupt(int irq, void *dev_id, struct pt_regs *ptregs);
+static void network_tx_buf_gc(struct net_device *dev);
+static void network_alloc_rx_buffers(struct net_device *dev);
+static void network_free_rx_buffers(struct net_device *dev);
+static void cleanup_module(void);
+
+static struct list_head dev_list;
+
+/*
+ * Needed because network_close() is not properly implemented yet. So
+ * an open after a close needs to do much less than the initial open.
+ */
+static int opened_once_already = 0;
+
+struct net_private
+{
+    struct list_head list;
+    struct net_device *dev;
+
+    struct net_device_stats stats;
+    atomic_t tx_entries;
+    unsigned int rx_resp_cons, tx_resp_cons, tx_full;
+    net_ring_t *net_ring;
+    net_idx_t  *net_idx;
+    spinlock_t tx_lock;
+    unsigned int idx; /* Domain-specific index of this VIF. */
+
+    unsigned int rx_bufs_to_notify;
+
+    /*
+     * {tx,rx}_skbs store outstanding skbuffs. The first entry in each
+     * array is an index into a chain of free entries.
+     */
+    struct sk_buff *tx_skbs[TX_RING_SIZE];
+    struct sk_buff *rx_skbs[RX_RING_SIZE];
+};
+
+/* Access macros for acquiring freeing slots in {tx,rx}_skbs[]. */
+#define ADD_ID_TO_FREELIST(_list, _id)             \
+    (_list)[(_id)] = (_list)[0];                   \
+    (_list)[0]     = (void *)(unsigned long)(_id);
+#define GET_ID_FROM_FREELIST(_list)                \
+ ({ unsigned long _id = (unsigned long)(_list)[0]; \
+    (_list)[0]  = (_list)[_id];                    \
+    _id; })
+
+
+static void dbg_network_int(int irq, void *dev_id, struct pt_regs *ptregs)
+{
+    struct net_device *dev = (struct net_device *)dev_id;
+    struct net_private *np = dev->priv;
+    printk(KERN_ALERT "tx_full = %d, tx_entries = %d, tx_resp_cons = %d,"
+           " tx_req_prod = %d, tx_resp_prod = %d, tx_event = %d, state=%d\n",
+           np->tx_full, atomic_read(&np->tx_entries), np->tx_resp_cons, 
+           np->net_idx->tx_req_prod, np->net_idx->tx_resp_prod, 
+           np->net_idx->tx_event,
+           test_bit(__LINK_STATE_XOFF, &dev->state));
+    printk(KERN_ALERT "rx_resp_cons = %d,"
+           " rx_req_prod = %d, rx_resp_prod = %d, rx_event = %d\n",
+           np->rx_resp_cons, np->net_idx->rx_req_prod,
+           np->net_idx->rx_resp_prod, np->net_idx->rx_event);
+}
+
+
+static int network_open(struct net_device *dev)
+{
+    struct net_private *np = dev->priv;
+    int i, error = 0;
+
+    if ( opened_once_already )
+    {
+        memset(&np->stats, 0, sizeof(np->stats));
+        netif_start_queue(dev);
+        return 0;
+    }
+
+    np->rx_bufs_to_notify = 0;
+    np->rx_resp_cons = np->tx_resp_cons = np->tx_full = 0;
+    memset(&np->stats, 0, sizeof(np->stats));
+    spin_lock_init(&np->tx_lock);
+    atomic_set(&np->tx_entries, 0);
+    memset(np->net_ring, 0, sizeof(*np->net_ring));
+    memset(np->net_idx, 0, sizeof(*np->net_idx));
+
+    /* Initialise {tx,rx}_skbs to be a free chain containing every entry. */
+    for ( i = 0; i < TX_RING_SIZE; i++ )
+        np->tx_skbs[i] = (void *)(i+1);
+    for ( i = 0; i < RX_RING_SIZE; i++ )
+        np->rx_skbs[i] = (void *)(i+1);
+
+    network_alloc_rx_buffers(dev);
+
+    error = request_irq(NET_IRQ, network_interrupt, 
+                        SA_SAMPLE_RANDOM, "network", dev);
+    if ( error )
+    {
+        printk(KERN_WARNING "%s: Could not allocate network interrupt\n",
+               dev->name);
+        network_free_rx_buffers(dev);
+        goto fail;
+    }
+
+    error = request_irq(_EVENT_DEBUG, dbg_network_int, SA_SHIRQ,
+                        "debug", dev);
+    if ( error )
+    {
+        printk(KERN_WARNING "%s: Non-fatal error -- no debug interrupt\n",
+               dev->name);
+    }
+
+    printk("XenoLinux Virtual Network Driver installed as %s\n", dev->name);
+
+    netif_start_queue(dev);
+
+    MOD_INC_USE_COUNT;
+
+    opened_once_already = 1;
+
+    return 0;
+
+ fail:
+    kfree(np);
+    return error;
+}
+
+
+static void network_tx_buf_gc(struct net_device *dev)
+{
+    unsigned int i;
+    struct net_private *np = dev->priv;
+    struct sk_buff *skb;
+    unsigned int prod;
+    tx_entry_t *tx_ring = np->net_ring->tx_ring;
+
+    do {
+        prod = np->net_idx->tx_resp_prod;
+
+        for ( i = np->tx_resp_cons; i != prod; i = TX_RING_INC(i) )
+        {
+            skb = np->tx_skbs[tx_ring[i].resp.id];
+            ADD_ID_TO_FREELIST(np->tx_skbs, tx_ring[i].resp.id);
+            dev_kfree_skb_any(skb);
+            atomic_dec(&np->tx_entries);
+        }
+        
+        np->tx_resp_cons = prod;
+        
+        /* Set a new event, then check for race with update of tx_cons. */
+        np->net_idx->tx_event =
+            TX_RING_ADD(prod, (atomic_read(&np->tx_entries)>>1) + 1);
+        smp_mb();
+    }
+    while ( prod != np->net_idx->tx_resp_prod );
+
+    if ( np->tx_full && (atomic_read(&np->tx_entries) < TX_MAX_ENTRIES) )
+    {
+        np->tx_full = 0;
+        netif_wake_queue(dev);
+    }
+}
+
+
+static inline pte_t *get_ppte(void *addr)
+{
+    pgd_t *pgd; pmd_t *pmd; pte_t *pte;
+    pgd = pgd_offset_k(   (unsigned long)addr);
+    pmd = pmd_offset(pgd, (unsigned long)addr);
+    pte = pte_offset(pmd, (unsigned long)addr);
+    return pte;
+}
+
+
+static void network_alloc_rx_buffers(struct net_device *dev)
+{
+    unsigned int i, id;
+    struct net_private *np = dev->priv;
+    struct sk_buff *skb;
+    unsigned int end = RX_RING_ADD(np->rx_resp_cons, RX_MAX_ENTRIES);    
+
+    if ( (i = np->net_idx->rx_req_prod) == end )
+        return;
+
+    do {
+        skb = dev_alloc_skb(RX_BUF_SIZE);
+        if ( skb == NULL ) break;
+        skb->dev = dev;
+
+        id = GET_ID_FROM_FREELIST(np->rx_skbs);
+        np->rx_skbs[id] = skb;
+
+        np->net_ring->rx_ring[i].req.id   = (unsigned short)id;
+        np->net_ring->rx_ring[i].req.addr = 
+            virt_to_machine(get_ppte(skb->head));
+
+        np->rx_bufs_to_notify++;
+    }
+    while ( (i = RX_RING_INC(i)) != end );
+
+    /*
+     * We may have allocated buffers which have entries outstanding in the page
+     * update queue -- make sure we flush those first!
+     */
+    flush_page_update_queue();
+
+    np->net_idx->rx_req_prod = i;
+    np->net_idx->rx_event    = RX_RING_INC(np->rx_resp_cons);
+        
+    /* Batch Xen notifications. */
+    if ( np->rx_bufs_to_notify > (RX_MAX_ENTRIES/4) )
+    {
+        HYPERVISOR_net_update();
+        np->rx_bufs_to_notify = 0;
+    }
+}
+
+
+static void network_free_rx_buffers(struct net_device *dev)
+{
+    unsigned int i;
+    struct net_private *np = dev->priv;
+    struct sk_buff *skb;    
+
+    for ( i  = np->rx_resp_cons; 
+          i != np->net_idx->rx_req_prod; 
+          i  = RX_RING_INC(i) )
+    {
+        skb = np->rx_skbs[np->net_ring->rx_ring[i].req.id];
+        dev_kfree_skb_any(skb);
+    }
+}
+
+static int network_start_xmit(struct sk_buff *skb, struct net_device *dev)
+{
+    unsigned int i, id;
+    struct net_private *np = (struct net_private *)dev->priv;
+
+    if ( np->tx_full )
+    {
+        printk(KERN_ALERT "%s: full queue wasn't stopped!\n", dev->name);
+        netif_stop_queue(dev);
+        return -ENOBUFS;
+    }
+
+    if ( (((unsigned long)skb->data & ~PAGE_MASK) + skb->len) >= PAGE_SIZE )
+    {
+        struct sk_buff *new_skb = dev_alloc_skb(RX_BUF_SIZE);
+        if ( new_skb == NULL ) return 1;
+        skb_put(new_skb, skb->len);
+        memcpy(new_skb->data, skb->data, skb->len);
+        dev_kfree_skb(skb);
+        skb = new_skb;
+    }   
+    
+    spin_lock_irq(&np->tx_lock);
+
+    i = np->net_idx->tx_req_prod;
+
+    id = GET_ID_FROM_FREELIST(np->tx_skbs);
+    np->tx_skbs[id] = skb;
+
+    np->net_ring->tx_ring[i].req.id   = (unsigned short)id;
+    np->net_ring->tx_ring[i].req.addr =
+        phys_to_machine(virt_to_phys(skb->data));
+    np->net_ring->tx_ring[i].req.size = skb->len;
+    np->net_idx->tx_req_prod = TX_RING_INC(i);
+    atomic_inc(&np->tx_entries);
+
+    network_tx_buf_gc(dev);
+
+    if ( atomic_read(&np->tx_entries) >= TX_MAX_ENTRIES )
+    {
+        np->tx_full = 1;
+        netif_stop_queue(dev);
+    }
+
+    spin_unlock_irq(&np->tx_lock);
+
+    np->stats.tx_bytes += skb->len;
+    np->stats.tx_packets++;
+
+    /* Only notify Xen if there are no outstanding responses. */
+    smp_mb();
+    if ( np->net_idx->tx_resp_prod == i )
+        HYPERVISOR_net_update();
+
+    return 0;
+}
+
+
+static void network_interrupt(int irq, void *dev_id, struct pt_regs *ptregs)
+{
+    unsigned int i;
+    unsigned long flags;
+    struct net_device *dev = (struct net_device *)dev_id;
+    struct net_private *np = dev->priv;
+    struct sk_buff *skb;
+    rx_resp_entry_t *rx;
+    
+    spin_lock_irqsave(&np->tx_lock, flags);
+    network_tx_buf_gc(dev);
+    spin_unlock_irqrestore(&np->tx_lock, flags);
+
+ again:
+    for ( i  = np->rx_resp_cons; 
+          i != np->net_idx->rx_resp_prod; 
+          i  = RX_RING_INC(i) )
+    {
+        rx  = &np->net_ring->rx_ring[i].resp;
+
+        skb = np->rx_skbs[rx->id];
+        ADD_ID_TO_FREELIST(np->rx_skbs, rx->id);
+
+        if ( rx->status != RING_STATUS_OK )
+        {
+            printk(KERN_ALERT "bad buffer on RX ring!(%d)\n", rx->status);
+            dev_kfree_skb_any(skb);
+            continue;
+        }
+
+        /*
+         * Set up shinfo -- from alloc_skb This was particularily nasty:  the
+         * shared info is hidden at the back of the data area (presumably so it
+         * can be shared), but on page flip it gets very spunked.
+         */
+        atomic_set(&(skb_shinfo(skb)->dataref), 1);
+        skb_shinfo(skb)->nr_frags = 0;
+        skb_shinfo(skb)->frag_list = NULL;
+                                
+        phys_to_machine_mapping[virt_to_phys(skb->head) >> PAGE_SHIFT] =
+            (*(unsigned long *)get_ppte(skb->head)) >> PAGE_SHIFT;
+
+        if ( rx->offset < 16 )
+        {
+            printk(KERN_ALERT "need pkt offset >= 16 (got %d)\n", rx->offset);
+            dev_kfree_skb_any(skb);
+            continue;
+        }
+        
+        skb_reserve(skb, rx->offset - 16);
+
+        skb_put(skb, rx->size);
+        skb->protocol = eth_type_trans(skb, dev);
+
+        np->stats.rx_packets++;
+
+        np->stats.rx_bytes += rx->size;
+        netif_rx(skb);
+        dev->last_rx = jiffies;
+    }
+
+    np->rx_resp_cons = i;
+
+    network_alloc_rx_buffers(dev);
+    
+    /* Deal with hypervisor racing our resetting of rx_event. */
+    smp_mb();
+    if ( np->net_idx->rx_resp_prod != i ) goto again;
+}
+
+
+int network_close(struct net_device *dev)
+{
+    netif_stop_queue(dev);
+
+    /*
+     * XXXX This cannot be done safely until be have a proper interface
+     * for setting up and tearing down virtual interfaces on the fly.
+     * Currently the receive buffers are locked down by Xen and we have
+     * no sensible way of retrieving them.
+     */
+#if 0
+    free_irq(NET_IRQ, dev);
+
+    network_free_rx_buffers(dev);
+    kfree(np->net_ring->rx_ring);
+    kfree(np->net_ring->tx_ring);
+
+    MOD_DEC_USE_COUNT;
+#endif
+
+    return 0;
+}
+
+
+static struct net_device_stats *network_get_stats(struct net_device *dev)
+{
+    struct net_private *np = (struct net_private *)dev->priv;
+    return &np->stats;
+}
+
+
+/*
+ * This notifier is installed for domain 0 only.
+ * All other domains have VFR rules installed on their behalf by domain 0
+ * when they are created. For bootstrap, Xen creates wildcard rules for
+ * domain 0 -- this notifier is used to detect when we find our proper
+ * IP address, so we can poke down proper rules and remove the wildcards.
+ */
+static int inetdev_notify(struct notifier_block *this, 
+                          unsigned long event, 
+                          void *ptr)
+{
+    struct in_ifaddr  *ifa  = (struct in_ifaddr *)ptr; 
+    struct net_device *dev = ifa->ifa_dev->dev;
+    struct list_head  *ent;
+    struct net_private *np;
+    int idx = -1;
+    network_op_t op;
+
+    list_for_each ( ent, &dev_list )
+    {
+        np = list_entry(dev_list.next, struct net_private, list);
+        if ( np->dev == dev )
+            idx = np->idx;
+    }
+
+    if ( idx == -1 )
+        goto out;
+    
+    memset(&op, 0, sizeof(op));
+    op.u.net_rule.proto         = NETWORK_PROTO_ANY;
+    op.u.net_rule.action        = NETWORK_ACTION_ACCEPT;
+
+    if ( event == NETDEV_UP )
+        op.cmd = NETWORK_OP_ADDRULE;
+    else if ( event == NETDEV_DOWN )
+        op.cmd = NETWORK_OP_DELETERULE;
+    else
+        goto out;
+
+    op.u.net_rule.src_vif       = idx;
+    op.u.net_rule.dst_vif       = VIF_PHYSICAL_INTERFACE;
+    op.u.net_rule.src_addr      = ntohl(ifa->ifa_address);
+    op.u.net_rule.src_addr_mask = ~0UL;
+    op.u.net_rule.dst_addr      = 0;
+    op.u.net_rule.dst_addr_mask = 0;
+    (void)HYPERVISOR_network_op(&op);
+    
+    op.u.net_rule.src_vif       = VIF_ANY_INTERFACE;
+    op.u.net_rule.dst_vif       = idx;
+    op.u.net_rule.src_addr      = 0;
+    op.u.net_rule.src_addr_mask = 0;    
+    op.u.net_rule.dst_addr      = ntohl(ifa->ifa_address);
+    op.u.net_rule.dst_addr_mask = ~0UL;
+    (void)HYPERVISOR_network_op(&op);
+    
+ out:
+    return NOTIFY_DONE;
+}
+
+static struct notifier_block notifier_inetdev = {
+    .notifier_call  = inetdev_notify,
+    .next           = NULL,
+    .priority       = 0
+};
+
+
+int __init init_module(void)
+{
+    int i, fixmap_idx=-1, err;
+    struct net_device *dev;
+    struct net_private *np;
+
+    INIT_LIST_HEAD(&dev_list);
+
+    /*
+     * Domain 0 must poke its own network rules as it discovers its IP
+     * addresses. All other domains have a privileged "parent" to do this for
+     * them at start of day.
+     */
+    if ( start_info.dom_id == 0 )
+        (void)register_inetaddr_notifier(&notifier_inetdev);
+
+    for ( i = 0; i < MAX_DOMAIN_VIFS; i++ )
+    {
+        if ( start_info.net_rings[i] == 0 )
+            continue;
+
+        /* We actually only support up to 4 vifs right now. */
+        if ( ++fixmap_idx == 4 )
+            break;
+
+        dev = alloc_etherdev(sizeof(struct net_private));
+        if ( dev == NULL )
+        {
+            err = -ENOMEM;
+            goto fail;
+        }
+
+        set_fixmap(FIX_NETRING0_BASE+fixmap_idx, start_info.net_rings[i]);
+
+        np = dev->priv;
+        np->net_ring = (net_ring_t *)fix_to_virt(FIX_NETRING0_BASE+fixmap_idx);
+        np->net_idx  = &HYPERVISOR_shared_info->net_idx[i];
+        np->idx      = i;
+
+        SET_MODULE_OWNER(dev);
+        dev->open            = network_open;
+        dev->hard_start_xmit = network_start_xmit;
+        dev->stop            = network_close;
+        dev->get_stats       = network_get_stats;
+
+        memcpy(dev->dev_addr, start_info.net_vmac[i], ETH_ALEN);
+
+        if ( (err = register_netdev(dev)) != 0 )
+        {
+            kfree(dev);
+            goto fail;
+        }
+
+        np->dev = dev;
+        list_add(&np->list, &dev_list);
+    }
+
+    return 0;
+
+ fail:
+    cleanup_module();
+    return err;
+}
+
+
+static void cleanup_module(void)
+{
+    struct net_private *np;
+    struct net_device *dev;
+
+    while ( !list_empty(&dev_list) )
+    {
+        np = list_entry(dev_list.next, struct net_private, list);
+        list_del(&np->list);
+        dev = np->dev;
+        unregister_netdev(dev);
+        kfree(dev);
+    }
+
+    if ( start_info.dom_id == 0 )
+        (void)unregister_inetaddr_notifier(&notifier_inetdev);
+}
+
+
+module_init(init_module);
+module_exit(cleanup_module);
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/kernel/Makefile b/xenolinux-2.4.22-sparse/arch/xeno/kernel/Makefile
new file mode 100644 (file)
index 0000000..a43a615
--- /dev/null
@@ -0,0 +1,15 @@
+
+.S.o:
+       $(CC) $(AFLAGS) -traditional -c $< -o $*.o
+
+all: kernel.o head.o init_task.o
+
+O_TARGET := kernel.o
+
+export-objs     := i386_ksyms.o 
+
+obj-y  := process.o semaphore.o signal.o entry.o traps.o irq.o  \
+               ptrace.o ioport.o ldt.o setup.o time.o sys_i386.o \
+               i386_ksyms.o i387.o hypervisor.o
+
+include $(TOPDIR)/Rules.make
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/kernel/entry.S b/xenolinux-2.4.22-sparse/arch/xeno/kernel/entry.S
new file mode 100644 (file)
index 0000000..9c909e3
--- /dev/null
@@ -0,0 +1,779 @@
+/*
+ *  linux/arch/i386/entry.S
+ *
+ *  Copyright (C) 1991, 1992  Linus Torvalds
+ */
+
+/*
+ * entry.S contains the system-call and fault low-level handling routines.
+ * This also contains the timer-interrupt handler, as well as all interrupts
+ * and faults that can result in a task-switch.
+ *
+ * NOTE: This code handles signal-recognition, which happens every time
+ * after a timer-interrupt and after each system call.
+ *
+ * I changed all the .align's to 4 (16 byte alignment), as that's faster
+ * on a 486.
+ *
+ * Stack layout in 'ret_from_system_call':
+ *     ptrace needs to have all regs on the stack.
+ *     if the order here is changed, it needs to be
+ *     updated in fork.c:copy_process, signal.c:do_signal,
+ *     ptrace.c and ptrace.h
+ *
+ *      0(%esp) - %ebx
+ *      4(%esp) - %ecx
+ *      8(%esp) - %edx
+ *       C(%esp) - %esi
+ *     10(%esp) - %edi
+ *     14(%esp) - %ebp
+ *     18(%esp) - %eax
+ *     1C(%esp) - %ds
+ *     20(%esp) - %es
+ *     24(%esp) - orig_eax
+ *     28(%esp) - %eip
+ *     2C(%esp) - %cs
+ *     30(%esp) - %eflags
+ *     34(%esp) - %oldesp
+ *     38(%esp) - %oldss
+ *
+ * "current" is in register %ebx during any slow entries.
+ */
+
+#include <linux/config.h>
+#include <linux/sys.h>
+#include <linux/linkage.h>
+#include <asm/segment.h>
+#include <asm/smp.h>
+
+EBX            = 0x00
+ECX            = 0x04
+EDX            = 0x08
+ESI            = 0x0C
+EDI            = 0x10
+EBP            = 0x14
+EAX            = 0x18
+DS             = 0x1C
+ES             = 0x20
+ORIG_EAX       = 0x24
+EIP            = 0x28
+CS             = 0x2C
+EFLAGS         = 0x30
+OLDESP         = 0x34
+OLDSS          = 0x38
+
+CF_MASK                = 0x00000001
+TF_MASK                = 0x00000100
+IF_MASK                = 0x00000200
+DF_MASK                = 0x00000400
+NT_MASK                = 0x00004000
+
+/*
+ * these are offsets into the task-struct.
+ */
+state          =  0
+flags          =  4
+sigpending     =  8
+addr_limit     = 12
+exec_domain    = 16
+need_resched   = 20
+tsk_ptrace     = 24
+processor      = 52
+
+ENOSYS = 38
+
+
+#define SAVE_ALL \
+       cld; \
+       pushl %es; \
+       pushl %ds; \
+       pushl %eax; \
+       pushl %ebp; \
+       pushl %edi; \
+       pushl %esi; \
+       pushl %edx; \
+       pushl %ecx; \
+       pushl %ebx; \
+       movl $(__KERNEL_DS),%edx; \
+       movl %edx,%ds; \
+       movl %edx,%es;
+
+#define RESTORE_ALL    \
+       popl %ebx;      \
+       popl %ecx;      \
+       popl %edx;      \
+       popl %esi;      \
+       popl %edi;      \
+       popl %ebp;      \
+       popl %eax;      \
+1:     popl %ds;       \
+2:     popl %es;       \
+       addl $4,%esp;   \
+3:     iret;           \
+.section .fixup,"ax";  \
+4:     movl $0,(%esp); \
+       jmp 1b;         \
+5:     movl $0,(%esp); \
+       jmp 2b;         \
+6:     pushl %ss;      \
+       popl %ds;       \
+       pushl %ss;      \
+       popl %es;       \
+       pushl $11;      \
+       call do_exit;   \
+.previous;             \
+.section __ex_table,"a";\
+       .align 4;       \
+       .long 1b,4b;    \
+       .long 2b,5b;    \
+       .long 3b,6b;    \
+.previous
+
+#define GET_CURRENT(reg) \
+       movl $-8192, reg; \
+       andl %esp, reg
+
+ENTRY(lcall7)
+       pushfl                  # We get a different stack layout with call
+       pushl %eax              # gates, which has to be cleaned up later..
+       SAVE_ALL
+       movl EIP(%esp),%eax     # due to call gates, this is eflags, not eip..
+       movl CS(%esp),%edx      # this is eip..
+       movl EFLAGS(%esp),%ecx  # and this is cs..
+       movl %eax,EFLAGS(%esp)  #
+       andl $~(NT_MASK|TF_MASK|DF_MASK), %eax
+       pushl %eax
+       popfl
+       movl %edx,EIP(%esp)     # Now we move them to their "normal" places
+       movl %ecx,CS(%esp)      #
+       movl %esp,%ebx
+       pushl %ebx
+       andl $-8192,%ebx        # GET_CURRENT
+       movl exec_domain(%ebx),%edx     # Get the execution domain
+       movl 4(%edx),%edx       # Get the lcall7 handler for the domain
+       pushl $0x7
+       call *%edx
+       addl $4, %esp
+       popl %eax
+       jmp ret_from_sys_call
+
+ENTRY(lcall27)
+       pushfl                  # We get a different stack layout with call
+       pushl %eax              # gates, which has to be cleaned up later..
+       SAVE_ALL
+       movl EIP(%esp),%eax     # due to call gates, this is eflags, not eip..
+       movl CS(%esp),%edx      # this is eip..
+       movl EFLAGS(%esp),%ecx  # and this is cs..
+       movl %eax,EFLAGS(%esp)  #
+       andl $~(NT_MASK|TF_MASK|DF_MASK), %eax
+       pushl %eax
+       popfl
+       movl %edx,EIP(%esp)     # Now we move them to their "normal" places
+       movl %ecx,CS(%esp)      #
+       movl %esp,%ebx
+       pushl %ebx
+       andl $-8192,%ebx        # GET_CURRENT
+       movl exec_domain(%ebx),%edx     # Get the execution domain
+       movl 4(%edx),%edx       # Get the lcall7 handler for the domain
+       pushl $0x27
+       call *%edx
+       addl $4, %esp
+       popl %eax
+       jmp ret_from_sys_call
+
+        
+ENTRY(ret_from_fork)
+       pushl %ebx
+       call SYMBOL_NAME(schedule_tail)
+       addl $4, %esp
+       GET_CURRENT(%ebx)
+       testb $0x02,tsk_ptrace(%ebx)    # PT_TRACESYS
+       jne tracesys_exit
+       jmp     ret_from_sys_call
+
+/*
+ * Return to user mode is not as complex as all this looks,
+ * but we want the default path for a system call return to
+ * go as quickly as possible which is why some of this is
+ * less clear than it otherwise should be.
+ */
+
+ENTRY(system_call)
+       pushl %eax                      # save orig_eax
+       SAVE_ALL
+       GET_CURRENT(%ebx)
+       testb $0x02,tsk_ptrace(%ebx)    # PT_TRACESYS
+       jne tracesys
+       cmpl $(NR_syscalls),%eax
+       jae badsys
+       call *SYMBOL_NAME(sys_call_table)(,%eax,4)
+       movl %eax,EAX(%esp)             # save the return value
+ENTRY(ret_from_sys_call)
+        movl SYMBOL_NAME(HYPERVISOR_shared_info),%esi
+        btrl $EVENTS_MASTER_ENABLE_BIT,4(%esi) # make tests atomic
+ret_syscall_tests:      
+       cmpl $0,need_resched(%ebx)
+       jne reschedule
+       cmpl $0,sigpending(%ebx)
+       je   safesti                    # ensure need_resched updates are seen
+signal_return:
+       btsl $EVENTS_MASTER_ENABLE_BIT,4(%esi) # reenable event callbacks
+       movl %esp,%eax
+       xorl %edx,%edx
+       call SYMBOL_NAME(do_signal)
+       jmp  ret_from_sys_call
+
+       ALIGN
+restore_all:
+       RESTORE_ALL
+
+       ALIGN
+tracesys:
+       movl $-ENOSYS,EAX(%esp)
+       call SYMBOL_NAME(syscall_trace)
+       movl ORIG_EAX(%esp),%eax
+       cmpl $(NR_syscalls),%eax
+       jae tracesys_exit
+       call *SYMBOL_NAME(sys_call_table)(,%eax,4)
+       movl %eax,EAX(%esp)             # save the return value
+tracesys_exit:
+       call SYMBOL_NAME(syscall_trace)
+       jmp ret_from_sys_call
+badsys:
+       movl $-ENOSYS,EAX(%esp)
+       jmp ret_from_sys_call
+
+       ALIGN
+ENTRY(ret_from_intr)
+       GET_CURRENT(%ebx)
+ret_from_exception:
+       movb CS(%esp),%al
+       testl $2,%eax
+       jne ret_from_sys_call
+       jmp restore_all
+
+       ALIGN
+reschedule:
+        btsl $EVENTS_MASTER_ENABLE_BIT,4(%esi) # reenable event callbacks
+       call SYMBOL_NAME(schedule)             # test
+       jmp ret_from_sys_call
+
+ENTRY(divide_error)
+       pushl $0                # no error code
+       pushl $ SYMBOL_NAME(do_divide_error)
+       ALIGN
+error_code:
+       pushl %ds
+       pushl %eax
+       xorl %eax,%eax
+       pushl %ebp
+       pushl %edi
+       pushl %esi
+       pushl %edx
+       decl %eax                       # eax = -1
+       pushl %ecx
+       pushl %ebx
+       GET_CURRENT(%ebx)
+       cld
+       movl %es,%ecx
+       movl ORIG_EAX(%esp), %esi       # get the error code
+       movl ES(%esp), %edi             # get the function address
+       movl %eax, ORIG_EAX(%esp)
+       movl %ecx, ES(%esp)
+       movl %esp,%edx
+       pushl %esi                      # push the error code
+       pushl %edx                      # push the pt_regs pointer
+       movl $(__KERNEL_DS),%edx
+       movl %edx,%ds
+       movl %edx,%es
+       call *%edi
+       addl $8,%esp
+       jmp ret_from_exception
+
+# A note on the "critical region" in our callback handler.
+# We want to avoid stacking callback handlers due to events occurring
+# during handling of the last event. To do this, we keep events disabled
+# until we've done all processing. HOWEVER, we must enable events before
+# popping the stack frame (can't be done atomically) and so it would still
+# be possible to get enough handler activations to overflow the stack.
+# Although unlikely, bugs of that kind are hard to track down, so we'd
+# like to avoid the possibility.
+# So, on entry to the handler we detect whether we interrupted an
+# existing activation in its critical region -- if so, we pop the current
+# activation and restart the handler using the previous one.
+ENTRY(hypervisor_callback)
+        pushl %eax
+        SAVE_ALL
+        GET_CURRENT(%ebx)
+        movl EIP(%esp),%eax
+        cmpl $scrit,%eax
+        jb   11f
+        cmpl $ecrit,%eax
+        jb   critical_region_fixup
+11:     push %esp
+        call do_hypervisor_callback
+        add  $4,%esp
+        movl SYMBOL_NAME(HYPERVISOR_shared_info),%esi
+        xorl %eax,%eax
+        movb CS(%esp),%cl
+       test $2,%cl          # slow return to ring 2 or 3
+       jne  ret_syscall_tests
+safesti:btsl $EVENTS_MASTER_ENABLE_BIT,4(%esi) # reenable event callbacks
+scrit:  /**** START OF CRITICAL REGION ****/
+        cmpl %eax,(%esi)
+        jne  14f              # process more events if necessary...
+        RESTORE_ALL
+14:     btrl $EVENTS_MASTER_ENABLE_BIT,4(%esi)
+        jmp  11b
+ecrit:  /**** END OF CRITICAL REGION ****/
+# [How we do the fixup]. We want to merge the current stack frame with the
+# just-interrupted frame. How we do this depends on where in the critical
+# region the interrupted handler was executing, and so how many saved
+# registers are in each frame. We do this quickly using the lookup table
+# 'critical_fixup_table'. For each byte offset in the critical region, it
+# provides the number of bytes which have already been popped from the
+# interrupted stack frame. 
+critical_region_fixup:
+        addl $critical_fixup_table-scrit,%eax
+        movzbl (%eax),%eax    # %eax contains num bytes popped
+        mov  %esp,%esi
+        add  %eax,%esi        # %esi points at end of src region
+        mov  %esp,%edi
+        add  $0x34,%edi       # %edi points at end of dst region
+        mov  %eax,%ecx
+        shr  $2,%ecx          # convert words to bytes
+        je   16f              # skip loop if nothing to copy
+15:     subl $4,%esi          # pre-decrementing copy loop
+        subl $4,%edi
+        movl (%esi),%eax
+        movl %eax,(%edi)
+        loop 15b
+16:     movl %edi,%esp        # final %edi is top of merged stack
+        jmp  11b
+        
+critical_fixup_table:        
+        .byte 0x00,0x00                       # cmpl %eax,(%esi)
+        .byte 0x00,0x00                       # jne  14f
+        .byte 0x00                            # pop  %ebx
+        .byte 0x04                            # pop  %ecx
+        .byte 0x08                            # pop  %edx
+        .byte 0x0c                            # pop  %esi
+        .byte 0x10                            # pop  %edi
+        .byte 0x14                            # pop  %ebp
+        .byte 0x18                            # pop  %eax
+        .byte 0x1c                            # pop  %ds
+        .byte 0x20                            # pop  %es
+        .byte 0x24,0x24,0x24                  # add  $4,%esp
+        .byte 0x28                            # iret
+        .byte 0x00,0x00,0x00,0x00,0x00        # btrl $31,4(%esi)
+        .byte 0x00,0x00                       # jmp  11b
+
+# Hypervisor uses this for application faults while it executes.
+ENTRY(failsafe_callback)
+1:      pop  %ds
+2:      pop  %es
+3:      pop  %fs
+4:      pop  %gs
+5:      iret
+.section .fixup,"ax";  \
+6:     movl $0,(%esp); \
+       jmp 1b;         \
+7:     movl $0,(%esp); \
+       jmp 2b;         \
+8:     movl $0,(%esp); \
+       jmp 3b;         \
+9:     movl $0,(%esp); \
+       jmp 4b;         \
+10:    pushl %ss;      \
+       popl %ds;       \
+       pushl %ss;      \
+       popl %es;       \
+       pushl $11;      \
+       call do_exit;   \
+.previous;             \
+.section __ex_table,"a";\
+       .align 4;       \
+       .long 1b,6b;    \
+       .long 2b,7b;    \
+       .long 3b,8b;    \
+       .long 4b,9b;    \
+       .long 5b,10b;   \
+.previous
+        
+ENTRY(coprocessor_error)
+       pushl $0
+       pushl $ SYMBOL_NAME(do_coprocessor_error)
+       jmp error_code
+
+ENTRY(simd_coprocessor_error)
+       pushl $0
+       pushl $ SYMBOL_NAME(do_simd_coprocessor_error)
+       jmp error_code
+
+ENTRY(device_not_available)
+       pushl $-1               # mark this as an int
+       SAVE_ALL
+       GET_CURRENT(%ebx)
+       call SYMBOL_NAME(math_state_restore)
+       jmp ret_from_exception
+
+ENTRY(debug)
+       pushl $0
+       pushl $ SYMBOL_NAME(do_debug)
+       jmp error_code
+
+ENTRY(int3)
+       pushl $0
+       pushl $ SYMBOL_NAME(do_int3)
+       jmp error_code
+
+ENTRY(overflow)
+       pushl $0
+       pushl $ SYMBOL_NAME(do_overflow)
+       jmp error_code
+
+ENTRY(bounds)
+       pushl $0
+       pushl $ SYMBOL_NAME(do_bounds)
+       jmp error_code
+
+ENTRY(invalid_op)
+       pushl $0
+       pushl $ SYMBOL_NAME(do_invalid_op)
+       jmp error_code
+
+ENTRY(coprocessor_segment_overrun)
+       pushl $0
+       pushl $ SYMBOL_NAME(do_coprocessor_segment_overrun)
+       jmp error_code
+
+ENTRY(double_fault)
+       pushl $ SYMBOL_NAME(do_double_fault)
+       jmp error_code
+
+ENTRY(invalid_TSS)
+       pushl $ SYMBOL_NAME(do_invalid_TSS)
+       jmp error_code
+
+ENTRY(segment_not_present)
+       pushl $ SYMBOL_NAME(do_segment_not_present)
+       jmp error_code
+
+ENTRY(stack_segment)
+       pushl $ SYMBOL_NAME(do_stack_segment)
+       jmp error_code
+
+ENTRY(general_protection)
+       pushl $ SYMBOL_NAME(do_general_protection)
+       jmp error_code
+
+ENTRY(alignment_check)
+       pushl $ SYMBOL_NAME(do_alignment_check)
+       jmp error_code
+
+# This handler is special, because it gets an extra value on its stack,
+# which is the linear faulting address.
+ENTRY(page_fault)
+       pushl %ds
+       pushl %eax
+       xorl %eax,%eax
+       pushl %ebp
+       pushl %edi
+       pushl %esi
+       pushl %edx
+       decl %eax                       # eax = -1
+       pushl %ecx
+       pushl %ebx
+       GET_CURRENT(%ebx)
+       cld
+       movl %es,%ecx
+       movl ORIG_EAX(%esp), %esi       # get the error code
+       movl ES(%esp), %edi             # get the faulting address
+       movl %eax, ORIG_EAX(%esp)
+       movl %ecx, ES(%esp)
+       movl %esp,%edx
+        pushl %edi                      # push the faulting address
+       pushl %esi                      # push the error code
+       pushl %edx                      # push the pt_regs pointer
+       movl $(__KERNEL_DS),%edx
+       movl %edx,%ds
+       movl %edx,%es
+       call SYMBOL_NAME(do_page_fault)
+       addl $12,%esp
+       jmp ret_from_exception
+
+ENTRY(machine_check)
+       pushl $0
+       pushl $ SYMBOL_NAME(do_machine_check)
+       jmp error_code
+
+ENTRY(spurious_interrupt_bug)
+       pushl $0
+       pushl $ SYMBOL_NAME(do_spurious_interrupt_bug)
+       jmp error_code
+
+.data
+ENTRY(sys_call_table)
+       .long SYMBOL_NAME(sys_ni_syscall)       /* 0  -  old "setup()" system call*/
+       .long SYMBOL_NAME(sys_exit)
+       .long SYMBOL_NAME(sys_fork)
+       .long SYMBOL_NAME(sys_read)
+       .long SYMBOL_NAME(sys_write)
+       .long SYMBOL_NAME(sys_open)             /* 5 */
+       .long SYMBOL_NAME(sys_close)
+       .long SYMBOL_NAME(sys_waitpid)
+       .long SYMBOL_NAME(sys_creat)
+       .long SYMBOL_NAME(sys_link)
+       .long SYMBOL_NAME(sys_unlink)           /* 10 */
+       .long SYMBOL_NAME(sys_execve)
+       .long SYMBOL_NAME(sys_chdir)
+       .long SYMBOL_NAME(sys_time)
+       .long SYMBOL_NAME(sys_mknod)
+       .long SYMBOL_NAME(sys_chmod)            /* 15 */
+       .long SYMBOL_NAME(sys_lchown16)
+       .long SYMBOL_NAME(sys_ni_syscall)                               /* old break syscall holder */
+       .long SYMBOL_NAME(sys_stat)
+       .long SYMBOL_NAME(sys_lseek)
+       .long SYMBOL_NAME(sys_getpid)           /* 20 */
+       .long SYMBOL_NAME(sys_mount)
+       .long SYMBOL_NAME(sys_oldumount)
+       .long SYMBOL_NAME(sys_setuid16)
+       .long SYMBOL_NAME(sys_getuid16)
+       .long SYMBOL_NAME(sys_stime)            /* 25 */
+       .long SYMBOL_NAME(sys_ptrace)
+       .long SYMBOL_NAME(sys_alarm)
+       .long SYMBOL_NAME(sys_fstat)
+       .long SYMBOL_NAME(sys_pause)
+       .long SYMBOL_NAME(sys_utime)            /* 30 */
+       .long SYMBOL_NAME(sys_ni_syscall)                               /* old stty syscall holder */
+       .long SYMBOL_NAME(sys_ni_syscall)                               /* old gtty syscall holder */
+       .long SYMBOL_NAME(sys_access)
+       .long SYMBOL_NAME(sys_nice)
+       .long SYMBOL_NAME(sys_ni_syscall)       /* 35 */                /* old ftime syscall holder */
+       .long SYMBOL_NAME(sys_sync)
+       .long SYMBOL_NAME(sys_kill)
+       .long SYMBOL_NAME(sys_rename)
+       .long SYMBOL_NAME(sys_mkdir)
+       .long SYMBOL_NAME(sys_rmdir)            /* 40 */
+       .long SYMBOL_NAME(sys_dup)
+       .long SYMBOL_NAME(sys_pipe)
+       .long SYMBOL_NAME(sys_times)
+       .long SYMBOL_NAME(sys_ni_syscall)                               /* old prof syscall holder */
+       .long SYMBOL_NAME(sys_brk)              /* 45 */
+       .long SYMBOL_NAME(sys_setgid16)
+       .long SYMBOL_NAME(sys_getgid16)
+       .long SYMBOL_NAME(sys_signal)
+       .long SYMBOL_NAME(sys_geteuid16)
+       .long SYMBOL_NAME(sys_getegid16)        /* 50 */
+       .long SYMBOL_NAME(sys_acct)
+       .long SYMBOL_NAME(sys_umount)                                   /* recycled never used phys() */
+       .long SYMBOL_NAME(sys_ni_syscall)                               /* old lock syscall holder */
+       .long SYMBOL_NAME(sys_ioctl)
+       .long SYMBOL_NAME(sys_fcntl)            /* 55 */
+       .long SYMBOL_NAME(sys_ni_syscall)                               /* old mpx syscall holder */
+       .long SYMBOL_NAME(sys_setpgid)
+       .long SYMBOL_NAME(sys_ni_syscall)                               /* old ulimit syscall holder */
+       .long SYMBOL_NAME(sys_olduname)
+       .long SYMBOL_NAME(sys_umask)            /* 60 */
+       .long SYMBOL_NAME(sys_chroot)
+       .long SYMBOL_NAME(sys_ustat)
+       .long SYMBOL_NAME(sys_dup2)
+       .long SYMBOL_NAME(sys_getppid)
+       .long SYMBOL_NAME(sys_getpgrp)          /* 65 */
+       .long SYMBOL_NAME(sys_setsid)
+       .long SYMBOL_NAME(sys_sigaction)
+       .long SYMBOL_NAME(sys_sgetmask)
+       .long SYMBOL_NAME(sys_ssetmask)
+       .long SYMBOL_NAME(sys_setreuid16)       /* 70 */
+       .long SYMBOL_NAME(sys_setregid16)
+       .long SYMBOL_NAME(sys_sigsuspend)
+       .long SYMBOL_NAME(sys_sigpending)
+       .long SYMBOL_NAME(sys_sethostname)
+       .long SYMBOL_NAME(sys_setrlimit)        /* 75 */
+       .long SYMBOL_NAME(sys_old_getrlimit)
+       .long SYMBOL_NAME(sys_getrusage)
+       .long SYMBOL_NAME(sys_gettimeofday)
+       .long SYMBOL_NAME(sys_settimeofday)
+       .long SYMBOL_NAME(sys_getgroups16)      /* 80 */
+       .long SYMBOL_NAME(sys_setgroups16)
+       .long SYMBOL_NAME(old_select)
+       .long SYMBOL_NAME(sys_symlink)
+       .long SYMBOL_NAME(sys_lstat)
+       .long SYMBOL_NAME(sys_readlink)         /* 85 */
+       .long SYMBOL_NAME(sys_uselib)
+       .long SYMBOL_NAME(sys_swapon)
+       .long SYMBOL_NAME(sys_reboot)
+       .long SYMBOL_NAME(old_readdir)
+       .long SYMBOL_NAME(old_mmap)             /* 90 */
+       .long SYMBOL_NAME(sys_munmap)
+       .long SYMBOL_NAME(sys_truncate)
+       .long SYMBOL_NAME(sys_ftruncate)
+       .long SYMBOL_NAME(sys_fchmod)
+       .long SYMBOL_NAME(sys_fchown16)         /* 95 */
+       .long SYMBOL_NAME(sys_getpriority)
+       .long SYMBOL_NAME(sys_setpriority)
+       .long SYMBOL_NAME(sys_ni_syscall)                               /* old profil syscall holder */
+       .long SYMBOL_NAME(sys_statfs)
+       .long SYMBOL_NAME(sys_fstatfs)          /* 100 */
+       .long SYMBOL_NAME(sys_ioperm)
+       .long SYMBOL_NAME(sys_socketcall)
+       .long SYMBOL_NAME(sys_syslog)
+       .long SYMBOL_NAME(sys_setitimer)
+       .long SYMBOL_NAME(sys_getitimer)        /* 105 */
+       .long SYMBOL_NAME(sys_newstat)
+       .long SYMBOL_NAME(sys_newlstat)
+       .long SYMBOL_NAME(sys_newfstat)
+       .long SYMBOL_NAME(sys_uname)
+       .long SYMBOL_NAME(sys_iopl)             /* 110 */
+       .long SYMBOL_NAME(sys_vhangup)
+       .long SYMBOL_NAME(sys_ni_syscall)       /* old "idle" system call */
+       .long SYMBOL_NAME(sys_ni_syscall) /* was VM86 */
+       .long SYMBOL_NAME(sys_wait4)
+       .long SYMBOL_NAME(sys_swapoff)          /* 115 */
+       .long SYMBOL_NAME(sys_sysinfo)
+       .long SYMBOL_NAME(sys_ipc)
+       .long SYMBOL_NAME(sys_fsync)
+       .long SYMBOL_NAME(sys_sigreturn)
+       .long SYMBOL_NAME(sys_clone)            /* 120 */
+       .long SYMBOL_NAME(sys_setdomainname)
+       .long SYMBOL_NAME(sys_newuname)
+       .long SYMBOL_NAME(sys_modify_ldt)
+       .long SYMBOL_NAME(sys_adjtimex)
+       .long SYMBOL_NAME(sys_mprotect)         /* 125 */
+       .long SYMBOL_NAME(sys_sigprocmask)
+       .long SYMBOL_NAME(sys_create_module)
+       .long SYMBOL_NAME(sys_init_module)
+       .long SYMBOL_NAME(sys_delete_module)
+       .long SYMBOL_NAME(sys_get_kernel_syms)  /* 130 */
+       .long SYMBOL_NAME(sys_quotactl)
+       .long SYMBOL_NAME(sys_getpgid)
+       .long SYMBOL_NAME(sys_fchdir)
+       .long SYMBOL_NAME(sys_bdflush)
+       .long SYMBOL_NAME(sys_sysfs)            /* 135 */
+       .long SYMBOL_NAME(sys_personality)
+       .long SYMBOL_NAME(sys_ni_syscall)       /* for afs_syscall */
+       .long SYMBOL_NAME(sys_setfsuid16)
+       .long SYMBOL_NAME(sys_setfsgid16)
+       .long SYMBOL_NAME(sys_llseek)           /* 140 */
+       .long SYMBOL_NAME(sys_getdents)
+       .long SYMBOL_NAME(sys_select)
+       .long SYMBOL_NAME(sys_flock)
+       .long SYMBOL_NAME(sys_msync)
+       .long SYMBOL_NAME(sys_readv)            /* 145 */
+       .long SYMBOL_NAME(sys_writev)
+       .long SYMBOL_NAME(sys_getsid)
+       .long SYMBOL_NAME(sys_fdatasync)
+       .long SYMBOL_NAME(sys_sysctl)
+       .long SYMBOL_NAME(sys_mlock)            /* 150 */
+       .long SYMBOL_NAME(sys_munlock)
+       .long SYMBOL_NAME(sys_mlockall)
+       .long SYMBOL_NAME(sys_munlockall)
+       .long SYMBOL_NAME(sys_sched_setparam)
+       .long SYMBOL_NAME(sys_sched_getparam)   /* 155 */
+       .long SYMBOL_NAME(sys_sched_setscheduler)
+       .long SYMBOL_NAME(sys_sched_getscheduler)
+       .long SYMBOL_NAME(sys_sched_yield)
+       .long SYMBOL_NAME(sys_sched_get_priority_max)
+       .long SYMBOL_NAME(sys_sched_get_priority_min)  /* 160 */
+       .long SYMBOL_NAME(sys_sched_rr_get_interval)
+       .long SYMBOL_NAME(sys_nanosleep)
+       .long SYMBOL_NAME(sys_mremap)
+       .long SYMBOL_NAME(sys_setresuid16)
+       .long SYMBOL_NAME(sys_getresuid16)      /* 165 */
+       .long SYMBOL_NAME(sys_ni_syscall) /* was VM86 */
+       .long SYMBOL_NAME(sys_query_module)
+       .long SYMBOL_NAME(sys_poll)
+       .long SYMBOL_NAME(sys_nfsservctl)
+       .long SYMBOL_NAME(sys_setresgid16)      /* 170 */
+       .long SYMBOL_NAME(sys_getresgid16)
+       .long SYMBOL_NAME(sys_prctl)
+       .long SYMBOL_NAME(sys_rt_sigreturn)
+       .long SYMBOL_NAME(sys_rt_sigaction)
+       .long SYMBOL_NAME(sys_rt_sigprocmask)   /* 175 */
+       .long SYMBOL_NAME(sys_rt_sigpending)
+       .long SYMBOL_NAME(sys_rt_sigtimedwait)
+       .long SYMBOL_NAME(sys_rt_sigqueueinfo)
+       .long SYMBOL_NAME(sys_rt_sigsuspend)
+       .long SYMBOL_NAME(sys_pread)            /* 180 */
+       .long SYMBOL_NAME(sys_pwrite)
+       .long SYMBOL_NAME(sys_chown16)
+       .long SYMBOL_NAME(sys_getcwd)
+       .long SYMBOL_NAME(sys_capget)
+       .long SYMBOL_NAME(sys_capset)           /* 185 */
+       .long SYMBOL_NAME(sys_sigaltstack)
+       .long SYMBOL_NAME(sys_sendfile)
+       .long SYMBOL_NAME(sys_ni_syscall)               /* streams1 */
+       .long SYMBOL_NAME(sys_ni_syscall)               /* streams2 */
+       .long SYMBOL_NAME(sys_vfork)            /* 190 */
+       .long SYMBOL_NAME(sys_getrlimit)
+       .long SYMBOL_NAME(sys_mmap2)
+       .long SYMBOL_NAME(sys_truncate64)
+       .long SYMBOL_NAME(sys_ftruncate64)
+       .long SYMBOL_NAME(sys_stat64)           /* 195 */
+       .long SYMBOL_NAME(sys_lstat64)
+       .long SYMBOL_NAME(sys_fstat64)
+       .long SYMBOL_NAME(sys_lchown)
+       .long SYMBOL_NAME(sys_getuid)
+       .long SYMBOL_NAME(sys_getgid)           /* 200 */
+       .long SYMBOL_NAME(sys_geteuid)
+       .long SYMBOL_NAME(sys_getegid)
+       .long SYMBOL_NAME(sys_setreuid)
+       .long SYMBOL_NAME(sys_setregid)
+       .long SYMBOL_NAME(sys_getgroups)        /* 205 */
+       .long SYMBOL_NAME(sys_setgroups)
+       .long SYMBOL_NAME(sys_fchown)
+       .long SYMBOL_NAME(sys_setresuid)
+       .long SYMBOL_NAME(sys_getresuid)
+       .long SYMBOL_NAME(sys_setresgid)        /* 210 */
+       .long SYMBOL_NAME(sys_getresgid)
+       .long SYMBOL_NAME(sys_chown)
+       .long SYMBOL_NAME(sys_setuid)
+       .long SYMBOL_NAME(sys_setgid)
+       .long SYMBOL_NAME(sys_setfsuid)         /* 215 */
+       .long SYMBOL_NAME(sys_setfsgid)
+       .long SYMBOL_NAME(sys_pivot_root)
+       .long SYMBOL_NAME(sys_mincore)
+       .long SYMBOL_NAME(sys_madvise)
+       .long SYMBOL_NAME(sys_getdents64)       /* 220 */
+       .long SYMBOL_NAME(sys_fcntl64)
+       .long SYMBOL_NAME(sys_ni_syscall)       /* reserved for TUX */
+       .long SYMBOL_NAME(sys_ni_syscall)       /* Reserved for Security */
+       .long SYMBOL_NAME(sys_gettid)
+       .long SYMBOL_NAME(sys_readahead)        /* 225 */
+       .long SYMBOL_NAME(sys_setxattr)
+       .long SYMBOL_NAME(sys_lsetxattr)
+       .long SYMBOL_NAME(sys_fsetxattr)
+       .long SYMBOL_NAME(sys_getxattr)
+       .long SYMBOL_NAME(sys_lgetxattr)        /* 230 */
+       .long SYMBOL_NAME(sys_fgetxattr)
+       .long SYMBOL_NAME(sys_listxattr)
+       .long SYMBOL_NAME(sys_llistxattr)
+       .long SYMBOL_NAME(sys_flistxattr)
+       .long SYMBOL_NAME(sys_removexattr)      /* 235 */
+       .long SYMBOL_NAME(sys_lremovexattr)
+       .long SYMBOL_NAME(sys_fremovexattr)
+       .long SYMBOL_NAME(sys_tkill)
+       .long SYMBOL_NAME(sys_sendfile64)
+       .long SYMBOL_NAME(sys_ni_syscall)       /* 240 reserved for futex */
+       .long SYMBOL_NAME(sys_ni_syscall)       /* reserved for sched_setaffinity */
+       .long SYMBOL_NAME(sys_ni_syscall)       /* reserved for sched_getaffinity */
+       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_set_thread_area */
+       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_get_thread_area */
+       .long SYMBOL_NAME(sys_ni_syscall)       /* 245 sys_io_setup */
+       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_io_destroy */
+       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_io_getevents */
+       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_io_submit */
+       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_io_cancel */
+       .long SYMBOL_NAME(sys_ni_syscall)       /* 250 sys_alloc_hugepages */
+       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_free_hugepages */
+       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_exit_group */
+       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_lookup_dcookie */
+       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_epoll_create */
+       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_epoll_ctl 255 */
+       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_epoll_wait */
+       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_remap_file_pages */
+       .long SYMBOL_NAME(sys_ni_syscall)       /* sys_set_tid_address */
+
+       .rept NR_syscalls-(.-sys_call_table)/4
+               .long SYMBOL_NAME(sys_ni_syscall)
+       .endr
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/kernel/head.S b/xenolinux-2.4.22-sparse/arch/xeno/kernel/head.S
new file mode 100644 (file)
index 0000000..a89fd8e
--- /dev/null
@@ -0,0 +1,70 @@
+
+.text
+#include <linux/config.h>
+#include <linux/threads.h>
+#include <linux/linkage.h>
+#include <asm/segment.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
+#include <asm/desc.h>
+
+/* Offsets in start_info structure */
+#define SHARED_INFO  4
+#define MOD_START   12
+#define MOD_LEN     16
+                
+startup_32:
+        cld
+        
+        lss stack_start,%esp
+
+        /* Copy initrd somewhere safe before it's clobbered by BSS. */
+        mov  MOD_LEN(%esi),%ecx
+        shr  $2,%ecx
+        jz   2f        /* bail from copy loop if no initrd */
+        mov  $SYMBOL_NAME(_end),%edi
+        add  MOD_LEN(%esi),%edi
+        mov  MOD_START(%esi),%eax
+        add  MOD_LEN(%esi),%eax
+1:      sub  $4,%eax
+        sub  $4,%edi
+        mov  (%eax),%ebx
+        mov  %ebx,(%edi)
+        loop 1b
+        mov  %edi,MOD_START(%esi)
+                
+        /* Clear BSS first so that there are no surprises... */
+2:      xorl %eax,%eax
+       movl $SYMBOL_NAME(__bss_start),%edi
+       movl $SYMBOL_NAME(_end),%ecx
+       subl %edi,%ecx
+       rep stosb
+
+        /* Copy the necessary stuff from start_info structure. */
+        /* We need to copy shared_info early, so that sti/cli work */
+        mov  SHARED_INFO(%esi),%eax
+        mov  %eax,SYMBOL_NAME(HYPERVISOR_shared_info)
+        mov  $SYMBOL_NAME(start_info_union),%edi
+        mov  $128,%ecx
+        rep movsl
+                
+        jmp SYMBOL_NAME(start_kernel)
+
+ENTRY(stack_start)
+       .long SYMBOL_NAME(init_task_union)+8192, __KERNEL_DS
+
+.org 0x1000
+ENTRY(empty_zero_page)
+
+.org 0x2000
+ENTRY(default_ldt)
+
+.org 0x3000
+ENTRY(cpu0_pte_quicklist)
+
+.org 0x3400
+ENTRY(cpu0_pgd_quicklist)
+        
+.org 0x3800
+ENTRY(stext)
+ENTRY(_stext)
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/kernel/hypervisor.c b/xenolinux-2.4.22-sparse/arch/xeno/kernel/hypervisor.c
new file mode 100644 (file)
index 0000000..3f414e9
--- /dev/null
@@ -0,0 +1,128 @@
+/******************************************************************************
+ * hypervisor.c
+ * 
+ * Communication to/from hypervisor.
+ * 
+ * Copyright (c) 2002, K A Fraser
+ */
+
+#include <linux/config.h>
+#include <asm/atomic.h>
+#include <linux/irq.h>
+#include <asm/hypervisor.h>
+#include <asm/system.h>
+#include <asm/ptrace.h>
+
+multicall_entry_t multicall_list[8];
+int nr_multicall_ents = 0;
+
+static unsigned long event_mask = 0;
+
+void frobb(void) {}
+
+void do_hypervisor_callback(struct pt_regs *regs)
+{
+    unsigned long events, flags;
+    shared_info_t *shared = HYPERVISOR_shared_info;
+
+    do {
+        /* Specialised local_irq_save(). */
+        flags = test_and_clear_bit(EVENTS_MASTER_ENABLE_BIT, 
+                                   &shared->events_mask);
+        barrier();
+
+        events  = xchg(&shared->events, 0);
+        events &= event_mask;
+
+        __asm__ __volatile__ (
+            "   push %1                            ;"
+            "   sub  $4,%%esp                      ;"
+            "   jmp  2f                            ;"
+            "1: btrl %%eax,%0                      ;" /* clear bit     */
+            "   mov  %%eax,(%%esp)                 ;"
+            "   call do_IRQ                        ;" /* do_IRQ(event) */
+            "2: bsfl %0,%%eax                      ;" /* %eax == bit # */
+            "   jnz  1b                            ;"
+            "   add  $8,%%esp                      ;"
+            /* we use %ebx because it is callee-saved */
+            : : "b" (events), "r" (regs)
+            /* clobbered by callback function calls */
+            : "eax", "ecx", "edx", "memory" ); 
+
+        /* Specialised local_irq_restore(). */
+        if ( flags ) set_bit(EVENTS_MASTER_ENABLE_BIT, &shared->events_mask);
+        barrier();
+    }
+    while ( shared->events );
+}
+
+
+
+/*
+ * Define interface to generic handling in irq.c
+ */
+
+static void shutdown_hypervisor_event(unsigned int irq)
+{
+    clear_bit(irq, &event_mask);
+    clear_bit(irq, &HYPERVISOR_shared_info->events_mask);
+}
+
+static void enable_hypervisor_event(unsigned int irq)
+{
+    set_bit(irq, &event_mask);
+    set_bit(irq, &HYPERVISOR_shared_info->events_mask);
+    if ( test_bit(EVENTS_MASTER_ENABLE_BIT, 
+                  &HYPERVISOR_shared_info->events_mask) )
+        do_hypervisor_callback(NULL);
+}
+
+static void disable_hypervisor_event(unsigned int irq)
+{
+    clear_bit(irq, &event_mask);
+    clear_bit(irq, &HYPERVISOR_shared_info->events_mask);
+}
+
+static void ack_hypervisor_event(unsigned int irq)
+{
+    if ( !(event_mask & (1<<irq)) )
+    {
+        printk("Unexpected hypervisor event %d\n", irq);
+        atomic_inc(&irq_err_count);
+    }
+    set_bit(irq, &HYPERVISOR_shared_info->events_mask);
+}
+
+static unsigned int startup_hypervisor_event(unsigned int irq)
+{
+    enable_hypervisor_event(irq);
+    return 0;
+}
+
+static void end_hypervisor_event(unsigned int irq)
+{
+}
+
+static struct hw_interrupt_type hypervisor_irq_type = {
+    "Hypervisor-event",
+    startup_hypervisor_event,
+    shutdown_hypervisor_event,
+    enable_hypervisor_event,
+    disable_hypervisor_event,
+    ack_hypervisor_event,
+    end_hypervisor_event,
+    NULL
+};
+
+void __init init_IRQ(void)
+{
+    int i;
+
+    for ( i = 0; i < NR_IRQS; i++ )
+    {
+        irq_desc[i].status  = IRQ_DISABLED;
+        irq_desc[i].action  = 0;
+        irq_desc[i].depth   = 1;
+        irq_desc[i].handler = &hypervisor_irq_type;
+    }
+}
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/kernel/i386_ksyms.c b/xenolinux-2.4.22-sparse/arch/xeno/kernel/i386_ksyms.c
new file mode 100644 (file)
index 0000000..b62c171
--- /dev/null
@@ -0,0 +1,154 @@
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/smp.h>
+#include <linux/user.h>
+#include <linux/elfcore.h>
+#include <linux/mca.h>
+#include <linux/sched.h>
+#include <linux/in6.h>
+#include <linux/interrupt.h>
+#include <linux/smp_lock.h>
+#include <linux/pm.h>
+//XXX ??? #include <linux/pci.h>
+#include <linux/apm_bios.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/tty.h>
+
+#include <asm/semaphore.h>
+#include <asm/processor.h>
+#include <asm/i387.h>
+#include <asm/uaccess.h>
+#include <asm/checksum.h>
+#include <asm/io.h>
+#include <asm/hardirq.h>
+#include <asm/delay.h>
+#include <asm/irq.h>
+#include <asm/mmx.h>
+#include <asm/desc.h>
+#include <asm/pgtable.h>
+#include <asm/pgalloc.h>
+
+extern void dump_thread(struct pt_regs *, struct user *);
+extern spinlock_t rtc_lock;
+
+#if defined(CONFIG_APMXXX) || defined(CONFIG_APM_MODULEXXX)
+extern void machine_real_restart(unsigned char *, int);
+EXPORT_SYMBOL(machine_real_restart);
+extern void default_idle(void);
+EXPORT_SYMBOL(default_idle);
+#endif
+
+#ifdef CONFIG_SMP
+extern void FASTCALL( __write_lock_failed(rwlock_t *rw));
+extern void FASTCALL( __read_lock_failed(rwlock_t *rw));
+#endif
+
+#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_HD) || defined(CONFIG_BLK_DEV_IDE_MODULE) || defined(CONFIG_BLK_DEV_HD_MODULE)
+extern struct drive_info_struct drive_info;
+EXPORT_SYMBOL(drive_info);
+#endif
+
+// XXX extern unsigned long get_cmos_time(void);
+
+/* platform dependent support */
+EXPORT_SYMBOL(boot_cpu_data);
+EXPORT_SYMBOL(dump_thread);
+EXPORT_SYMBOL(dump_fpu);
+EXPORT_SYMBOL(dump_extended_fpu);
+EXPORT_SYMBOL(enable_irq);
+EXPORT_SYMBOL(disable_irq);
+EXPORT_SYMBOL(disable_irq_nosync);
+EXPORT_SYMBOL(probe_irq_mask);
+EXPORT_SYMBOL(kernel_thread);
+EXPORT_SYMBOL(pm_idle);
+EXPORT_SYMBOL(pm_power_off);
+EXPORT_SYMBOL(apm_info);
+//EXPORT_SYMBOL(gdt);
+EXPORT_SYMBOL(empty_zero_page);
+
+#ifdef CONFIG_DEBUG_IOVIRT
+EXPORT_SYMBOL(__io_virt_debug);
+#endif
+
+EXPORT_SYMBOL_NOVERS(__down_failed);
+EXPORT_SYMBOL_NOVERS(__down_failed_interruptible);
+EXPORT_SYMBOL_NOVERS(__down_failed_trylock);
+EXPORT_SYMBOL_NOVERS(__up_wakeup);
+/* Networking helper routines. */
+EXPORT_SYMBOL(csum_partial_copy_generic);
+/* Delay loops */
+EXPORT_SYMBOL(__ndelay);
+EXPORT_SYMBOL(__udelay);
+EXPORT_SYMBOL(__delay);
+EXPORT_SYMBOL(__const_udelay);
+
+EXPORT_SYMBOL_NOVERS(__get_user_1);
+EXPORT_SYMBOL_NOVERS(__get_user_2);
+EXPORT_SYMBOL_NOVERS(__get_user_4);
+
+EXPORT_SYMBOL(strtok);
+EXPORT_SYMBOL(strpbrk);
+EXPORT_SYMBOL(strstr);
+
+EXPORT_SYMBOL(strncpy_from_user);
+EXPORT_SYMBOL(__strncpy_from_user);
+EXPORT_SYMBOL(clear_user);
+EXPORT_SYMBOL(__clear_user);
+EXPORT_SYMBOL(__generic_copy_from_user);
+EXPORT_SYMBOL(__generic_copy_to_user);
+EXPORT_SYMBOL(strnlen_user);
+
+#ifdef CONFIG_X86_USE_3DNOW
+EXPORT_SYMBOL(_mmx_memcpy);
+EXPORT_SYMBOL(mmx_clear_page);
+EXPORT_SYMBOL(mmx_copy_page);
+#endif
+
+#ifdef CONFIG_SMP
+EXPORT_SYMBOL(cpu_data);
+EXPORT_SYMBOL(kernel_flag_cacheline);
+EXPORT_SYMBOL(smp_num_cpus);
+EXPORT_SYMBOL(cpu_online_map);
+EXPORT_SYMBOL_NOVERS(__write_lock_failed);
+EXPORT_SYMBOL_NOVERS(__read_lock_failed);
+
+/* Global SMP irq stuff */
+EXPORT_SYMBOL(synchronize_irq);
+EXPORT_SYMBOL(global_irq_holder);
+EXPORT_SYMBOL(__global_cli);
+EXPORT_SYMBOL(__global_sti);
+EXPORT_SYMBOL(__global_save_flags);
+EXPORT_SYMBOL(__global_restore_flags);
+EXPORT_SYMBOL(smp_call_function);
+
+/* TLB flushing */
+EXPORT_SYMBOL(flush_tlb_page);
+#endif
+
+#ifdef CONFIG_X86_IO_APIC
+EXPORT_SYMBOL(IO_APIC_get_PCI_irq_vector);
+#endif
+
+#ifdef CONFIG_VT
+EXPORT_SYMBOL(screen_info);
+#endif
+
+EXPORT_SYMBOL(get_wchan);
+
+EXPORT_SYMBOL(rtc_lock);
+
+#undef memcpy
+#undef memset
+extern void * memset(void *,int,__kernel_size_t);
+extern void * memcpy(void *,const void *,__kernel_size_t);
+EXPORT_SYMBOL_NOVERS(memcpy);
+EXPORT_SYMBOL_NOVERS(memset);
+
+#ifdef CONFIG_HAVE_DEC_LOCK
+EXPORT_SYMBOL(atomic_dec_and_lock);
+#endif
+
+#ifdef CONFIG_MULTIQUAD
+EXPORT_SYMBOL(xquad_portio);
+#endif
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/kernel/ioport.c b/xenolinux-2.4.22-sparse/arch/xeno/kernel/ioport.c
new file mode 100644 (file)
index 0000000..ed6dbbc
--- /dev/null
@@ -0,0 +1,48 @@
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/types.h>
+#include <linux/stddef.h>
+#include <asm/hypervisor-ifs/dom0_ops.h>
+
+
+asmlinkage int sys_iopl(unsigned int new_io_pl)
+{
+    unsigned int old_io_pl = current->thread.io_pl;
+    dom0_op_t op;
+
+    if ( !(start_info.flags & SIF_PRIVILEGED) )
+        return -EPERM;
+
+    if ( new_io_pl > 3 )
+        return -EINVAL;
+
+    /* Need "raw I/O" privileges for direct port access. */
+    if ( (new_io_pl > old_io_pl) && !capable(CAP_SYS_RAWIO) )
+        return -EPERM;
+
+    /* Maintain OS privileges even if user attempts to relinquish them. */
+    if ( (new_io_pl == 0) && (start_info.flags & SIF_PRIVILEGED) )
+        new_io_pl = 1;
+
+    /* Change our version of the privilege levels. */
+    current->thread.io_pl = new_io_pl;
+
+    /* Force the change at ring 0. */
+    op.cmd           = DOM0_IOPL;
+    op.u.iopl.domain = start_info.dom_id;
+    op.u.iopl.iopl   = new_io_pl;
+    HYPERVISOR_dom0_op(&op);
+
+    return 0;
+}
+
+
+asmlinkage int sys_ioperm(unsigned long from, unsigned long num, int turn_on)
+{
+    printk(KERN_INFO "ioperm not fully supported - %s\n",
+           turn_on ? "set iopl to 3" : "ignore resource release");
+    return turn_on ? sys_iopl(3) : 0;
+}
+
+
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/kernel/irq.c b/xenolinux-2.4.22-sparse/arch/xeno/kernel/irq.c
new file mode 100644 (file)
index 0000000..4f44969
--- /dev/null
@@ -0,0 +1,1136 @@
+/*
+ *     linux/arch/i386/kernel/irq.c
+ *
+ *     Copyright (C) 1992, 1998 Linus Torvalds, Ingo Molnar
+ *
+ * This file contains the code used by various IRQ handling routines:
+ * asking for different IRQ's should be done through these routines
+ * instead of just grabbing them. Thus setups with different IRQ numbers
+ * shouldn't result in any weird surprises, and installing new handlers
+ * should be easier.
+ */
+
+/*
+ * (mostly architecture independent, will move to kernel/irq.c in 2.5.)
+ *
+ * IRQs are in fact implemented a bit like signal handlers for the kernel.
+ * Naturally it's not a 1:1 relation, but there are similarities.
+ */
+
+#include <linux/config.h>
+#include <linux/ptrace.h>
+#include <linux/errno.h>
+#include <linux/signal.h>
+#include <linux/sched.h>
+#include <linux/ioport.h>
+#include <linux/interrupt.h>
+#include <linux/timex.h>
+#include <linux/slab.h>
+#include <linux/random.h>
+#include <linux/smp_lock.h>
+#include <linux/init.h>
+#include <linux/kernel_stat.h>
+#include <linux/irq.h>
+#include <linux/proc_fs.h>
+
+#include <asm/atomic.h>
+#include <asm/io.h>
+#include <asm/smp.h>
+#include <asm/system.h>
+#include <asm/bitops.h>
+#include <asm/uaccess.h>
+#include <asm/pgalloc.h>
+#include <asm/delay.h>
+#include <asm/desc.h>
+#include <asm/irq.h>
+
+
+
+/*
+ * Linux has a controller-independent x86 interrupt architecture.
+ * every controller has a 'controller-template', that is used
+ * by the main code to do the right thing. Each driver-visible
+ * interrupt source is transparently wired to the apropriate
+ * controller. Thus drivers need not be aware of the
+ * interrupt-controller.
+ *
+ * Various interrupt controllers we handle: 8259 PIC, SMP IO-APIC,
+ * PIIX4's internal 8259 PIC and SGI's Visual Workstation Cobalt (IO-)APIC.
+ * (IO-APICs assumed to be messaging to Pentium local-APICs)
+ *
+ * the code is designed to be easily extended with new/different
+ * interrupt controllers, without having to do assembly magic.
+ */
+
+/*
+ * Controller mappings for all interrupt sources:
+ */
+irq_desc_t irq_desc[NR_IRQS] __cacheline_aligned =
+       { [0 ... NR_IRQS-1] = { 0, &no_irq_type, NULL, 0, SPIN_LOCK_UNLOCKED}};
+
+static void register_irq_proc (unsigned int irq);
+
+/*
+ * Special irq handlers.
+ */
+
+void no_action(int cpl, void *dev_id, struct pt_regs *regs) { }
+
+/*
+ * Generic no controller code
+ */
+
+static void enable_none(unsigned int irq) { }
+static unsigned int startup_none(unsigned int irq) { return 0; }
+static void disable_none(unsigned int irq) { }
+static void ack_none(unsigned int irq)
+{
+       printk("unexpected IRQ trap at vector %02x\n", irq);
+}
+
+/* startup is the same as "enable", shutdown is same as "disable" */
+#define shutdown_none  disable_none
+#define end_none       enable_none
+
+struct hw_interrupt_type no_irq_type = {
+       "none",
+       startup_none,
+       shutdown_none,
+       enable_none,
+       disable_none,
+       ack_none,
+       end_none
+};
+
+atomic_t irq_err_count;
+#ifdef CONFIG_X86_IO_APIC
+#ifdef APIC_MISMATCH_DEBUG
+atomic_t irq_mis_count;
+#endif
+#endif
+
+/*
+ * Generic, controller-independent functions:
+ */
+
+int get_irq_list(char *buf)
+{
+       int i, j;
+       struct irqaction * action;
+       char *p = buf;
+
+       p += sprintf(p, "           ");
+       for (j=0; j<smp_num_cpus; j++)
+               p += sprintf(p, "CPU%d       ",j);
+       *p++ = '\n';
+
+       for (i = 0 ; i < NR_IRQS ; i++) {
+               action = irq_desc[i].action;
+               if (!action) 
+                       continue;
+               p += sprintf(p, "%3d: ",i);
+#ifndef CONFIG_SMP
+               p += sprintf(p, "%10u ", kstat_irqs(i));
+#else
+               for (j = 0; j < smp_num_cpus; j++)
+                       p += sprintf(p, "%10u ",
+                               kstat.irqs[cpu_logical_map(j)][i]);
+#endif
+               p += sprintf(p, " %14s", irq_desc[i].handler->typename);
+               p += sprintf(p, "  %s", action->name);
+
+               for (action=action->next; action; action = action->next)
+                       p += sprintf(p, ", %s", action->name);
+               *p++ = '\n';
+       }
+       p += sprintf(p, "NMI: ");
+       for (j = 0; j < smp_num_cpus; j++)
+               p += sprintf(p, "%10u ",
+                       nmi_count(cpu_logical_map(j)));
+       p += sprintf(p, "\n");
+#if CONFIG_X86_LOCAL_APIC
+       p += sprintf(p, "LOC: ");
+       for (j = 0; j < smp_num_cpus; j++)
+               p += sprintf(p, "%10u ",
+                       apic_timer_irqs[cpu_logical_map(j)]);
+       p += sprintf(p, "\n");
+#endif
+       p += sprintf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
+#ifdef CONFIG_X86_IO_APIC
+#ifdef APIC_MISMATCH_DEBUG
+       p += sprintf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
+#endif
+#endif
+       return p - buf;
+}
+
+
+/*
+ * Global interrupt locks for SMP. Allow interrupts to come in on any
+ * CPU, yet make cli/sti act globally to protect critical regions..
+ */
+
+#ifdef CONFIG_SMP
+unsigned char global_irq_holder = NO_PROC_ID;
+unsigned volatile long global_irq_lock; /* pendantic: long for set_bit --RR */
+
+extern void show_stack(unsigned long* esp);
+
+static void show(char * str)
+{
+       int i;
+       int cpu = smp_processor_id();
+
+       printk("\n%s, CPU %d:\n", str, cpu);
+       printk("irq:  %d [",irqs_running());
+       for(i=0;i < smp_num_cpus;i++)
+               printk(" %d",local_irq_count(i));
+       printk(" ]\nbh:   %d [",spin_is_locked(&global_bh_lock) ? 1 : 0);
+       for(i=0;i < smp_num_cpus;i++)
+               printk(" %d",local_bh_count(i));
+
+       printk(" ]\nStack dumps:");
+       for(i = 0; i < smp_num_cpus; i++) {
+               unsigned long esp;
+               if (i == cpu)
+                       continue;
+               printk("\nCPU %d:",i);
+               esp = init_tss[i].esp0;
+               if (!esp) {
+                       /* tss->esp0 is set to NULL in cpu_init(),
+                        * it's initialized when the cpu returns to user
+                        * space. -- manfreds
+                        */
+                       printk(" <unknown> ");
+                       continue;
+               }
+               esp &= ~(THREAD_SIZE-1);
+               esp += sizeof(struct task_struct);
+               show_stack((void*)esp);
+       }
+       printk("\nCPU %d:",cpu);
+       show_stack(NULL);
+       printk("\n");
+}
+       
+#define MAXCOUNT 100000000
+
+/*
+ * I had a lockup scenario where a tight loop doing
+ * spin_unlock()/spin_lock() on CPU#1 was racing with
+ * spin_lock() on CPU#0. CPU#0 should have noticed spin_unlock(), but
+ * apparently the spin_unlock() information did not make it
+ * through to CPU#0 ... nasty, is this by design, do we have to limit
+ * 'memory update oscillation frequency' artificially like here?
+ *
+ * Such 'high frequency update' races can be avoided by careful design, but
+ * some of our major constructs like spinlocks use similar techniques,
+ * it would be nice to clarify this issue. Set this define to 0 if you
+ * want to check whether your system freezes.  I suspect the delay done
+ * by SYNC_OTHER_CORES() is in correlation with 'snooping latency', but
+ * i thought that such things are guaranteed by design, since we use
+ * the 'LOCK' prefix.
+ */
+#define SUSPECTED_CPU_OR_CHIPSET_BUG_WORKAROUND 0
+
+#if SUSPECTED_CPU_OR_CHIPSET_BUG_WORKAROUND
+# define SYNC_OTHER_CORES(x) udelay(x+1)
+#else
+/*
+ * We have to allow irqs to arrive between __sti and __cli
+ */
+# define SYNC_OTHER_CORES(x) __asm__ __volatile__ ("nop")
+#endif
+
+static inline void wait_on_irq(int cpu)
+{
+       int count = MAXCOUNT;
+
+       for (;;) {
+
+               /*
+                * Wait until all interrupts are gone. Wait
+                * for bottom half handlers unless we're
+                * already executing in one..
+                */
+               if (!irqs_running())
+                       if (local_bh_count(cpu) || !spin_is_locked(&global_bh_lock))
+                               break;
+
+               /* Duh, we have to loop. Release the lock to avoid deadlocks */
+               clear_bit(0,&global_irq_lock);
+
+               for (;;) {
+                       if (!--count) {
+                               show("wait_on_irq");
+                               count = ~0;
+                       }
+                       __sti();
+                       SYNC_OTHER_CORES(cpu);
+                       __cli();
+                       if (irqs_running())
+                               continue;
+                       if (global_irq_lock)
+                               continue;
+                       if (!local_bh_count(cpu) && spin_is_locked(&global_bh_lock))
+                               continue;
+                       if (!test_and_set_bit(0,&global_irq_lock))
+                               break;
+               }
+       }
+}
+
+/*
+ * This is called when we want to synchronize with
+ * interrupts. We may for example tell a device to
+ * stop sending interrupts: but to make sure there
+ * are no interrupts that are executing on another
+ * CPU we need to call this function.
+ */
+void synchronize_irq(void)
+{
+       if (irqs_running()) {
+               /* Stupid approach */
+               cli();
+               sti();
+       }
+}
+
+static inline void get_irqlock(int cpu)
+{
+       if (test_and_set_bit(0,&global_irq_lock)) {
+               /* do we already hold the lock? */
+               if ((unsigned char) cpu == global_irq_holder)
+                       return;
+               /* Uhhuh.. Somebody else got it. Wait.. */
+               do {
+                       do {
+                               rep_nop();
+                       } while (test_bit(0,&global_irq_lock));
+               } while (test_and_set_bit(0,&global_irq_lock));         
+       }
+       /* 
+        * We also to make sure that nobody else is running
+        * in an interrupt context. 
+        */
+       wait_on_irq(cpu);
+
+       /*
+        * Ok, finally..
+        */
+       global_irq_holder = cpu;
+}
+
+void __global_cli(void)
+{
+    panic("__global_cli");
+}
+
+void __global_sti(void)
+{
+    panic("__global_sti");
+}
+
+/*
+ * SMP flags value to restore to:
+ * 0 - global cli
+ * 1 - global sti
+ * 2 - local cli
+ * 3 - local sti
+ */
+unsigned long __global_save_flags(void)
+{
+    panic("__global_save_flags");
+}
+
+void __global_restore_flags(unsigned long flags)
+{
+    panic("__global_restore_flags");
+}
+
+#endif
+
+/*
+ * This should really return information about whether
+ * we should do bottom half handling etc. Right now we
+ * end up _always_ checking the bottom half, which is a
+ * waste of time and is not what some drivers would
+ * prefer.
+ */
+int handle_IRQ_event(unsigned int irq, struct pt_regs * regs, struct irqaction * action)
+{
+       int status;
+       int cpu = smp_processor_id();
+
+       irq_enter(cpu, irq);
+
+       status = 1;     /* Force the "do bottom halves" bit */
+
+       if (!(action->flags & SA_INTERRUPT))
+               __sti();
+
+       do {
+               status |= action->flags;
+               action->handler(irq, action->dev_id, regs);
+               action = action->next;
+       } while (action);
+       if (status & SA_SAMPLE_RANDOM)
+               add_interrupt_randomness(irq);
+       __cli();
+
+       irq_exit(cpu, irq);
+
+       return status;
+}
+
+/*
+ * Generic enable/disable code: this just calls
+ * down into the PIC-specific version for the actual
+ * hardware disable after having gotten the irq
+ * controller lock. 
+ */
+/**
+ *     disable_irq_nosync - disable an irq without waiting
+ *     @irq: Interrupt to disable
+ *
+ *     Disable the selected interrupt line.  Disables and Enables are
+ *     nested.
+ *     Unlike disable_irq(), this function does not ensure existing
+ *     instances of the IRQ handler have completed before returning.
+ *
+ *     This function may be called from IRQ context.
+ */
+inline void disable_irq_nosync(unsigned int irq)
+{
+       irq_desc_t *desc = irq_desc + irq;
+       unsigned long flags;
+
+       spin_lock_irqsave(&desc->lock, flags);
+       if (!desc->depth++) {
+               desc->status |= IRQ_DISABLED;
+               desc->handler->disable(irq);
+       }
+       spin_unlock_irqrestore(&desc->lock, flags);
+}
+
+/**
+ *     disable_irq - disable an irq and wait for completion
+ *     @irq: Interrupt to disable
+ *
+ *     Disable the selected interrupt line.  Enables and Disables are
+ *     nested.
+ *     This function waits for any pending IRQ handlers for this interrupt
+ *     to complete before returning. If you use this function while
+ *     holding a resource the IRQ handler may need you will deadlock.
+ *
+ *     This function may be called - with care - from IRQ context.
+ */
+void disable_irq(unsigned int irq)
+{
+       disable_irq_nosync(irq);
+
+       if (!local_irq_count(smp_processor_id())) {
+               do {
+                       barrier();
+                       cpu_relax();
+               } while (irq_desc[irq].status & IRQ_INPROGRESS);
+       }
+}
+
+/**
+ *     enable_irq - enable handling of an irq
+ *     @irq: Interrupt to enable
+ *
+ *     Undoes the effect of one call to disable_irq().  If this
+ *     matches the last disable, processing of interrupts on this
+ *     IRQ line is re-enabled.
+ *
+ *     This function may be called from IRQ context.
+ */
+void enable_irq(unsigned int irq)
+{
+       irq_desc_t *desc = irq_desc + irq;
+       unsigned long flags;
+
+       spin_lock_irqsave(&desc->lock, flags);
+       switch (desc->depth) {
+       case 1: {
+               unsigned int status = desc->status & ~IRQ_DISABLED;
+               desc->status = status;
+               if ((status & (IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) {
+                       desc->status = status | IRQ_REPLAY;
+                       hw_resend_irq(desc->handler,irq);
+               }
+               desc->handler->enable(irq);
+               /* fall-through */
+       }
+       default:
+               desc->depth--;
+               break;
+       case 0:
+               printk("enable_irq(%u) unbalanced from %p\n", irq,
+                      __builtin_return_address(0));
+       }
+       spin_unlock_irqrestore(&desc->lock, flags);
+}
+
+/*
+ * do_IRQ handles all normal device IRQ's (the special
+ * SMP cross-CPU interrupts have their own specific
+ * handlers).
+ */
+asmlinkage unsigned int do_IRQ(int irq, struct pt_regs *regs)
+{      
+       /* 
+        * We ack quickly, we don't want the irq controller
+        * thinking we're snobs just because some other CPU has
+        * disabled global interrupts (we have already done the
+        * INT_ACK cycles, it's too late to try to pretend to the
+        * controller that we aren't taking the interrupt).
+        *
+        * 0 return value means that this irq is already being
+        * handled by some other CPU. (or is disabled)
+        */
+       int cpu = smp_processor_id();
+       irq_desc_t *desc = irq_desc + irq;
+       struct irqaction * action;
+       unsigned int status;
+#ifdef CONFIG_DEBUG_STACKOVERFLOW
+       long esp;
+
+       /* Debugging check for stack overflow: is there less than 1KB free? */
+       __asm__ __volatile__("andl %%esp,%0" : "=r" (esp) : "0" (8191));
+       if (unlikely(esp < (sizeof(struct task_struct) + 1024))) {
+               extern void show_stack(unsigned long *);
+
+               printk("do_IRQ: stack overflow: %ld\n",
+                       esp - sizeof(struct task_struct));
+               __asm__ __volatile__("movl %%esp,%0" : "=r" (esp));
+               show_stack((void *)esp);
+       }
+#endif
+
+       kstat.irqs[cpu][irq]++;
+       spin_lock(&desc->lock);
+       desc->handler->ack(irq);
+       /*
+          REPLAY is when Linux resends an IRQ that was dropped earlier
+          WAITING is used by probe to mark irqs that are being tested
+          */
+       status = desc->status & ~(IRQ_REPLAY | IRQ_WAITING);
+       status |= IRQ_PENDING; /* we _want_ to handle it */
+
+       /*
+        * If the IRQ is disabled for whatever reason, we cannot
+        * use the action we have.
+        */
+       action = NULL;
+       if (!(status & (IRQ_DISABLED | IRQ_INPROGRESS))) {
+               action = desc->action;
+               status &= ~IRQ_PENDING; /* we commit to handling */
+               status |= IRQ_INPROGRESS; /* we are handling it */
+       }
+       desc->status = status;
+
+       /*
+        * If there is no IRQ handler or it was disabled, exit early.
+          Since we set PENDING, if another processor is handling
+          a different instance of this same irq, the other processor
+          will take care of it.
+        */
+       if (!action)
+               goto out;
+
+       /*
+        * Edge triggered interrupts need to remember
+        * pending events.
+        * This applies to any hw interrupts that allow a second
+        * instance of the same irq to arrive while we are in do_IRQ
+        * or in the handler. But the code here only handles the _second_
+        * instance of the irq, not the third or fourth. So it is mostly
+        * useful for irq hardware that does not mask cleanly in an
+        * SMP environment.
+        */
+       for (;;) {
+               spin_unlock(&desc->lock);
+               handle_IRQ_event(irq, regs, action);
+               spin_lock(&desc->lock);
+               
+               if (!(desc->status & IRQ_PENDING))
+                       break;
+               desc->status &= ~IRQ_PENDING;
+       }
+       desc->status &= ~IRQ_INPROGRESS;
+out:
+       /*
+        * The ->end() handler has to deal with interrupts which got
+        * disabled while the handler was running.
+        */
+       desc->handler->end(irq);
+       spin_unlock(&desc->lock);
+
+       if (softirq_pending(cpu))
+               do_softirq();
+       return 1;
+}
+
+/**
+ *     request_irq - allocate an interrupt line
+ *     @irq: Interrupt line to allocate
+ *     @handler: Function to be called when the IRQ occurs
+ *     @irqflags: Interrupt type flags
+ *     @devname: An ascii name for the claiming device
+ *     @dev_id: A cookie passed back to the handler function
+ *
+ *     This call allocates interrupt resources and enables the
+ *     interrupt line and IRQ handling. From the point this
+ *     call is made your handler function may be invoked. Since
+ *     your handler function must clear any interrupt the board 
+ *     raises, you must take care both to initialise your hardware
+ *     and to set up the interrupt handler in the right order.
+ *
+ *     Dev_id must be globally unique. Normally the address of the
+ *     device data structure is used as the cookie. Since the handler
+ *     receives this value it makes sense to use it.
+ *
+ *     If your interrupt is shared you must pass a non NULL dev_id
+ *     as this is required when freeing the interrupt.
+ *
+ *     Flags:
+ *
+ *     SA_SHIRQ                Interrupt is shared
+ *
+ *     SA_INTERRUPT            Disable local interrupts while processing
+ *
+ *     SA_SAMPLE_RANDOM        The interrupt can be used for entropy
+ *
+ */
+int request_irq(unsigned int irq, 
+               void (*handler)(int, void *, struct pt_regs *),
+               unsigned long irqflags, 
+               const char * devname,
+               void *dev_id)
+{
+       int retval;
+       struct irqaction * action;
+
+#if 1
+       /*
+        * Sanity-check: shared interrupts should REALLY pass in
+        * a real dev-ID, otherwise we'll have trouble later trying
+        * to figure out which interrupt is which (messes up the
+        * interrupt freeing logic etc).
+        */
+       if (irqflags & SA_SHIRQ) {
+               if (!dev_id)
+                       printk("Bad boy: %s (at 0x%x) called us without a dev_id!\n", devname, (&irq)[-1]);
+       }
+#endif
+
+       if (irq >= NR_IRQS)
+               return -EINVAL;
+       if (!handler)
+               return -EINVAL;
+
+       action = (struct irqaction *)
+                       kmalloc(sizeof(struct irqaction), GFP_KERNEL);
+       if (!action)
+               return -ENOMEM;
+
+       action->handler = handler;
+       action->flags = irqflags;
+       action->mask = 0;
+       action->name = devname;
+       action->next = NULL;
+       action->dev_id = dev_id;
+
+       retval = setup_irq(irq, action);
+       if (retval)
+               kfree(action);
+       return retval;
+}
+
+/**
+ *     free_irq - free an interrupt
+ *     @irq: Interrupt line to free
+ *     @dev_id: Device identity to free
+ *
+ *     Remove an interrupt handler. The handler is removed and if the
+ *     interrupt line is no longer in use by any driver it is disabled.
+ *     On a shared IRQ the caller must ensure the interrupt is disabled
+ *     on the card it drives before calling this function. The function
+ *     does not return until any executing interrupts for this IRQ
+ *     have completed.
+ *
+ *     This function may be called from interrupt context. 
+ *
+ *     Bugs: Attempting to free an irq in a handler for the same irq hangs
+ *           the machine.
+ */
+void free_irq(unsigned int irq, void *dev_id)
+{
+       irq_desc_t *desc;
+       struct irqaction **p;
+       unsigned long flags;
+
+       if (irq >= NR_IRQS)
+               return;
+
+       desc = irq_desc + irq;
+       spin_lock_irqsave(&desc->lock,flags);
+       p = &desc->action;
+       for (;;) {
+               struct irqaction * action = *p;
+               if (action) {
+                       struct irqaction **pp = p;
+                       p = &action->next;
+                       if (action->dev_id != dev_id)
+                               continue;
+
+                       /* Found it - now remove it from the list of entries */
+                       *pp = action->next;
+                       if (!desc->action) {
+                               desc->status |= IRQ_DISABLED;
+                               desc->handler->shutdown(irq);
+                       }
+                       spin_unlock_irqrestore(&desc->lock,flags);
+
+#ifdef CONFIG_SMP
+                       /* Wait to make sure it's not being used on another CPU */
+                       while (desc->status & IRQ_INPROGRESS) {
+                               barrier();
+                               cpu_relax();
+                       }
+#endif
+                       kfree(action);
+                       return;
+               }
+               printk("Trying to free free IRQ%d\n",irq);
+               spin_unlock_irqrestore(&desc->lock,flags);
+               return;
+       }
+}
+
+/*
+ * IRQ autodetection code..
+ *
+ * This depends on the fact that any interrupt that
+ * comes in on to an unassigned handler will get stuck
+ * with "IRQ_WAITING" cleared and the interrupt
+ * disabled.
+ */
+
+static DECLARE_MUTEX(probe_sem);
+
+/**
+ *     probe_irq_on    - begin an interrupt autodetect
+ *
+ *     Commence probing for an interrupt. The interrupts are scanned
+ *     and a mask of potential interrupt lines is returned.
+ *
+ */
+unsigned long probe_irq_on(void)
+{
+       unsigned int i;
+       irq_desc_t *desc;
+       unsigned long val;
+       unsigned long delay;
+
+       down(&probe_sem);
+       /* 
+        * something may have generated an irq long ago and we want to
+        * flush such a longstanding irq before considering it as spurious. 
+        */
+       for (i = NR_IRQS-1; i > 0; i--)  {
+               desc = irq_desc + i;
+
+               spin_lock_irq(&desc->lock);
+               if (!irq_desc[i].action) 
+                       irq_desc[i].handler->startup(i);
+               spin_unlock_irq(&desc->lock);
+       }
+
+       /* Wait for longstanding interrupts to trigger. */
+       for (delay = jiffies + HZ/50; time_after(delay, jiffies); )
+               /* about 20ms delay */ synchronize_irq();
+
+       /*
+        * enable any unassigned irqs
+        * (we must startup again here because if a longstanding irq
+        * happened in the previous stage, it may have masked itself)
+        */
+       for (i = NR_IRQS-1; i > 0; i--) {
+               desc = irq_desc + i;
+
+               spin_lock_irq(&desc->lock);
+               if (!desc->action) {
+                       desc->status |= IRQ_AUTODETECT | IRQ_WAITING;
+                       if (desc->handler->startup(i))
+                               desc->status |= IRQ_PENDING;
+               }
+               spin_unlock_irq(&desc->lock);
+       }
+
+       /*
+        * Wait for spurious interrupts to trigger
+        */
+       for (delay = jiffies + HZ/10; time_after(delay, jiffies); )
+               /* about 100ms delay */ synchronize_irq();
+
+       /*
+        * Now filter out any obviously spurious interrupts
+        */
+       val = 0;
+       for (i = 0; i < NR_IRQS; i++) {
+               irq_desc_t *desc = irq_desc + i;
+               unsigned int status;
+
+               spin_lock_irq(&desc->lock);
+               status = desc->status;
+
+               if (status & IRQ_AUTODETECT) {
+                       /* It triggered already - consider it spurious. */
+                       if (!(status & IRQ_WAITING)) {
+                               desc->status = status & ~IRQ_AUTODETECT;
+                               desc->handler->shutdown(i);
+                       } else
+                               if (i < 32)
+                                       val |= 1 << i;
+               }
+               spin_unlock_irq(&desc->lock);
+       }
+
+       return val;
+}
+
+/*
+ * Return a mask of triggered interrupts (this
+ * can handle only legacy ISA interrupts).
+ */
+/**
+ *     probe_irq_mask - scan a bitmap of interrupt lines
+ *     @val:   mask of interrupts to consider
+ *
+ *     Scan the ISA bus interrupt lines and return a bitmap of
+ *     active interrupts. The interrupt probe logic state is then
+ *     returned to its previous value.
+ *
+ *     Note: we need to scan all the irq's even though we will
+ *     only return ISA irq numbers - just so that we reset them
+ *     all to a known state.
+ */
+unsigned int probe_irq_mask(unsigned long val)
+{
+       int i;
+       unsigned int mask;
+
+       mask = 0;
+       for (i = 0; i < NR_IRQS; i++) {
+               irq_desc_t *desc = irq_desc + i;
+               unsigned int status;
+
+               spin_lock_irq(&desc->lock);
+               status = desc->status;
+
+               if (status & IRQ_AUTODETECT) {
+                       if (i < 16 && !(status & IRQ_WAITING))
+                               mask |= 1 << i;
+
+                       desc->status = status & ~IRQ_AUTODETECT;
+                       desc->handler->shutdown(i);
+               }
+               spin_unlock_irq(&desc->lock);
+       }
+       up(&probe_sem);
+
+       return mask & val;
+}
+
+/*
+ * Return the one interrupt that triggered (this can
+ * handle any interrupt source).
+ */
+
+/**
+ *     probe_irq_off   - end an interrupt autodetect
+ *     @val: mask of potential interrupts (unused)
+ *
+ *     Scans the unused interrupt lines and returns the line which
+ *     appears to have triggered the interrupt. If no interrupt was
+ *     found then zero is returned. If more than one interrupt is
+ *     found then minus the first candidate is returned to indicate
+ *     their is doubt.
+ *
+ *     The interrupt probe logic state is returned to its previous
+ *     value.
+ *
+ *     BUGS: When used in a module (which arguably shouldnt happen)
+ *     nothing prevents two IRQ probe callers from overlapping. The
+ *     results of this are non-optimal.
+ */
+int probe_irq_off(unsigned long val)
+{
+       int i, irq_found, nr_irqs;
+
+       nr_irqs = 0;
+       irq_found = 0;
+       for (i = 0; i < NR_IRQS; i++) {
+               irq_desc_t *desc = irq_desc + i;
+               unsigned int status;
+
+               spin_lock_irq(&desc->lock);
+               status = desc->status;
+
+               if (status & IRQ_AUTODETECT) {
+                       if (!(status & IRQ_WAITING)) {
+                               if (!nr_irqs)
+                                       irq_found = i;
+                               nr_irqs++;
+                       }
+                       desc->status = status & ~IRQ_AUTODETECT;
+                       desc->handler->shutdown(i);
+               }
+               spin_unlock_irq(&desc->lock);
+       }
+       up(&probe_sem);
+
+       if (nr_irqs > 1)
+               irq_found = -irq_found;
+       return irq_found;
+}
+
+/* this was setup_x86_irq but it seems pretty generic */
+int setup_irq(unsigned int irq, struct irqaction * new)
+{
+       int shared = 0;
+       unsigned long flags;
+       struct irqaction *old, **p;
+       irq_desc_t *desc = irq_desc + irq;
+
+       /*
+        * Some drivers like serial.c use request_irq() heavily,
+        * so we have to be careful not to interfere with a
+        * running system.
+        */
+       if (new->flags & SA_SAMPLE_RANDOM) {
+               /*
+                * This function might sleep, we want to call it first,
+                * outside of the atomic block.
+                * Yes, this might clear the entropy pool if the wrong
+                * driver is attempted to be loaded, without actually
+                * installing a new handler, but is this really a problem,
+                * only the sysadmin is able to do this.
+                */
+               rand_initialize_irq(irq);
+       }
+
+       /*
+        * The following block of code has to be executed atomically
+        */
+       spin_lock_irqsave(&desc->lock,flags);
+       p = &desc->action;
+       if ((old = *p) != NULL) {
+               /* Can't share interrupts unless both agree to */
+               if (!(old->flags & new->flags & SA_SHIRQ)) {
+                       spin_unlock_irqrestore(&desc->lock,flags);
+                       return -EBUSY;
+               }
+
+               /* add new interrupt at end of irq queue */
+               do {
+                       p = &old->next;
+                       old = *p;
+               } while (old);
+               shared = 1;
+       }
+
+       *p = new;
+
+       if (!shared) {
+               desc->depth = 0;
+               desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT | IRQ_WAITING);
+               desc->handler->startup(irq);
+       }
+       spin_unlock_irqrestore(&desc->lock,flags);
+
+       register_irq_proc(irq);
+       return 0;
+}
+
+static struct proc_dir_entry * root_irq_dir;
+static struct proc_dir_entry * irq_dir [NR_IRQS];
+
+#define HEX_DIGITS 8
+
+static unsigned int parse_hex_value (const char *buffer,
+               unsigned long count, unsigned long *ret)
+{
+       unsigned char hexnum [HEX_DIGITS];
+       unsigned long value;
+       int i;
+
+       if (!count)
+               return -EINVAL;
+       if (count > HEX_DIGITS)
+               count = HEX_DIGITS;
+       if (copy_from_user(hexnum, buffer, count))
+               return -EFAULT;
+
+       /*
+        * Parse the first 8 characters as a hex string, any non-hex char
+        * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
+        */
+       value = 0;
+
+       for (i = 0; i < count; i++) {
+               unsigned int c = hexnum[i];
+
+               switch (c) {
+                       case '0' ... '9': c -= '0'; break;
+                       case 'a' ... 'f': c -= 'a'-10; break;
+                       case 'A' ... 'F': c -= 'A'-10; break;
+               default:
+                       goto out;
+               }
+               value = (value << 4) | c;
+       }
+out:
+       *ret = value;
+       return 0;
+}
+
+#if CONFIG_SMP
+
+static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
+
+static unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = ~0UL };
+static int irq_affinity_read_proc (char *page, char **start, off_t off,
+                       int count, int *eof, void *data)
+{
+       if (count < HEX_DIGITS+1)
+               return -EINVAL;
+       return sprintf (page, "%08lx\n", irq_affinity[(long)data]);
+}
+
+static int irq_affinity_write_proc (struct file *file, const char *buffer,
+                                       unsigned long count, void *data)
+{
+       int irq = (long) data, full_count = count, err;
+       unsigned long new_value;
+
+       if (!irq_desc[irq].handler->set_affinity)
+               return -EIO;
+
+       err = parse_hex_value(buffer, count, &new_value);
+
+       /*
+        * Do not allow disabling IRQs completely - it's a too easy
+        * way to make the system unusable accidentally :-) At least
+        * one online CPU still has to be targeted.
+        */
+       if (!(new_value & cpu_online_map))
+               return -EINVAL;
+
+       irq_affinity[irq] = new_value;
+       irq_desc[irq].handler->set_affinity(irq, new_value);
+
+       return full_count;
+}
+
+#endif
+
+static int prof_cpu_mask_read_proc (char *page, char **start, off_t off,
+                       int count, int *eof, void *data)
+{
+       unsigned long *mask = (unsigned long *) data;
+       if (count < HEX_DIGITS+1)
+               return -EINVAL;
+       return sprintf (page, "%08lx\n", *mask);
+}
+
+static int prof_cpu_mask_write_proc (struct file *file, const char *buffer,
+                                       unsigned long count, void *data)
+{
+       unsigned long *mask = (unsigned long *) data, full_count = count, err;
+       unsigned long new_value;
+
+       err = parse_hex_value(buffer, count, &new_value);
+       if (err)
+               return err;
+
+       *mask = new_value;
+       return full_count;
+}
+
+#define MAX_NAMELEN 10
+
+static void register_irq_proc (unsigned int irq)
+{
+       char name [MAX_NAMELEN];
+
+       if (!root_irq_dir || (irq_desc[irq].handler == &no_irq_type) ||
+                       irq_dir[irq])
+               return;
+
+       memset(name, 0, MAX_NAMELEN);
+       sprintf(name, "%d", irq);
+
+       /* create /proc/irq/1234 */
+       irq_dir[irq] = proc_mkdir(name, root_irq_dir);
+
+#if CONFIG_SMP
+       {
+               struct proc_dir_entry *entry;
+
+               /* create /proc/irq/1234/smp_affinity */
+               entry = create_proc_entry("smp_affinity", 0600, irq_dir[irq]);
+
+               if (entry) {
+                       entry->nlink = 1;
+                       entry->data = (void *)(long)irq;
+                       entry->read_proc = irq_affinity_read_proc;
+                       entry->write_proc = irq_affinity_write_proc;
+               }
+
+               smp_affinity_entry[irq] = entry;
+       }
+#endif
+}
+
+unsigned long prof_cpu_mask = -1;
+
+void init_irq_proc (void)
+{
+       struct proc_dir_entry *entry;
+       int i;
+
+       /* create /proc/irq */
+       root_irq_dir = proc_mkdir("irq", 0);
+
+       /* create /proc/irq/prof_cpu_mask */
+       entry = create_proc_entry("prof_cpu_mask", 0600, root_irq_dir);
+
+       if (!entry)
+           return;
+
+       entry->nlink = 1;
+       entry->data = (void *)&prof_cpu_mask;
+       entry->read_proc = prof_cpu_mask_read_proc;
+       entry->write_proc = prof_cpu_mask_write_proc;
+
+       /*
+        * Create entries for all existing IRQs.
+        */
+       for (i = 0; i < NR_IRQS; i++)
+               register_irq_proc(i);
+}
+
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/kernel/ldt.c b/xenolinux-2.4.22-sparse/arch/xeno/kernel/ldt.c
new file mode 100644 (file)
index 0000000..ca89b69
--- /dev/null
@@ -0,0 +1,169 @@
+/*
+ * linux/kernel/ldt.c
+ *
+ * Copyright (C) 1992 Krishna Balasubramanian and Linus Torvalds
+ * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
+ */
+
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/string.h>
+#include <linux/mm.h>
+#include <linux/smp.h>
+#include <linux/smp_lock.h>
+#include <linux/vmalloc.h>
+
+#include <asm/uaccess.h>
+#include <asm/system.h>
+#include <asm/ldt.h>
+#include <asm/desc.h>
+
+/*
+ * read_ldt() is not really atomic - this is not a problem since
+ * synchronization of reads and writes done to the LDT has to be
+ * assured by user-space anyway. Writes are atomic, to protect
+ * the security checks done on new descriptors.
+ */
+static int read_ldt(void * ptr, unsigned long bytecount)
+{
+    int err;
+    unsigned long size;
+    struct mm_struct * mm = current->mm;
+
+    err = 0;
+    if (!mm->context.segments)
+        goto out;
+
+    size = LDT_ENTRIES*LDT_ENTRY_SIZE;
+    if (size > bytecount)
+        size = bytecount;
+
+    err = size;
+    if (copy_to_user(ptr, mm->context.segments, size))
+        err = -EFAULT;
+ out:
+    return err;
+}
+
+static int read_default_ldt(void * ptr, unsigned long bytecount)
+{
+    int err;
+    unsigned long size;
+    void *address;
+
+    err = 0;
+    address = &default_ldt[0];
+    size = sizeof(struct desc_struct);
+    if (size > bytecount)
+        size = bytecount;
+
+    err = size;
+    if (copy_to_user(ptr, address, size))
+        err = -EFAULT;
+
+    return err;
+}
+
+static int write_ldt(void * ptr, unsigned long bytecount, int oldmode)
+{
+    struct mm_struct * mm = current->mm;
+    __u32 entry_1, entry_2, *lp;
+    unsigned long phys_lp;
+    int error;
+    struct modify_ldt_ldt_s ldt_info;
+
+    error = -EINVAL;
+    if (bytecount != sizeof(ldt_info))
+        goto out;
+    error = -EFAULT;   
+    if (copy_from_user(&ldt_info, ptr, sizeof(ldt_info)))
+        goto out;
+
+    error = -EINVAL;
+    if (ldt_info.entry_number >= LDT_ENTRIES)
+        goto out;
+    if (ldt_info.contents == 3) {
+        if (oldmode)
+            goto out;
+        if (ldt_info.seg_not_present == 0)
+            goto out;
+    }
+
+    down_write(&mm->mmap_sem);
+    if (!mm->context.segments) {
+        void * segments = vmalloc(LDT_ENTRIES*LDT_ENTRY_SIZE);
+        error = -ENOMEM;
+        if (!segments)
+            goto out_unlock;
+        memset(segments, 0, LDT_ENTRIES*LDT_ENTRY_SIZE);
+        make_pages_readonly(segments, (LDT_ENTRIES*LDT_ENTRY_SIZE)/PAGE_SIZE);
+        wmb();
+        mm->context.segments = segments;
+        mm->context.cpuvalid = 1UL << smp_processor_id();
+        load_LDT(mm);
+        flush_page_update_queue();
+    }
+
+    lp = (__u32 *)((ldt_info.entry_number<<3) + (char *)mm->context.segments);
+    phys_lp = arbitrary_virt_to_phys(lp);
+
+    /* Allow LDTs to be cleared by the user. */
+    if (ldt_info.base_addr == 0 && ldt_info.limit == 0) {
+        if (oldmode ||
+            (ldt_info.contents == 0            &&
+             ldt_info.read_exec_only == 1      &&
+             ldt_info.seg_32bit == 0           &&
+             ldt_info.limit_in_pages == 0      &&
+             ldt_info.seg_not_present == 1     &&
+             ldt_info.useable == 0 )) {
+            entry_1 = 0;
+            entry_2 = 0;
+            goto install;
+        }
+    }
+
+    entry_1 = ((ldt_info.base_addr & 0x0000ffff) << 16) |
+        (ldt_info.limit & 0x0ffff);
+    entry_2 = (ldt_info.base_addr & 0xff000000) |
+        ((ldt_info.base_addr & 0x00ff0000) >> 16) |
+        (ldt_info.limit & 0xf0000) |
+        ((ldt_info.read_exec_only ^ 1) << 9) |
+        (ldt_info.contents << 10) |
+        ((ldt_info.seg_not_present ^ 1) << 15) |
+        (ldt_info.seg_32bit << 22) |
+        (ldt_info.limit_in_pages << 23) |
+        0x7000;
+    if (!oldmode)
+        entry_2 |= (ldt_info.useable << 20);
+
+    /* Install the new entry ...  */
+ install:
+    HYPERVISOR_update_descriptor(phys_lp, entry_1, entry_2);
+    error = 0;
+
+ out_unlock:
+    up_write(&mm->mmap_sem);
+ out:
+    return error;
+}
+
+asmlinkage int sys_modify_ldt(int func, void *ptr, unsigned long bytecount)
+{
+    int ret = -ENOSYS;
+
+    switch (func) {
+    case 0:
+        ret = read_ldt(ptr, bytecount);
+        break;
+    case 1:
+        ret = write_ldt(ptr, bytecount, 1);
+        break;
+    case 2:
+        ret = read_default_ldt(ptr, bytecount);
+        break;
+    case 0x11:
+        ret = write_ldt(ptr, bytecount, 0);
+        break;
+    }
+    return ret;
+}
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/kernel/process.c b/xenolinux-2.4.22-sparse/arch/xeno/kernel/process.c
new file mode 100644 (file)
index 0000000..3b17c73
--- /dev/null
@@ -0,0 +1,489 @@
+/*
+ *  linux/arch/i386/kernel/process.c
+ *
+ *  Copyright (C) 1995  Linus Torvalds
+ *
+ *  Pentium III FXSR, SSE support
+ *     Gareth Hughes <gareth@valinux.com>, May 2000
+ */
+
+/*
+ * This file handles the architecture-dependent parts of process handling..
+ */
+
+#define __KERNEL_SYSCALLS__
+#include <stdarg.h>
+
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/smp.h>
+#include <linux/smp_lock.h>
+#include <linux/stddef.h>
+#include <linux/unistd.h>
+#include <linux/ptrace.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+#include <linux/user.h>
+#include <linux/a.out.h>
+#include <linux/interrupt.h>
+#include <linux/config.h>
+#include <linux/delay.h>
+#include <linux/reboot.h>
+#include <linux/init.h>
+#include <linux/mc146818rtc.h>
+
+#include <asm/uaccess.h>
+#include <asm/pgtable.h>
+#include <asm/system.h>
+#include <asm/io.h>
+#include <asm/ldt.h>
+#include <asm/processor.h>
+#include <asm/i387.h>
+#include <asm/desc.h>
+#include <asm/mmu_context.h>
+#include <asm/multicall.h>
+#include <asm/hypervisor-ifs/dom0_ops.h>
+
+#include <linux/irq.h>
+
+asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");
+
+int hlt_counter;
+
+/*
+ * Powermanagement idle function, if any..
+ */
+void (*pm_idle)(void);
+
+/*
+ * Power off function, if any
+ */
+void (*pm_power_off)(void);
+
+void disable_hlt(void)
+{
+    hlt_counter++;
+}
+
+void enable_hlt(void)
+{
+    hlt_counter--;
+}
+
+/*
+ * The idle thread. There's no useful work to be
+ * done, so just try to conserve power and have a
+ * low exit latency (ie sit in a loop waiting for
+ * somebody to say that they'd like to reschedule)
+ */
+void cpu_idle (void)
+{
+    /* endless idle loop with no priority at all */
+    init_idle();
+    current->nice = 20;
+    current->counter = -100;
+
+    while (1) {
+        while (!current->need_resched)
+            HYPERVISOR_yield();
+        schedule();
+        check_pgt_cache();
+    }
+}
+
+void machine_restart(char * __unused)
+{
+    HYPERVISOR_exit();
+}
+
+void machine_halt(void)
+{
+    HYPERVISOR_exit();
+}
+
+void machine_power_off(void)
+{
+    HYPERVISOR_exit();
+}
+
+extern void show_trace(unsigned long* esp);
+
+void show_regs(struct pt_regs * regs)
+{
+    printk("\n");
+    printk("Pid: %d, comm: %20s\n", current->pid, current->comm);
+    printk("EIP: %04x:[<%08lx>] CPU: %d",0xffff & regs->xcs,regs->eip, smp_processor_id());
+    if (regs->xcs & 2)
+        printk(" ESP: %04x:%08lx",0xffff & regs->xss,regs->esp);
+    printk(" EFLAGS: %08lx    %s\n",regs->eflags, print_tainted());
+    printk("EAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\n",
+           regs->eax,regs->ebx,regs->ecx,regs->edx);
+    printk("ESI: %08lx EDI: %08lx EBP: %08lx",
+           regs->esi, regs->edi, regs->ebp);
+    printk(" DS: %04x ES: %04x\n",
+           0xffff & regs->xds,0xffff & regs->xes);
+
+    show_trace(&regs->esp);
+}
+
+/*
+ * No need to lock the MM as we are the last user
+ */
+void release_segments(struct mm_struct *mm)
+{
+    void * ldt = mm->context.segments;
+
+    /*
+     * free the LDT
+     */
+    if (ldt) {
+        mm->context.segments = NULL;
+        clear_LDT();
+        make_pages_writeable(ldt, (LDT_ENTRIES*LDT_ENTRY_SIZE)/PAGE_SIZE);
+        flush_page_update_queue();
+        vfree(ldt);
+    }
+}
+
+/*
+ * Create a kernel thread
+ */
+int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
+{
+    long retval, d0;
+
+    __asm__ __volatile__(
+        "movl %%esp,%%esi\n\t"
+        "int $0x80\n\t"                /* Linux/i386 system call */
+        "cmpl %%esp,%%esi\n\t" /* child or parent? */
+        "je 1f\n\t"            /* parent - jump */
+        /* Load the argument into eax, and push it.  That way, it does
+         * not matter whether the called function is compiled with
+         * -mregparm or not.  */
+        "movl %4,%%eax\n\t"
+        "pushl %%eax\n\t"              
+        "call *%5\n\t"         /* call fn */
+        "movl %3,%0\n\t"       /* exit */
+        "int $0x80\n"
+        "1:\t"
+        :"=&a" (retval), "=&S" (d0)
+        :"0" (__NR_clone), "i" (__NR_exit),
+        "r" (arg), "r" (fn),
+        "b" (flags | CLONE_VM)
+        : "memory");
+
+    return retval;
+}
+
+/*
+ * Free current thread data structures etc..
+ */
+void exit_thread(void)
+{
+    /* nothing to do ... */
+}
+
+void flush_thread(void)
+{
+    struct task_struct *tsk = current;
+
+    memset(tsk->thread.debugreg, 0, sizeof(unsigned long)*8);
+
+    /*
+     * Forget coprocessor state..
+     */
+    clear_fpu(tsk);
+    tsk->used_math = 0;
+}
+
+void release_thread(struct task_struct *dead_task)
+{
+    if (dead_task->mm) {
+        void * ldt = dead_task->mm->context.segments;
+
+        // temporary debugging check
+        if (ldt) {
+            printk("WARNING: dead process %8s still has LDT? <%p>\n",
+                   dead_task->comm, ldt);
+            BUG();
+        }
+    }
+}
+
+/*
+ * we do not have to muck with descriptors here, that is
+ * done in switch_mm() as needed.
+ */
+void copy_segments(struct task_struct *p, struct mm_struct *new_mm)
+{
+    struct mm_struct * old_mm;
+    void *old_ldt, *ldt;
+
+    ldt = NULL;
+    old_mm = current->mm;
+    if (old_mm && (old_ldt = old_mm->context.segments) != NULL) {
+        /*
+         * Completely new LDT, we initialize it from the parent:
+         */
+        ldt = vmalloc(LDT_ENTRIES*LDT_ENTRY_SIZE);
+        if ( ldt == NULL )
+        {
+            printk(KERN_WARNING "ldt allocation failed\n");
+        }
+        else
+        {
+            memcpy(ldt, old_ldt, LDT_ENTRIES*LDT_ENTRY_SIZE);
+            make_pages_readonly(ldt, (LDT_ENTRIES*LDT_ENTRY_SIZE)/PAGE_SIZE);
+        }
+    }
+    new_mm->context.segments = ldt;
+    new_mm->context.cpuvalid = ~0UL;   /* valid on all CPU's - they can't have stale data */
+}
+
+/*
+ * Save a segment.
+ */
+#define savesegment(seg,value) \
+       asm volatile("movl %%" #seg ",%0":"=m" (*(int *)&(value)))
+
+int copy_thread(int nr, unsigned long clone_flags, unsigned long esp,
+                unsigned long unused,
+                struct task_struct * p, struct pt_regs * regs)
+{
+    struct pt_regs * childregs;
+    unsigned long eflags;
+
+    childregs = ((struct pt_regs *) (THREAD_SIZE + (unsigned long) p)) - 1;
+    struct_cpy(childregs, regs);
+    childregs->eax = 0;
+    childregs->esp = esp;
+
+    p->thread.esp = (unsigned long) childregs;
+    p->thread.esp0 = (unsigned long) (childregs+1);
+
+    p->thread.eip = (unsigned long) ret_from_fork;
+
+    savesegment(fs,p->thread.fs);
+    savesegment(gs,p->thread.gs);
+
+    unlazy_fpu(current);
+    struct_cpy(&p->thread.i387, &current->thread.i387);
+
+
+    __asm__ __volatile__ ( "pushfl; popl %0" : "=r" (eflags) : );
+    p->thread.io_pl = (eflags >> 12) & 3;
+
+    return 0;
+}
+
+/*
+ * fill in the user structure for a core dump..
+ */
+void dump_thread(struct pt_regs * regs, struct user * dump)
+{
+    int i;
+
+/* changed the size calculations - should hopefully work better. lbt */
+    dump->magic = CMAGIC;
+    dump->start_code = 0;
+    dump->start_stack = regs->esp & ~(PAGE_SIZE - 1);
+    dump->u_tsize = ((unsigned long) current->mm->end_code) >> PAGE_SHIFT;
+    dump->u_dsize = ((unsigned long) (current->mm->brk + (PAGE_SIZE-1))) >> PAGE_SHIFT;
+    dump->u_dsize -= dump->u_tsize;
+    dump->u_ssize = 0;
+    for (i = 0; i < 8; i++)
+        dump->u_debugreg[i] = current->thread.debugreg[i];  
+
+    if (dump->start_stack < TASK_SIZE)
+        dump->u_ssize = ((unsigned long) (TASK_SIZE - dump->start_stack)) >> PAGE_SHIFT;
+
+    dump->regs.ebx = regs->ebx;
+    dump->regs.ecx = regs->ecx;
+    dump->regs.edx = regs->edx;
+    dump->regs.esi = regs->esi;
+    dump->regs.edi = regs->edi;
+    dump->regs.ebp = regs->ebp;
+    dump->regs.eax = regs->eax;
+    dump->regs.ds = regs->xds;
+    dump->regs.es = regs->xes;
+    savesegment(fs,dump->regs.fs);
+    savesegment(gs,dump->regs.gs);
+    dump->regs.orig_eax = regs->orig_eax;
+    dump->regs.eip = regs->eip;
+    dump->regs.cs = regs->xcs;
+    dump->regs.eflags = regs->eflags;
+    dump->regs.esp = regs->esp;
+    dump->regs.ss = regs->xss;
+
+    dump->u_fpvalid = dump_fpu (regs, &dump->i387);
+}
+
+/*
+ *     switch_to(x,yn) should switch tasks from x to y.
+ *
+ * We fsave/fwait so that an exception goes off at the right time
+ * (as a call from the fsave or fwait in effect) rather than to
+ * the wrong process. Lazy FP saving no longer makes any sense
+ * with modern CPU's, and this simplifies a lot of things (SMP
+ * and UP become the same).
+ *
+ * NOTE! We used to use the x86 hardware context switching. The
+ * reason for not using it any more becomes apparent when you
+ * try to recover gracefully from saved state that is no longer
+ * valid (stale segment register values in particular). With the
+ * hardware task-switch, there is no way to fix up bad state in
+ * a reasonable manner.
+ *
+ * The fact that Intel documents the hardware task-switching to
+ * be slow is a fairly red herring - this code is not noticeably
+ * faster. However, there _is_ some room for improvement here,
+ * so the performance issues may eventually be a valid point.
+ * More important, however, is the fact that this allows us much
+ * more flexibility.
+ */
+void __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
+{
+    struct thread_struct *next = &next_p->thread;
+
+    __cli();
+
+    MULTICALL_flush_page_update_queue();
+
+    /*
+     * This is basically 'unlazy_fpu', except that we queue a multicall to 
+     * indicate FPU task switch, rather than synchronously trapping to Xen.
+     */
+    if ( prev_p->flags & PF_USEDFPU )
+    {
+       if ( cpu_has_fxsr )
+            asm volatile( "fxsave %0 ; fnclex"
+                          : "=m" (prev_p->thread.i387.fxsave) );
+       else
+            asm volatile( "fnsave %0 ; fwait"
+                          : "=m" (prev_p->thread.i387.fsave) );
+       prev_p->flags &= ~PF_USEDFPU;
+        queue_multicall0(__HYPERVISOR_fpu_taskswitch);
+    }
+
+    queue_multicall2(__HYPERVISOR_stack_switch, __KERNEL_DS, next->esp0);
+    if ( start_info.flags & SIF_PRIVILEGED ) 
+    {
+        dom0_op_t op;
+        op.cmd           = DOM0_IOPL;
+        op.u.iopl.domain = start_info.dom_id;
+        op.u.iopl.iopl   = next->io_pl;
+        queue_multicall1(__HYPERVISOR_dom0_op, (unsigned long)&op);
+    }
+
+    /* EXECUTE ALL TASK SWITCH XEN SYSCALLS AT THIS POINT. */
+    execute_multicall_list();
+    __sti();
+
+    /*
+     * Restore %fs and %gs.
+     */
+    loadsegment(fs, next->fs);
+    loadsegment(gs, next->gs);
+
+    /*
+     * Now maybe reload the debug registers
+     */
+    if ( next->debugreg[7] != 0 )
+    {
+        HYPERVISOR_set_debugreg(0, next->debugreg[0]);
+        HYPERVISOR_set_debugreg(1, next->debugreg[1]);
+        HYPERVISOR_set_debugreg(2, next->debugreg[2]);
+        HYPERVISOR_set_debugreg(3, next->debugreg[3]);
+        /* no 4 and 5 */
+        HYPERVISOR_set_debugreg(6, next->debugreg[6]);
+        HYPERVISOR_set_debugreg(7, next->debugreg[7]);
+    }
+}
+
+asmlinkage int sys_fork(struct pt_regs regs)
+{
+    return do_fork(SIGCHLD, regs.esp, &regs, 0);
+}
+
+asmlinkage int sys_clone(struct pt_regs regs)
+{
+    unsigned long clone_flags;
+    unsigned long newsp;
+
+    clone_flags = regs.ebx;
+    newsp = regs.ecx;
+    if (!newsp)
+        newsp = regs.esp;
+    return do_fork(clone_flags, newsp, &regs, 0);
+}
+
+/*
+ * This is trivial, and on the face of it looks like it
+ * could equally well be done in user mode.
+ *
+ * Not so, for quite unobvious reasons - register pressure.
+ * In user mode vfork() cannot have a stack frame, and if
+ * done by calling the "clone()" system call directly, you
+ * do not have enough call-clobbered registers to hold all
+ * the information you need.
+ */
+asmlinkage int sys_vfork(struct pt_regs regs)
+{
+    return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs.esp, &regs, 0);
+}
+
+/*
+ * sys_execve() executes a new program.
+ */
+asmlinkage int sys_execve(struct pt_regs regs)
+{
+    int error;
+    char * filename;
+
+    filename = getname((char *) regs.ebx);
+    error = PTR_ERR(filename);
+    if (IS_ERR(filename))
+        goto out;
+    error = do_execve(filename, (char **) regs.ecx, (char **) regs.edx, &regs);
+    if (error == 0)
+        current->ptrace &= ~PT_DTRACE;
+    putname(filename);
+ out:
+    return error;
+}
+
+/*
+ * These bracket the sleeping functions..
+ */
+extern void scheduling_functions_start_here(void);
+extern void scheduling_functions_end_here(void);
+#define first_sched    ((unsigned long) scheduling_functions_start_here)
+#define last_sched     ((unsigned long) scheduling_functions_end_here)
+
+unsigned long get_wchan(struct task_struct *p)
+{
+    unsigned long ebp, esp, eip;
+    unsigned long stack_page;
+    int count = 0;
+    if (!p || p == current || p->state == TASK_RUNNING)
+        return 0;
+    stack_page = (unsigned long)p;
+    esp = p->thread.esp;
+    if (!stack_page || esp < stack_page || esp > 8188+stack_page)
+        return 0;
+    /* include/asm-i386/system.h:switch_to() pushes ebp last. */
+    ebp = *(unsigned long *) esp;
+    do {
+        if (ebp < stack_page || ebp > 8184+stack_page)
+            return 0;
+        eip = *(unsigned long *) (ebp+4);
+        if (eip < first_sched || eip >= last_sched)
+            return eip;
+        ebp = *(unsigned long *) ebp;
+    } while (count++ < 16);
+    return 0;
+}
+#undef last_sched
+#undef first_sched
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/kernel/setup.c b/xenolinux-2.4.22-sparse/arch/xeno/kernel/setup.c
new file mode 100644 (file)
index 0000000..b2532d7
--- /dev/null
@@ -0,0 +1,1046 @@
+/*
+ *  linux/arch/i386/kernel/setup.c
+ *
+ *  Copyright (C) 1995  Linus Torvalds
+ */
+
+/*
+ * This file handles the architecture-dependent parts of initialization
+ */
+
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/stddef.h>
+#include <linux/unistd.h>
+#include <linux/ptrace.h>
+#include <linux/slab.h>
+#include <linux/user.h>
+#include <linux/a.out.h>
+#include <linux/tty.h>
+#include <linux/ioport.h>
+#include <linux/delay.h>
+#include <linux/config.h>
+#include <linux/init.h>
+#include <linux/apm_bios.h>
+#ifdef CONFIG_BLK_DEV_RAM
+#include <linux/blk.h>
+#endif
+#include <linux/highmem.h>
+#include <linux/bootmem.h>
+#include <linux/seq_file.h>
+#include <asm/processor.h>
+#include <linux/console.h>
+#include <linux/module.h>
+#include <asm/mtrr.h>
+#include <asm/uaccess.h>
+#include <asm/system.h>
+#include <asm/io.h>
+#include <asm/smp.h>
+#include <asm/msr.h>
+#include <asm/desc.h>
+#include <asm/dma.h>
+#include <asm/mpspec.h>
+#include <asm/mmu_context.h>
+#include <asm/hypervisor.h>
+#include <asm/hypervisor-ifs/dom0_ops.h>
+
+shared_info_t *HYPERVISOR_shared_info;
+
+unsigned long *phys_to_machine_mapping;
+
+/*
+ * Machine setup..
+ */
+
+char ignore_irq13;             /* set if exception 16 works */
+struct cpuinfo_x86 boot_cpu_data = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
+
+unsigned long mmu_cr4_features;
+//EXPORT_SYMBOL(mmu_cr4_features);
+
+unsigned char * vgacon_mmap;
+
+/*
+ * Bus types ..
+ */
+#ifdef CONFIG_EISA
+int EISA_bus;
+#endif
+int MCA_bus;
+
+/* for MCA, but anyone else can use it if they want */
+unsigned int machine_id;
+unsigned int machine_submodel_id;
+unsigned int BIOS_revision;
+unsigned int mca_pentium_flag;
+
+/* For PCI or other memory-mapped resources */
+unsigned long pci_mem_start = 0x10000000;
+
+/*
+ * Setup options
+ */
+struct drive_info_struct { char dummy[32]; } drive_info;
+struct screen_info screen_info;
+struct apm_info apm_info;
+struct sys_desc_table_struct {
+    unsigned short length;
+    unsigned char table[0];
+};
+
+unsigned char aux_device_present;
+
+extern int root_mountflags;
+extern char _text, _etext, _edata, _end;
+
+int enable_acpi_smp_table;
+
+/* Raw start-of-day parameters from the hypervisor. */
+union start_info_union start_info_union;
+
+#define COMMAND_LINE_SIZE 256
+static char command_line[COMMAND_LINE_SIZE];
+char saved_command_line[COMMAND_LINE_SIZE];
+
+static void __init parse_mem_cmdline (char ** cmdline_p)
+{
+    char c = ' ', *to = command_line, *from = saved_command_line;
+    int len = 0;
+
+    /* Save unparsed command line copy for /proc/cmdline */
+    memcpy(saved_command_line, start_info.cmd_line, COMMAND_LINE_SIZE);
+    saved_command_line[COMMAND_LINE_SIZE-1] = '\0';
+
+    for (;;) {
+        /*
+         * "mem=nopentium" disables the 4MB page tables.
+         * "mem=XXX[kKmM]" defines a memory region from HIGH_MEM
+         * to <mem>, overriding the bios size.
+         * "mem=XXX[KkmM]@XXX[KkmM]" defines a memory region from
+         * <start> to <start>+<mem>, overriding the bios size.
+         */
+        if (c == ' ' && !memcmp(from, "mem=", 4)) {
+            if (to != command_line)
+                to--;
+            if (!memcmp(from+4, "nopentium", 9)) {
+                from += 9+4;
+            } else if (!memcmp(from+4, "exactmap", 8)) {
+                from += 8+4;
+            } else {
+                (void)memparse(from+4, &from);
+                if (*from == '@')
+                    (void)memparse(from+1, &from);
+            }
+        }
+
+        c = *(from++);
+        if (!c)
+            break;
+        if (COMMAND_LINE_SIZE <= ++len)
+            break;
+        *(to++) = c;
+    }
+    *to = '\0';
+    *cmdline_p = command_line;
+}
+
+void __init setup_arch(char **cmdline_p)
+{
+    unsigned long start_pfn, max_pfn, max_low_pfn;
+    unsigned long bootmap_size;
+    unsigned long i;
+
+    extern void hypervisor_callback(void);
+    extern void failsafe_callback(void);
+
+    extern unsigned long cpu0_pte_quicklist[];
+    extern unsigned long cpu0_pgd_quicklist[];
+
+    HYPERVISOR_set_callbacks(
+        __KERNEL_CS, (unsigned long)hypervisor_callback,
+        __KERNEL_CS, (unsigned long)failsafe_callback);
+
+    boot_cpu_data.pgd_quick = cpu0_pgd_quicklist;
+    boot_cpu_data.pte_quick = cpu0_pte_quicklist;
+
+    ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
+    memset(&drive_info, 0, sizeof(drive_info));
+    memset(&screen_info, 0, sizeof(screen_info));
+    
+    /* This is drawn from a dump from vgacon:startup in standard Linux. */
+    screen_info.orig_video_mode = 3; 
+    screen_info.orig_video_isVGA = 1;
+    screen_info.orig_video_lines = 25;
+    screen_info.orig_video_cols = 80;
+    screen_info.orig_video_ega_bx = 3;
+    screen_info.orig_video_points = 16;
+
+    memset(&apm_info.bios, 0, sizeof(apm_info.bios));
+    aux_device_present = 0; 
+#ifdef CONFIG_BLK_DEV_RAM
+    rd_image_start = 0;
+    rd_prompt = 0;
+    rd_doload = 0;
+#endif
+
+    root_mountflags &= ~MS_RDONLY;
+    init_mm.start_code = (unsigned long) &_text;
+    init_mm.end_code = (unsigned long) &_etext;
+    init_mm.end_data = (unsigned long) &_edata;
+    init_mm.brk = (unsigned long) &_end;
+
+    parse_mem_cmdline(cmdline_p);
+
+#define PFN_UP(x)      (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
+#define PFN_DOWN(x)    ((x) >> PAGE_SHIFT)
+#define PFN_PHYS(x)    ((x) << PAGE_SHIFT)
+
+/*
+ * 128MB for vmalloc and initrd
+ */
+#define VMALLOC_RESERVE        (unsigned long)(128 << 20)
+#define MAXMEM         (unsigned long)(HYPERVISOR_VIRT_START-PAGE_OFFSET-VMALLOC_RESERVE)
+#define MAXMEM_PFN     PFN_DOWN(MAXMEM)
+#define MAX_NONPAE_PFN (1 << 20)
+
+    /*
+     * partially used pages are not usable - thus
+     * we are rounding upwards:
+     */
+#ifdef CONFIG_BLK_DEV_INITRD
+    if ( start_info.mod_start )
+        start_pfn = PFN_UP(__pa(start_info.mod_start + start_info.mod_len));
+    else
+#endif
+    start_pfn = PFN_UP(__pa(&_end));
+    max_pfn = start_info.nr_pages;
+
+    /*
+     * Determine low and high memory ranges:
+     */
+    max_low_pfn = max_pfn;
+    if (max_low_pfn > MAXMEM_PFN) {
+        max_low_pfn = MAXMEM_PFN;
+#ifndef CONFIG_HIGHMEM
+        /* Maximum memory usable is what is directly addressable */
+        printk(KERN_WARNING "Warning only %ldMB will be used.\n",
+               MAXMEM>>20);
+        if (max_pfn > MAX_NONPAE_PFN)
+            printk(KERN_WARNING "Use a PAE enabled kernel.\n");
+        else
+            printk(KERN_WARNING "Use a HIGHMEM enabled kernel.\n");
+#else /* !CONFIG_HIGHMEM */
+#ifndef CONFIG_X86_PAE
+        if (max_pfn > MAX_NONPAE_PFN) {
+            max_pfn = MAX_NONPAE_PFN;
+            printk(KERN_WARNING "Warning only 4GB will be used.\n");
+            printk(KERN_WARNING "Use a PAE enabled kernel.\n");
+        }
+#endif /* !CONFIG_X86_PAE */
+#endif /* !CONFIG_HIGHMEM */
+    }
+
+#ifdef CONFIG_HIGHMEM
+    highstart_pfn = highend_pfn = max_pfn;
+    if (max_pfn > MAXMEM_PFN) {
+        highstart_pfn = MAXMEM_PFN;
+        printk(KERN_NOTICE "%ldMB HIGHMEM available.\n",
+               pages_to_mb(highend_pfn - highstart_pfn));
+    }
+#endif
+
+    /*
+     * Initialize the boot-time allocator, and free up all RAM.
+     * Then reserve space for OS image, and the bootmem bitmap.
+     */
+    bootmap_size = init_bootmem(start_pfn, max_low_pfn);
+    free_bootmem(0, PFN_PHYS(max_low_pfn));
+    reserve_bootmem(0, PFN_PHYS(start_pfn) + bootmap_size + PAGE_SIZE-1);
+
+    /* Now reserve space for the hypervisor-provided page tables. */
+    {
+        unsigned long *pgd = (unsigned long *)start_info.pt_base;
+        unsigned long  pte;
+        int i;
+        reserve_bootmem(__pa(pgd), PAGE_SIZE);
+        for ( i = 0; i < (HYPERVISOR_VIRT_START>>22); i++ )
+        {
+            unsigned long pgde = *pgd++;
+            if ( !(pgde & 1) ) continue;
+            pte = machine_to_phys(pgde & PAGE_MASK);
+            reserve_bootmem(pte, PAGE_SIZE);
+        }
+    }
+    cur_pgd = init_mm.pgd = (pgd_t *)start_info.pt_base;
+
+    /* Now initialise the physical->machine mapping table. */
+    phys_to_machine_mapping = alloc_bootmem(max_pfn * sizeof(unsigned long));
+    for ( i = 0; i < max_pfn; i++ )
+    {
+        unsigned long pgde, *ppte;
+        unsigned long pfn = i + (PAGE_OFFSET >> PAGE_SHIFT);
+        pgde = *((unsigned long *)start_info.pt_base + (pfn >> 10));
+        ppte = (unsigned long *)machine_to_phys(pgde & PAGE_MASK) + (pfn&1023);
+        phys_to_machine_mapping[i] = 
+            (*(unsigned long *)__va(ppte)) >> PAGE_SHIFT;
+    }
+
+#ifdef CONFIG_BLK_DEV_INITRD
+    if (start_info.mod_start) {
+        if ((__pa(start_info.mod_start) + start_info.mod_len) <= 
+            (max_low_pfn << PAGE_SHIFT)) {
+            initrd_start = start_info.mod_start;
+            initrd_end   = initrd_start + start_info.mod_len;
+            initrd_below_start_ok = 1;
+        }
+        else {
+            printk(KERN_ERR "initrd extends beyond end of memory "
+                   "(0x%08lx > 0x%08lx)\ndisabling initrd\n",
+                   __pa(start_info.mod_start) + start_info.mod_len,
+                   max_low_pfn << PAGE_SHIFT);
+            initrd_start = 0;
+        }
+    }
+#endif
+
+    paging_init();
+
+    /* We are privileged guest os - should have IO privileges. */
+    if ( start_info.flags & SIF_PRIVILEGED ) 
+    {
+        dom0_op_t op;
+        op.cmd           = DOM0_IOPL;
+        op.u.iopl.domain = start_info.dom_id;
+        op.u.iopl.iopl   = 1;
+        if( HYPERVISOR_dom0_op(&op) != 0 )
+            panic("Unable to obtain IOPL, despite being SIF_PRIVILEGED");
+        current->thread.io_pl = 1;
+    }
+
+    if(start_info.flags & SIF_CONSOLE)
+    {
+        if( !(start_info.flags & SIF_PRIVILEGED) )
+            panic("Xen granted us console access but not privileged status");
+
+#if defined(CONFIG_VT)
+#if defined(CONFIG_VGA_CONSOLE)
+        conswitchp = &vga_con;
+#elif defined(CONFIG_DUMMY_CONSOLE)
+        conswitchp = &dummy_con;
+#endif
+#endif
+    }
+}
+
+static int cachesize_override __initdata = -1;
+static int __init cachesize_setup(char *str)
+{
+    get_option (&str, &cachesize_override);
+    return 1;
+}
+__setup("cachesize=", cachesize_setup);
+
+
+static int __init get_model_name(struct cpuinfo_x86 *c)
+{
+    unsigned int *v;
+    char *p, *q;
+
+    if (cpuid_eax(0x80000000) < 0x80000004)
+        return 0;
+
+    v = (unsigned int *) c->x86_model_id;
+    cpuid(0x80000002, &v[0], &v[1], &v[2], &v[3]);
+    cpuid(0x80000003, &v[4], &v[5], &v[6], &v[7]);
+    cpuid(0x80000004, &v[8], &v[9], &v[10], &v[11]);
+    c->x86_model_id[48] = 0;
+
+    /* Intel chips right-justify this string for some dumb reason;
+       undo that brain damage */
+    p = q = &c->x86_model_id[0];
+    while ( *p == ' ' )
+        p++;
+    if ( p != q ) {
+        while ( *p )
+            *q++ = *p++;
+        while ( q <= &c->x86_model_id[48] )
+            *q++ = '\0';       /* Zero-pad the rest */
+    }
+
+    return 1;
+}
+
+
+static void __init display_cacheinfo(struct cpuinfo_x86 *c)
+{
+    unsigned int n, dummy, ecx, edx, l2size;
+
+    n = cpuid_eax(0x80000000);
+
+    if (n >= 0x80000005) {
+        cpuid(0x80000005, &dummy, &dummy, &ecx, &edx);
+        printk(KERN_INFO "CPU: L1 I Cache: %dK (%d bytes/line), D cache %dK (%d bytes/line)\n",
+               edx>>24, edx&0xFF, ecx>>24, ecx&0xFF);
+        c->x86_cache_size=(ecx>>24)+(edx>>24); 
+    }
+
+    if (n < 0x80000006)        /* Some chips just has a large L1. */
+        return;
+
+    ecx = cpuid_ecx(0x80000006);
+    l2size = ecx >> 16;
+
+    /* AMD errata T13 (order #21922) */
+    if ((c->x86_vendor == X86_VENDOR_AMD) && (c->x86 == 6)) {
+        if (c->x86_model == 3 && c->x86_mask == 0)     /* Duron Rev A0 */
+            l2size = 64;
+        if (c->x86_model == 4 &&
+            (c->x86_mask==0 || c->x86_mask==1))        /* Tbird rev A1/A2 */
+            l2size = 256;
+    }
+
+    /* Intel PIII Tualatin. This comes in two flavours.
+     * One has 256kb of cache, the other 512. We have no way
+     * to determine which, so we use a boottime override
+     * for the 512kb model, and assume 256 otherwise.
+     */
+    if ((c->x86_vendor == X86_VENDOR_INTEL) && (c->x86 == 6) &&
+        (c->x86_model == 11) && (l2size == 0))
+        l2size = 256;
+
+    if (c->x86_vendor == X86_VENDOR_CENTAUR) {
+       /* VIA C3 CPUs (670-68F) need further shifting. */
+       if ((c->x86 == 6) &&
+           ((c->x86_model == 7) || (c->x86_model == 8))) {
+               l2size >>= 8;
+       }
+
+       /* VIA also screwed up Nehemiah stepping 1, and made
+          it return '65KB' instead of '64KB'
+          - Note, it seems this may only be in engineering samples. */
+       if ((c->x86==6) && (c->x86_model==9) &&
+           (c->x86_mask==1) && (l2size==65))
+               l2size -= 1;
+    }
+
+    /* Allow user to override all this if necessary. */
+    if (cachesize_override != -1)
+        l2size = cachesize_override;
+
+    if ( l2size == 0 )
+        return;                /* Again, no L2 cache is possible */
+
+    c->x86_cache_size = l2size;
+
+    printk(KERN_INFO "CPU: L2 Cache: %dK (%d bytes/line)\n",
+           l2size, ecx & 0xFF);
+}
+
+
+static int __init init_amd(struct cpuinfo_x86 *c)
+{
+    int r;
+
+    /* Bit 31 in normal CPUID used for nonstandard 3DNow ID;
+       3DNow is IDd by bit 31 in extended CPUID (1*32+31) anyway */
+    clear_bit(0*32+31, &c->x86_capability);
+       
+    r = get_model_name(c);
+
+    switch(c->x86)
+    {
+    case 6:    /* An Athlon/Duron. We can trust the BIOS probably */
+        break;         
+    default:
+        panic("Unsupported AMD processor\n");
+    }
+
+    display_cacheinfo(c);
+    return r;
+}
+
+
+static void __init init_intel(struct cpuinfo_x86 *c)
+{
+    char *p = NULL;
+    unsigned int l1i = 0, l1d = 0, l2 = 0, l3 = 0; /* Cache sizes */
+
+    if (c->cpuid_level > 1) {
+        /* supports eax=2  call */
+        int i, j, n;
+        int regs[4];
+        unsigned char *dp = (unsigned char *)regs;
+
+        /* Number of times to iterate */
+        n = cpuid_eax(2) & 0xFF;
+
+        for ( i = 0 ; i < n ; i++ ) {
+            cpuid(2, &regs[0], &regs[1], &regs[2], &regs[3]);
+                       
+            /* If bit 31 is set, this is an unknown format */
+            for ( j = 0 ; j < 3 ; j++ ) {
+                if ( regs[j] < 0 ) regs[j] = 0;
+            }
+
+            /* Byte 0 is level count, not a descriptor */
+            for ( j = 1 ; j < 16 ; j++ ) {
+                unsigned char des = dp[j];
+                unsigned char dl, dh;
+                unsigned int cs;
+
+                dh = des >> 4;
+                dl = des & 0x0F;
+
+                               /* Black magic... */
+
+                switch ( dh )
+                {
+                case 0:
+                    switch ( dl ) {
+                    case 6:
+                        /* L1 I cache */
+                        l1i += 8;
+                        break;
+                    case 8:
+                        /* L1 I cache */
+                        l1i += 16;
+                        break;
+                    case 10:
+                        /* L1 D cache */
+                        l1d += 8;
+                        break;
+                    case 12:
+                        /* L1 D cache */
+                        l1d += 16;
+                        break;
+                    default:;
+                        /* TLB, or unknown */
+                    }
+                    break;
+                case 2:
+                    if ( dl ) {
+                        /* L3 cache */
+                        cs = (dl-1) << 9;
+                        l3 += cs;
+                    }
+                    break;
+                case 4:
+                    if ( c->x86 > 6 && dl ) {
+                        /* P4 family */
+                        /* L3 cache */
+                        cs = 128 << (dl-1);
+                        l3 += cs;
+                        break;
+                    }
+                    /* else same as 8 - fall through */
+                case 8:
+                    if ( dl ) {
+                        /* L2 cache */
+                        cs = 128 << (dl-1);
+                        l2 += cs;
+                    }
+                    break;
+                case 6:
+                    if (dl > 5) {
+                        /* L1 D cache */
+                        cs = 8<<(dl-6);
+                        l1d += cs;
+                    }
+                    break;
+                case 7:
+                    if ( dl >= 8 ) 
+                    {
+                        /* L2 cache */
+                        cs = 64<<(dl-8);
+                        l2 += cs;
+                    } else {
+                        /* L0 I cache, count as L1 */
+                        cs = dl ? (16 << (dl-1)) : 12;
+                        l1i += cs;
+                    }
+                    break;
+                default:
+                    /* TLB, or something else we don't know about */
+                    break;
+                }
+            }
+        }
+        if ( l1i || l1d )
+            printk(KERN_INFO "CPU: L1 I cache: %dK, L1 D cache: %dK\n",
+                   l1i, l1d);
+        if ( l2 )
+            printk(KERN_INFO "CPU: L2 cache: %dK\n", l2);
+        if ( l3 )
+            printk(KERN_INFO "CPU: L3 cache: %dK\n", l3);
+
+        /*
+         * This assumes the L3 cache is shared; it typically lives in
+         * the northbridge.  The L1 caches are included by the L2
+         * cache, and so should not be included for the purpose of
+         * SMP switching weights.
+         */
+        c->x86_cache_size = l2 ? l2 : (l1i+l1d);
+    }
+
+    /* SEP CPUID bug: Pentium Pro reports SEP but doesn't have it */
+    if ( c->x86 == 6 && c->x86_model < 3 && c->x86_mask < 3 )
+        clear_bit(X86_FEATURE_SEP, &c->x86_capability);
+       
+    /* Names for the Pentium II/Celeron processors 
+       detectable only by also checking the cache size.
+       Dixon is NOT a Celeron. */
+    if (c->x86 == 6) {
+        switch (c->x86_model) {
+        case 5:
+            if (l2 == 0)
+                p = "Celeron (Covington)";
+            if (l2 == 256)
+                p = "Mobile Pentium II (Dixon)";
+            break;
+                       
+        case 6:
+            if (l2 == 128)
+                p = "Celeron (Mendocino)";
+            break;
+                       
+        case 8:
+            if (l2 == 128)
+                p = "Celeron (Coppermine)";
+            break;
+        }
+    }
+
+    if ( p )
+        strcpy(c->x86_model_id, p);
+}
+
+void __init get_cpu_vendor(struct cpuinfo_x86 *c)
+{
+    char *v = c->x86_vendor_id;
+
+    if (!strcmp(v, "GenuineIntel"))
+        c->x86_vendor = X86_VENDOR_INTEL;
+    else if (!strcmp(v, "AuthenticAMD"))
+        c->x86_vendor = X86_VENDOR_AMD;
+    else
+        c->x86_vendor = X86_VENDOR_UNKNOWN;
+}
+
+struct cpu_model_info {
+    int vendor;
+    int family;
+    char *model_names[16];
+};
+
+/* Naming convention should be: <Name> [(<Codename>)] */
+/* This table only is used unless init_<vendor>() below doesn't set it; */
+/* in particular, if CPUID levels 0x80000002..4 are supported, this isn't used */
+static struct cpu_model_info cpu_models[] __initdata = {
+    { X86_VENDOR_INTEL,        6,
+      { "Pentium Pro A-step", "Pentium Pro", NULL, "Pentium II (Klamath)", 
+        NULL, "Pentium II (Deschutes)", "Mobile Pentium II",
+        "Pentium III (Katmai)", "Pentium III (Coppermine)", NULL,
+        "Pentium III (Cascades)", NULL, NULL, NULL, NULL }},
+    { X86_VENDOR_AMD,  6, /* Is this this really necessary?? */
+      { "Athlon", "Athlon",
+        "Athlon", NULL, "Athlon", NULL,
+        NULL, NULL, NULL,
+        NULL, NULL, NULL, NULL, NULL, NULL, NULL }}
+};
+
+/* Look up CPU names by table lookup. */
+static char __init *table_lookup_model(struct cpuinfo_x86 *c)
+{
+    struct cpu_model_info *info = cpu_models;
+    int i;
+
+    if ( c->x86_model >= 16 )
+        return NULL;   /* Range check */
+
+    for ( i = 0 ; i < sizeof(cpu_models)/sizeof(struct cpu_model_info) ; i++ ) {
+        if ( info->vendor == c->x86_vendor &&
+             info->family == c->x86 ) {
+            return info->model_names[c->x86_model];
+        }
+        info++;
+    }
+    return NULL;               /* Not found */
+}
+
+
+
+/* Standard macro to see if a specific flag is changeable */
+static inline int flag_is_changeable_p(u32 flag)
+{
+    u32 f1, f2;
+
+    asm("pushfl\n\t"
+        "pushfl\n\t"
+        "popl %0\n\t"
+        "movl %0,%1\n\t"
+        "xorl %2,%0\n\t"
+        "pushl %0\n\t"
+        "popfl\n\t"
+        "pushfl\n\t"
+        "popl %0\n\t"
+        "popfl\n\t"
+        : "=&r" (f1), "=&r" (f2)
+        : "ir" (flag));
+
+    return ((f1^f2) & flag) != 0;
+}
+
+
+/* Probe for the CPUID instruction */
+static int __init have_cpuid_p(void)
+{
+    return flag_is_changeable_p(X86_EFLAGS_ID);
+}
+
+
+
+/*
+ * This does the hard work of actually picking apart the CPU stuff...
+ */
+void __init identify_cpu(struct cpuinfo_x86 *c)
+{
+    int junk, i;
+    u32 xlvl, tfms;
+
+    c->loops_per_jiffy = loops_per_jiffy;
+    c->x86_cache_size = -1;
+    c->x86_vendor = X86_VENDOR_UNKNOWN;
+    c->cpuid_level = -1;       /* CPUID not detected */
+    c->x86_model = c->x86_mask = 0;    /* So far unknown... */
+    c->x86_vendor_id[0] = '\0'; /* Unset */
+    c->x86_model_id[0] = '\0';  /* Unset */
+    memset(&c->x86_capability, 0, sizeof c->x86_capability);
+    c->hard_math = 1;
+
+    if ( !have_cpuid_p() ) {
+        panic("Processor must support CPUID\n");
+    } else {
+        /* CPU does have CPUID */
+
+        /* Get vendor name */
+        cpuid(0x00000000, &c->cpuid_level,
+              (int *)&c->x86_vendor_id[0],
+              (int *)&c->x86_vendor_id[8],
+              (int *)&c->x86_vendor_id[4]);
+               
+        get_cpu_vendor(c);
+        /* Initialize the standard set of capabilities */
+        /* Note that the vendor-specific code below might override */
+
+        /* Intel-defined flags: level 0x00000001 */
+        if ( c->cpuid_level >= 0x00000001 ) {
+            cpuid(0x00000001, &tfms, &junk, &junk,
+                  &c->x86_capability[0]);
+            c->x86 = (tfms >> 8) & 15;
+            c->x86_model = (tfms >> 4) & 15;
+            c->x86_mask = tfms & 15;
+        } else {
+            /* Have CPUID level 0 only - unheard of */
+            c->x86 = 4;
+        }
+
+        /* AMD-defined flags: level 0x80000001 */
+        xlvl = cpuid_eax(0x80000000);
+        if ( (xlvl & 0xffff0000) == 0x80000000 ) {
+            if ( xlvl >= 0x80000001 )
+                c->x86_capability[1] = cpuid_edx(0x80000001);
+            if ( xlvl >= 0x80000004 )
+                get_model_name(c); /* Default name */
+        }
+
+        /* Transmeta-defined flags: level 0x80860001 */
+        xlvl = cpuid_eax(0x80860000);
+        if ( (xlvl & 0xffff0000) == 0x80860000 ) {
+            if (  xlvl >= 0x80860001 )
+                c->x86_capability[2] = cpuid_edx(0x80860001);
+        }
+    }
+
+    printk(KERN_DEBUG "CPU: Before vendor init, caps: %08x %08x %08x, vendor = %d\n",
+           c->x86_capability[0],
+           c->x86_capability[1],
+           c->x86_capability[2],
+           c->x86_vendor);
+
+    /*
+     * Vendor-specific initialization.  In this section we
+     * canonicalize the feature flags, meaning if there are
+     * features a certain CPU supports which CPUID doesn't
+     * tell us, CPUID claiming incorrect flags, or other bugs,
+     * we handle them here.
+     *
+     * At the end of this section, c->x86_capability better
+     * indicate the features this CPU genuinely supports!
+     */
+    switch ( c->x86_vendor ) {
+    case X86_VENDOR_AMD:
+        init_amd(c);
+        break;
+
+    case X86_VENDOR_INTEL:
+        init_intel(c);
+        break;
+
+    default:
+        panic("Unsupported CPU vendor\n");
+    }
+       
+    printk(KERN_DEBUG "CPU: After vendor init, caps: %08x %08x %08x %08x\n",
+           c->x86_capability[0],
+           c->x86_capability[1],
+           c->x86_capability[2],
+           c->x86_capability[3]);
+
+
+    /* If the model name is still unset, do table lookup. */
+    if ( !c->x86_model_id[0] ) {
+        char *p;
+        p = table_lookup_model(c);
+        if ( p )
+            strcpy(c->x86_model_id, p);
+        else
+            /* Last resort... */
+            sprintf(c->x86_model_id, "%02x/%02x",
+                    c->x86_vendor, c->x86_model);
+    }
+
+    /* Now the feature flags better reflect actual CPU features! */
+
+    printk(KERN_DEBUG "CPU:     After generic, caps: %08x %08x %08x %08x\n",
+           c->x86_capability[0],
+           c->x86_capability[1],
+           c->x86_capability[2],
+           c->x86_capability[3]);
+
+    /*
+     * On SMP, boot_cpu_data holds the common feature set between
+     * all CPUs; so make sure that we indicate which features are
+     * common between the CPUs.  The first time this routine gets
+     * executed, c == &boot_cpu_data.
+     */
+    if ( c != &boot_cpu_data ) {
+        /* AND the already accumulated flags with these */
+        for ( i = 0 ; i < NCAPINTS ; i++ )
+            boot_cpu_data.x86_capability[i] &= c->x86_capability[i];
+    }
+
+    printk(KERN_DEBUG "CPU:             Common caps: %08x %08x %08x %08x\n",
+           boot_cpu_data.x86_capability[0],
+           boot_cpu_data.x86_capability[1],
+           boot_cpu_data.x86_capability[2],
+           boot_cpu_data.x86_capability[3]);
+}
+
+
+/* These need to match <asm/processor.h> */
+static char *cpu_vendor_names[] __initdata = {
+    "Intel", "Cyrix", "AMD", "UMC", "NexGen", "Centaur", "Rise", "Transmeta" };
+
+
+void __init print_cpu_info(struct cpuinfo_x86 *c)
+{
+    char *vendor = NULL;
+
+    if (c->x86_vendor < sizeof(cpu_vendor_names)/sizeof(char *))
+        vendor = cpu_vendor_names[c->x86_vendor];
+    else if (c->cpuid_level >= 0)
+        vendor = c->x86_vendor_id;
+
+    if (vendor && strncmp(c->x86_model_id, vendor, strlen(vendor)))
+        printk("%s ", vendor);
+
+    if (!c->x86_model_id[0])
+        printk("%d86", c->x86);
+    else
+        printk("%s", c->x86_model_id);
+
+    if (c->x86_mask || c->cpuid_level >= 0) 
+        printk(" stepping %02x\n", c->x86_mask);
+    else
+        printk("\n");
+}
+
+/*
+ *     Get CPU information for use by the procfs.
+ */
+static int show_cpuinfo(struct seq_file *m, void *v)
+{
+    /* 
+     * These flag bits must match the definitions in <asm/cpufeature.h>.
+     * NULL means this bit is undefined or reserved; either way it doesn't
+     * have meaning as far as Linux is concerned.  Note that it's important
+     * to realize there is a difference between this table and CPUID -- if
+     * applications want to get the raw CPUID data, they should access
+     * /dev/cpu/<cpu_nr>/cpuid instead.
+        */
+    static char *x86_cap_flags[] = {
+        /* Intel-defined */
+        "fpu", "vme", "de", "pse", "tsc", "msr", "pae", "mce",
+        "cx8", "apic", NULL, "sep", "mtrr", "pge", "mca", "cmov",
+        "pat", "pse36", "pn", "clflush", NULL, "dts", "acpi", "mmx",
+        "fxsr", "sse", "sse2", "ss", NULL, "tm", "ia64", NULL,
+
+        /* AMD-defined */
+        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+        NULL, NULL, NULL, "syscall", NULL, NULL, NULL, NULL,
+        NULL, NULL, NULL, NULL, NULL, NULL, "mmxext", NULL,
+        NULL, NULL, NULL, NULL, NULL, "lm", "3dnowext", "3dnow",
+
+        /* Transmeta-defined */
+        "recovery", "longrun", NULL, "lrti", NULL, NULL, NULL, NULL,
+        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+        /* Other (Linux-defined) */
+        "cxmmx", "k6_mtrr", "cyrix_arr", "centaur_mcr", NULL, NULL, NULL, NULL,
+        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+        NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    };
+    struct cpuinfo_x86 *c = v;
+    int i, n = c - cpu_data;
+    int fpu_exception;
+
+#ifdef CONFIG_SMP
+    if (!(cpu_online_map & (1<<n)))
+        return 0;
+#endif
+    seq_printf(m, "processor\t: %d\n"
+               "vendor_id\t: %s\n"
+               "cpu family\t: %d\n"
+               "model\t\t: %d\n"
+               "model name\t: %s\n",
+               n,
+               c->x86_vendor_id[0] ? c->x86_vendor_id : "unknown",
+               c->x86,
+               c->x86_model,
+               c->x86_model_id[0] ? c->x86_model_id : "unknown");
+
+    if (c->x86_mask || c->cpuid_level >= 0)
+        seq_printf(m, "stepping\t: %d\n", c->x86_mask);
+    else
+        seq_printf(m, "stepping\t: unknown\n");
+
+    if ( test_bit(X86_FEATURE_TSC, &c->x86_capability) ) {
+        seq_printf(m, "cpu MHz\t\t: %lu.%03lu\n",
+                   cpu_khz / 1000, (cpu_khz % 1000));
+    }
+
+    /* Cache size */
+    if (c->x86_cache_size >= 0)
+        seq_printf(m, "cache size\t: %d KB\n", c->x86_cache_size);
+       
+       /* We use exception 16 if we have hardware math and we've either seen it or the CPU claims it is internal */
+    fpu_exception = c->hard_math && (ignore_irq13 || cpu_has_fpu);
+    seq_printf(m, "fdiv_bug\t: %s\n"
+               "hlt_bug\t\t: %s\n"
+               "f00f_bug\t: %s\n"
+               "coma_bug\t: %s\n"
+               "fpu\t\t: %s\n"
+               "fpu_exception\t: %s\n"
+               "cpuid level\t: %d\n"
+               "wp\t\t: %s\n"
+               "flags\t\t:",
+               c->fdiv_bug ? "yes" : "no",
+               c->hlt_works_ok ? "no" : "yes",
+               c->f00f_bug ? "yes" : "no",
+               c->coma_bug ? "yes" : "no",
+               c->hard_math ? "yes" : "no",
+               fpu_exception ? "yes" : "no",
+               c->cpuid_level,
+               c->wp_works_ok ? "yes" : "no");
+
+    for ( i = 0 ; i < 32*NCAPINTS ; i++ )
+        if ( test_bit(i, &c->x86_capability) &&
+             x86_cap_flags[i] != NULL )
+            seq_printf(m, " %s", x86_cap_flags[i]);
+
+    seq_printf(m, "\nbogomips\t: %lu.%02lu\n\n",
+               c->loops_per_jiffy/(500000/HZ),
+               (c->loops_per_jiffy/(5000/HZ)) % 100);
+    return 0;
+}
+
+static void *c_start(struct seq_file *m, loff_t *pos)
+{
+    return *pos < NR_CPUS ? cpu_data + *pos : NULL;
+}
+static void *c_next(struct seq_file *m, void *v, loff_t *pos)
+{
+    ++*pos;
+    return c_start(m, pos);
+}
+static void c_stop(struct seq_file *m, void *v)
+{
+}
+struct seq_operations cpuinfo_op = {
+    start:     c_start,
+    next:      c_next,
+    stop:      c_stop,
+    show:      show_cpuinfo,
+};
+
+unsigned long cpu_initialized __initdata = 0;
+
+/*
+ * cpu_init() initializes state that is per-CPU. Some data is already
+ * initialized (naturally) in the bootstrap process, such as the GDT
+ * and IDT. We reload them nevertheless, this function acts as a
+ * 'CPU state barrier', nothing should get across.
+ */
+void __init cpu_init (void)
+{
+    int nr = smp_processor_id();
+
+    if (test_and_set_bit(nr, &cpu_initialized)) {
+        printk(KERN_WARNING "CPU#%d already initialized!\n", nr);
+        for (;;) __sti();
+    }
+    printk(KERN_INFO "Initializing CPU#%d\n", nr);
+
+    /*
+     * set up and load the per-CPU TSS and LDT
+     */
+    atomic_inc(&init_mm.mm_count);
+    current->active_mm = &init_mm;
+    if(current->mm)
+        BUG();
+    enter_lazy_tlb(&init_mm, current, nr);
+
+    HYPERVISOR_stack_switch(__KERNEL_DS, current->thread.esp0);
+
+    load_LDT(&init_mm);
+    flush_page_update_queue();
+
+    /* Force FPU initialization. */
+    current->flags &= ~PF_USEDFPU;
+    current->used_math = 0;
+    stts();
+}
+
+
+/******************************************************************************
+ * Time-to-die callback handling.
+ */
+
+static void time_to_die(int irq, void *unused, struct pt_regs *regs)
+{
+    extern void ctrl_alt_del(void);
+    ctrl_alt_del();
+}
+
+static int __init setup_death_event(void)
+{
+    (void)request_irq(_EVENT_DIE, time_to_die, 0, "die", NULL);
+    return 0;
+}
+
+__initcall(setup_death_event);
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/kernel/signal.c b/xenolinux-2.4.22-sparse/arch/xeno/kernel/signal.c
new file mode 100644 (file)
index 0000000..f646c5c
--- /dev/null
@@ -0,0 +1,717 @@
+/*
+ *  linux/arch/i386/kernel/signal.c
+ *
+ *  Copyright (C) 1991, 1992  Linus Torvalds
+ *
+ *  1997-11-28  Modified for POSIX.1b signals by Richard Henderson
+ *  2000-06-20  Pentium III FXSR, SSE support by Gareth Hughes
+ */
+
+#include <linux/sched.h>
+#include <linux/mm.h>
+#include <linux/smp.h>
+#include <linux/smp_lock.h>
+#include <linux/kernel.h>
+#include <linux/signal.h>
+#include <linux/errno.h>
+#include <linux/wait.h>
+#include <linux/ptrace.h>
+#include <linux/unistd.h>
+#include <linux/stddef.h>
+#include <linux/tty.h>
+#include <linux/personality.h>
+#include <asm/ucontext.h>
+#include <asm/uaccess.h>
+#include <asm/i387.h>
+
+#define DEBUG_SIG 0
+
+#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
+
+int FASTCALL(do_signal(struct pt_regs *regs, sigset_t *oldset));
+
+int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from)
+{
+       if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t)))
+               return -EFAULT;
+       if (from->si_code < 0)
+               return __copy_to_user(to, from, sizeof(siginfo_t));
+       else {
+               int err;
+
+               /* If you change siginfo_t structure, please be sure
+                  this code is fixed accordingly.
+                  It should never copy any pad contained in the structure
+                  to avoid security leaks, but must copy the generic
+                  3 ints plus the relevant union member.  */
+               err = __put_user(from->si_signo, &to->si_signo);
+               err |= __put_user(from->si_errno, &to->si_errno);
+               err |= __put_user((short)from->si_code, &to->si_code);
+               /* First 32bits of unions are always present.  */
+               err |= __put_user(from->si_pid, &to->si_pid);
+               switch (from->si_code >> 16) {
+               case __SI_FAULT >> 16:
+                       break;
+               case __SI_CHLD >> 16:
+                       err |= __put_user(from->si_utime, &to->si_utime);
+                       err |= __put_user(from->si_stime, &to->si_stime);
+                       err |= __put_user(from->si_status, &to->si_status);
+               default:
+                       err |= __put_user(from->si_uid, &to->si_uid);
+                       break;
+               /* case __SI_RT: This is not generated by the kernel as of now.  */
+               }
+               return err;
+       }
+}
+
+/*
+ * Atomically swap in the new signal mask, and wait for a signal.
+ */
+asmlinkage int
+sys_sigsuspend(int history0, int history1, old_sigset_t mask)
+{
+       struct pt_regs * regs = (struct pt_regs *) &history0;
+       sigset_t saveset;
+
+       mask &= _BLOCKABLE;
+       spin_lock_irq(&current->sigmask_lock);
+       saveset = current->blocked;
+       siginitset(&current->blocked, mask);
+       recalc_sigpending(current);
+       spin_unlock_irq(&current->sigmask_lock);
+
+       regs->eax = -EINTR;
+       while (1) {
+               current->state = TASK_INTERRUPTIBLE;
+               schedule();
+               if (do_signal(regs, &saveset))
+                       return -EINTR;
+       }
+}
+
+asmlinkage int
+sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize)
+{
+       struct pt_regs * regs = (struct pt_regs *) &unewset;
+       sigset_t saveset, newset;
+
+       /* XXX: Don't preclude handling different sized sigset_t's.  */
+       if (sigsetsize != sizeof(sigset_t))
+               return -EINVAL;
+
+       if (copy_from_user(&newset, unewset, sizeof(newset)))
+               return -EFAULT;
+       sigdelsetmask(&newset, ~_BLOCKABLE);
+
+       spin_lock_irq(&current->sigmask_lock);
+       saveset = current->blocked;
+       current->blocked = newset;
+       recalc_sigpending(current);
+       spin_unlock_irq(&current->sigmask_lock);
+
+       regs->eax = -EINTR;
+       while (1) {
+               current->state = TASK_INTERRUPTIBLE;
+               schedule();
+               if (do_signal(regs, &saveset))
+                       return -EINTR;
+       }
+}
+
+asmlinkage int 
+sys_sigaction(int sig, const struct old_sigaction *act,
+             struct old_sigaction *oact)
+{
+       struct k_sigaction new_ka, old_ka;
+       int ret;
+
+       if (act) {
+               old_sigset_t mask;
+               if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
+                   __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
+                   __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
+                       return -EFAULT;
+               __get_user(new_ka.sa.sa_flags, &act->sa_flags);
+               __get_user(mask, &act->sa_mask);
+               siginitset(&new_ka.sa.sa_mask, mask);
+       }
+
+       ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
+
+       if (!ret && oact) {
+               if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
+                   __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
+                   __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
+                       return -EFAULT;
+               __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
+               __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
+       }
+
+       return ret;
+}
+
+asmlinkage int
+sys_sigaltstack(const stack_t *uss, stack_t *uoss)
+{
+       struct pt_regs *regs = (struct pt_regs *) &uss;
+       return do_sigaltstack(uss, uoss, regs->esp);
+}
+
+
+/*
+ * Do a signal return; undo the signal stack.
+ */
+
+struct sigframe
+{
+       char *pretcode;
+       int sig;
+       struct sigcontext sc;
+       struct _fpstate fpstate;
+       unsigned long extramask[_NSIG_WORDS-1];
+       char retcode[8];
+};
+
+struct rt_sigframe
+{
+       char *pretcode;
+       int sig;
+       struct siginfo *pinfo;
+       void *puc;
+       struct siginfo info;
+       struct ucontext uc;
+       struct _fpstate fpstate;
+       char retcode[8];
+};
+
+static int
+restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc, int *peax)
+{
+       unsigned int err = 0;
+
+#define COPY(x)                err |= __get_user(regs->x, &sc->x)
+
+#define COPY_SEG(seg)                                                  \
+       { unsigned short tmp;                                           \
+         err |= __get_user(tmp, &sc->seg);                             \
+         regs->x##seg = tmp; }
+
+#define COPY_SEG_STRICT(seg)                                           \
+       { unsigned short tmp;                                           \
+         err |= __get_user(tmp, &sc->seg);                             \
+         regs->x##seg = tmp|3; }
+
+#define GET_SEG(seg)                                                   \
+       { unsigned short tmp;                                           \
+         err |= __get_user(tmp, &sc->seg);                             \
+         loadsegment(seg,tmp); }
+
+       GET_SEG(gs);
+       GET_SEG(fs);
+       COPY_SEG(es);
+       COPY_SEG(ds);
+       COPY(edi);
+       COPY(esi);
+       COPY(ebp);
+       COPY(esp);
+       COPY(ebx);
+       COPY(edx);
+       COPY(ecx);
+       COPY(eip);
+       COPY_SEG_STRICT(cs);
+       COPY_SEG_STRICT(ss);
+       
+       {
+               unsigned int tmpflags;
+               err |= __get_user(tmpflags, &sc->eflags);
+               regs->eflags = (regs->eflags & ~0x40DD5) | (tmpflags & 0x40DD5);
+               regs->orig_eax = -1;            /* disable syscall checks */
+       }
+
+       {
+               struct _fpstate * buf;
+               err |= __get_user(buf, &sc->fpstate);
+               if (buf) {
+                       if (verify_area(VERIFY_READ, buf, sizeof(*buf)))
+                               goto badframe;
+                       err |= restore_i387(buf);
+               }
+       }
+
+       err |= __get_user(*peax, &sc->eax);
+       return err;
+
+badframe:
+       return 1;
+}
+
+asmlinkage int sys_sigreturn(unsigned long __unused)
+{
+       struct pt_regs *regs = (struct pt_regs *) &__unused;
+       struct sigframe *frame = (struct sigframe *)(regs->esp - 8);
+       sigset_t set;
+       int eax;
+
+       if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
+               goto badframe;
+       if (__get_user(set.sig[0], &frame->sc.oldmask)
+           || (_NSIG_WORDS > 1
+               && __copy_from_user(&set.sig[1], &frame->extramask,
+                                   sizeof(frame->extramask))))
+               goto badframe;
+
+       sigdelsetmask(&set, ~_BLOCKABLE);
+       spin_lock_irq(&current->sigmask_lock);
+       current->blocked = set;
+       recalc_sigpending(current);
+       spin_unlock_irq(&current->sigmask_lock);
+       
+       if (restore_sigcontext(regs, &frame->sc, &eax))
+               goto badframe;
+       return eax;
+
+badframe:
+       force_sig(SIGSEGV, current);
+       return 0;
+}      
+
+asmlinkage int sys_rt_sigreturn(unsigned long __unused)
+{
+       struct pt_regs *regs = (struct pt_regs *) &__unused;
+       struct rt_sigframe *frame = (struct rt_sigframe *)(regs->esp - 4);
+       sigset_t set;
+       stack_t st;
+       int eax;
+
+       if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
+               goto badframe;
+       if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
+               goto badframe;
+
+       sigdelsetmask(&set, ~_BLOCKABLE);
+       spin_lock_irq(&current->sigmask_lock);
+       current->blocked = set;
+       recalc_sigpending(current);
+       spin_unlock_irq(&current->sigmask_lock);
+       
+       if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &eax))
+               goto badframe;
+
+       if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
+               goto badframe;
+       /* It is more difficult to avoid calling this function than to
+          call it and ignore errors.  */
+       do_sigaltstack(&st, NULL, regs->esp);
+
+       return eax;
+
+badframe:
+       force_sig(SIGSEGV, current);
+       return 0;
+}      
+
+/*
+ * Set up a signal frame.
+ */
+
+static int
+setup_sigcontext(struct sigcontext *sc, struct _fpstate *fpstate,
+                struct pt_regs *regs, unsigned long mask)
+{
+       int tmp, err = 0;
+
+       tmp = 0;
+       __asm__("movl %%gs,%0" : "=r"(tmp): "0"(tmp));
+       err |= __put_user(tmp, (unsigned int *)&sc->gs);
+       __asm__("movl %%fs,%0" : "=r"(tmp): "0"(tmp));
+       err |= __put_user(tmp, (unsigned int *)&sc->fs);
+
+       err |= __put_user(regs->xes, (unsigned int *)&sc->es);
+       err |= __put_user(regs->xds, (unsigned int *)&sc->ds);
+       err |= __put_user(regs->edi, &sc->edi);
+       err |= __put_user(regs->esi, &sc->esi);
+       err |= __put_user(regs->ebp, &sc->ebp);
+       err |= __put_user(regs->esp, &sc->esp);
+       err |= __put_user(regs->ebx, &sc->ebx);
+       err |= __put_user(regs->edx, &sc->edx);
+       err |= __put_user(regs->ecx, &sc->ecx);
+       err |= __put_user(regs->eax, &sc->eax);
+       err |= __put_user(current->thread.trap_no, &sc->trapno);
+       err |= __put_user(current->thread.error_code, &sc->err);
+       err |= __put_user(regs->eip, &sc->eip);
+       err |= __put_user(regs->xcs, (unsigned int *)&sc->cs);
+       err |= __put_user(regs->eflags, &sc->eflags);
+       err |= __put_user(regs->esp, &sc->esp_at_signal);
+       err |= __put_user(regs->xss, (unsigned int *)&sc->ss);
+
+       tmp = save_i387(fpstate);
+       if (tmp < 0)
+         err = 1;
+       else
+         err |= __put_user(tmp ? fpstate : NULL, &sc->fpstate);
+
+       /* non-iBCS2 extensions.. */
+       err |= __put_user(mask, &sc->oldmask);
+       err |= __put_user(current->thread.cr2, &sc->cr2);
+
+       return err;
+}
+
+/*
+ * Determine which stack to use..
+ */
+static inline void *
+get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
+{
+       unsigned long esp;
+
+       /* Default to using normal stack */
+       esp = regs->esp;
+
+       /* This is the X/Open sanctioned signal stack switching.  */
+       if (ka->sa.sa_flags & SA_ONSTACK) {
+               if (sas_ss_flags(esp) == 0)
+                       esp = current->sas_ss_sp + current->sas_ss_size;
+       }
+
+       /* This is the legacy signal stack switching. */
+       else if ((regs->xss & 0xffff) != __USER_DS &&
+                !(ka->sa.sa_flags & SA_RESTORER) &&
+                ka->sa.sa_restorer) {
+               esp = (unsigned long) ka->sa.sa_restorer;
+       }
+
+       return (void *)((esp - frame_size) & -8ul);
+}
+
+static void setup_frame(int sig, struct k_sigaction *ka,
+                       sigset_t *set, struct pt_regs * regs)
+{
+       struct sigframe *frame;
+       int err = 0;
+
+       frame = get_sigframe(ka, regs, sizeof(*frame));
+
+       if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+               goto give_sigsegv;
+
+       err |= __put_user((current->exec_domain
+                          && current->exec_domain->signal_invmap
+                          && sig < 32
+                          ? current->exec_domain->signal_invmap[sig]
+                          : sig),
+                         &frame->sig);
+       if (err)
+               goto give_sigsegv;
+
+       err |= setup_sigcontext(&frame->sc, &frame->fpstate, regs, set->sig[0]);
+       if (err)
+               goto give_sigsegv;
+
+       if (_NSIG_WORDS > 1) {
+               err |= __copy_to_user(frame->extramask, &set->sig[1],
+                                     sizeof(frame->extramask));
+       }
+       if (err)
+               goto give_sigsegv;
+
+       /* Set up to return from userspace.  If provided, use a stub
+          already in userspace.  */
+       if (ka->sa.sa_flags & SA_RESTORER) {
+               err |= __put_user(ka->sa.sa_restorer, &frame->pretcode);
+       } else {
+               err |= __put_user(frame->retcode, &frame->pretcode);
+               /* This is popl %eax ; movl $,%eax ; int $0x80 */
+               err |= __put_user(0xb858, (short *)(frame->retcode+0));
+               err |= __put_user(__NR_sigreturn, (int *)(frame->retcode+2));
+               err |= __put_user(0x80cd, (short *)(frame->retcode+6));
+       }
+
+       if (err)
+               goto give_sigsegv;
+
+       /* Set up registers for signal handler */
+       regs->esp = (unsigned long) frame;
+       regs->eip = (unsigned long) ka->sa.sa_handler;
+
+       set_fs(USER_DS);
+       regs->xds = __USER_DS;
+       regs->xes = __USER_DS;
+       regs->xss = __USER_DS;
+       regs->xcs = __USER_CS;
+       regs->eflags &= ~TF_MASK;
+
+#if DEBUG_SIG
+       printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
+               current->comm, current->pid, frame, regs->eip, frame->pretcode);
+#endif
+
+       return;
+
+give_sigsegv:
+       if (sig == SIGSEGV)
+               ka->sa.sa_handler = SIG_DFL;
+       force_sig(SIGSEGV, current);
+}
+
+static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+                          sigset_t *set, struct pt_regs * regs)
+{
+       struct rt_sigframe *frame;
+       int err = 0;
+
+       frame = get_sigframe(ka, regs, sizeof(*frame));
+
+       if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
+               goto give_sigsegv;
+
+       err |= __put_user((current->exec_domain
+                          && current->exec_domain->signal_invmap
+                          && sig < 32
+                          ? current->exec_domain->signal_invmap[sig]
+                          : sig),
+                         &frame->sig);
+       err |= __put_user(&frame->info, &frame->pinfo);
+       err |= __put_user(&frame->uc, &frame->puc);
+       err |= copy_siginfo_to_user(&frame->info, info);
+       if (err)
+               goto give_sigsegv;
+
+       /* Create the ucontext.  */
+       err |= __put_user(0, &frame->uc.uc_flags);
+       err |= __put_user(0, &frame->uc.uc_link);
+       err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
+       err |= __put_user(sas_ss_flags(regs->esp),
+                         &frame->uc.uc_stack.ss_flags);
+       err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
+       err |= setup_sigcontext(&frame->uc.uc_mcontext, &frame->fpstate,
+                               regs, set->sig[0]);
+       err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
+       if (err)
+               goto give_sigsegv;
+
+       /* Set up to return from userspace.  If provided, use a stub
+          already in userspace.  */
+       if (ka->sa.sa_flags & SA_RESTORER) {
+               err |= __put_user(ka->sa.sa_restorer, &frame->pretcode);
+       } else {
+               err |= __put_user(frame->retcode, &frame->pretcode);
+               /* This is movl $,%eax ; int $0x80 */
+               err |= __put_user(0xb8, (char *)(frame->retcode+0));
+               err |= __put_user(__NR_rt_sigreturn, (int *)(frame->retcode+1));
+               err |= __put_user(0x80cd, (short *)(frame->retcode+5));
+       }
+
+       if (err)
+               goto give_sigsegv;
+
+       /* Set up registers for signal handler */
+       regs->esp = (unsigned long) frame;
+       regs->eip = (unsigned long) ka->sa.sa_handler;
+
+       set_fs(USER_DS);
+       regs->xds = __USER_DS;
+       regs->xes = __USER_DS;
+       regs->xss = __USER_DS;
+       regs->xcs = __USER_CS;
+       regs->eflags &= ~TF_MASK;
+
+#if DEBUG_SIG
+       printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
+               current->comm, current->pid, frame, regs->eip, frame->pretcode);
+#endif
+
+       return;
+
+give_sigsegv:
+       if (sig == SIGSEGV)
+               ka->sa.sa_handler = SIG_DFL;
+       force_sig(SIGSEGV, current);
+}
+
+/*
+ * OK, we're invoking a handler
+ */    
+
+static void
+handle_signal(unsigned long sig, struct k_sigaction *ka,
+             siginfo_t *info, sigset_t *oldset, struct pt_regs * regs)
+{
+       /* Are we from a system call? */
+       if (regs->orig_eax >= 0) {
+               /* If so, check system call restarting.. */
+               switch (regs->eax) {
+                       case -ERESTARTNOHAND:
+                               regs->eax = -EINTR;
+                               break;
+
+                       case -ERESTARTSYS:
+                               if (!(ka->sa.sa_flags & SA_RESTART)) {
+                                       regs->eax = -EINTR;
+                                       break;
+                               }
+                       /* fallthrough */
+                       case -ERESTARTNOINTR:
+                               regs->eax = regs->orig_eax;
+                               regs->eip -= 2;
+               }
+       }
+
+       /* Set up the stack frame */
+       if (ka->sa.sa_flags & SA_SIGINFO)
+               setup_rt_frame(sig, ka, info, oldset, regs);
+       else
+               setup_frame(sig, ka, oldset, regs);
+
+       if (ka->sa.sa_flags & SA_ONESHOT)
+               ka->sa.sa_handler = SIG_DFL;
+
+       if (!(ka->sa.sa_flags & SA_NODEFER)) {
+               spin_lock_irq(&current->sigmask_lock);
+               sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
+               sigaddset(&current->blocked,sig);
+               recalc_sigpending(current);
+               spin_unlock_irq(&current->sigmask_lock);
+       }
+}
+
+/*
+ * Note that 'init' is a special process: it doesn't get signals it doesn't
+ * want to handle. Thus you cannot kill init even with a SIGKILL even by
+ * mistake.
+ */
+int do_signal(struct pt_regs *regs, sigset_t *oldset)
+{
+       siginfo_t info;
+       struct k_sigaction *ka;
+
+       /*
+        * We want the common case to go fast, which
+        * is why we may in certain cases get here from
+        * kernel mode. Just return without doing anything
+        * if so.
+        */
+       if ((regs->xcs & 2) != 2)
+               return 1;
+
+       if (!oldset)
+               oldset = &current->blocked;
+
+       for (;;) {
+               unsigned long signr;
+
+               spin_lock_irq(&current->sigmask_lock);
+               signr = dequeue_signal(&current->blocked, &info);
+               spin_unlock_irq(&current->sigmask_lock);
+
+               if (!signr)
+                       break;
+
+               if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
+                       /* Let the debugger run.  */
+                       current->exit_code = signr;
+                       current->state = TASK_STOPPED;
+                       notify_parent(current, SIGCHLD);
+                       schedule();
+
+                       /* We're back.  Did the debugger cancel the sig?  */
+                       if (!(signr = current->exit_code))
+                               continue;
+                       current->exit_code = 0;
+
+                       /* The debugger continued.  Ignore SIGSTOP.  */
+                       if (signr == SIGSTOP)
+                               continue;
+
+                       /* Update the siginfo structure.  Is this good?  */
+                       if (signr != info.si_signo) {
+                               info.si_signo = signr;
+                               info.si_errno = 0;
+                               info.si_code = SI_USER;
+                               info.si_pid = current->p_pptr->pid;
+                               info.si_uid = current->p_pptr->uid;
+                       }
+
+                       /* If the (new) signal is now blocked, requeue it.  */
+                       if (sigismember(&current->blocked, signr)) {
+                               send_sig_info(signr, &info, current);
+                               continue;
+                       }
+               }
+
+               ka = &current->sig->action[signr-1];
+               if (ka->sa.sa_handler == SIG_IGN) {
+                       if (signr != SIGCHLD)
+                               continue;
+                       /* Check for SIGCHLD: it's special.  */
+                       while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
+                               /* nothing */;
+                       continue;
+               }
+
+               if (ka->sa.sa_handler == SIG_DFL) {
+                       int exit_code = signr;
+
+                       /* Init gets no signals it doesn't want.  */
+                       if (current->pid == 1)
+                               continue;
+
+                       switch (signr) {
+                       case SIGCONT: case SIGCHLD: case SIGWINCH: case SIGURG:
+                               continue;
+
+                       case SIGTSTP: case SIGTTIN: case SIGTTOU:
+                               if (is_orphaned_pgrp(current->pgrp))
+                                       continue;
+                               /* FALLTHRU */
+
+                       case SIGSTOP: {
+                               struct signal_struct *sig;
+                               current->state = TASK_STOPPED;
+                               current->exit_code = signr;
+                               sig = current->p_pptr->sig;
+                               if (sig && !(sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP))
+                                       notify_parent(current, SIGCHLD);
+                               schedule();
+                               continue;
+                       }
+
+                       case SIGQUIT: case SIGILL: case SIGTRAP:
+                       case SIGABRT: case SIGFPE: case SIGSEGV:
+                       case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
+                               if (do_coredump(signr, regs))
+                                       exit_code |= 0x80;
+                               /* FALLTHRU */
+
+                       default:
+                               sig_exit(signr, exit_code, &info);
+                               /* NOTREACHED */
+                       }
+               }
+
+               /* Reenable any watchpoints before delivering the
+                * signal to user space. The processor register will
+                * have been cleared if the watchpoint triggered
+                * inside the kernel.
+                */
+                if ( current->thread.debugreg[7] != 0 )
+                    HYPERVISOR_set_debugreg(7, current->thread.debugreg[7]);
+
+               /* Whee!  Actually deliver the signal.  */
+               handle_signal(signr, ka, &info, oldset, regs);
+               return 1;
+       }
+
+       /* Did we come from a system call? */
+       if (regs->orig_eax >= 0) {
+               /* Restart the system call - no handlers present */
+               if (regs->eax == -ERESTARTNOHAND ||
+                   regs->eax == -ERESTARTSYS ||
+                   regs->eax == -ERESTARTNOINTR) {
+                       regs->eax = regs->orig_eax;
+                       regs->eip -= 2;
+               }
+       }
+       return 0;
+}
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/kernel/time.c b/xenolinux-2.4.22-sparse/arch/xeno/kernel/time.c
new file mode 100644 (file)
index 0000000..73ac82c
--- /dev/null
@@ -0,0 +1,323 @@
+/* -*-  Mode:C; c-basic-offset:4; tab-width:4 -*-
+ ****************************************************************************
+ * (C) 2002 - Rolf Neugebauer - Intel Research Cambridge
+ ****************************************************************************
+ *
+ *        File: arch.xeno/time.c
+ *      Author: Rolf Neugebauer
+ *     Changes: 
+ *              
+ *        Date: Nov 2002
+ * 
+ * Environment: XenoLinux
+ * Description: Interface with Hypervisor to get correct notion of time
+ *              Currently supports Systemtime and WallClock time.
+ *
+ * (This has hardly any resemblence with the Linux code but left the
+ *  copyright notice anyway. Ignore the comments in the copyright notice.)
+ ****************************************************************************
+ * $Id: c-insert.c,v 1.7 2002/11/08 16:04:34 rn Exp $
+ ****************************************************************************
+ */
+
+/*
+ *  linux/arch/i386/kernel/time.c
+ *
+ *  Copyright (C) 1991, 1992, 1995  Linus Torvalds
+ *
+ * This file contains the PC-specific time handling details:
+ * reading the RTC at bootup, etc..
+ * 1994-07-02    Alan Modra
+ *     fixed set_rtc_mmss, fixed time.year for >= 2000, new mktime
+ * 1995-03-26    Markus Kuhn
+ *      fixed 500 ms bug at call to set_rtc_mmss, fixed DS12887
+ *      precision CMOS clock update
+ * 1996-05-03    Ingo Molnar
+ *      fixed time warps in do_[slow|fast]_gettimeoffset()
+ * 1997-09-10  Updated NTP code according to technical memorandum Jan '96
+ *             "A Kernel Model for Precision Timekeeping" by Dave Mills
+ * 1998-09-05    (Various)
+ *     More robust do_fast_gettimeoffset() algorithm implemented
+ *     (works with APM, Cyrix 6x86MX and Centaur C6),
+ *     monotonic gettimeofday() with fast_get_timeoffset(),
+ *     drift-proof precision TSC calibration on boot
+ *     (C. Scott Ananian <cananian@alumni.princeton.edu>, Andrew D.
+ *     Balsa <andrebalsa@altern.org>, Philip Gladstone <philip@raptor.com>;
+ *     ported from 2.0.35 Jumbo-9 by Michael Krause <m.krause@tu-harburg.de>).
+ * 1998-12-16    Andrea Arcangeli
+ *     Fixed Jumbo-9 code in 2.1.131: do_gettimeofday was missing 1 jiffy
+ *     because was not accounting lost_ticks.
+ * 1998-12-24 Copyright (C) 1998  Andrea Arcangeli
+ *     Fixed a xtime SMP race (we need the xtime_lock rw spinlock to
+ *     serialize accesses to xtime/lost_ticks).
+ */
+
+#include <asm/smp.h>
+#include <asm/irq.h>
+#include <asm/msr.h>
+#include <asm/delay.h>
+#include <asm/mpspec.h>
+#include <asm/uaccess.h>
+#include <asm/processor.h>
+
+#include <asm/div64.h>
+#include <asm/hypervisor.h>
+
+#include <linux/kernel.h>
+#include <linux/interrupt.h>
+#include <linux/time.h>
+#include <linux/init.h>
+#include <linux/smp.h>
+#include <linux/irq.h>
+
+#undef XENO_TIME_DEBUG /* adds sanity checks and periodic printouts */
+
+spinlock_t rtc_lock = SPIN_LOCK_UNLOCKED;
+extern rwlock_t xtime_lock;
+
+unsigned long cpu_khz; /* get this from Xen, used elsewhere */
+static spinlock_t hyp_time_lock = SPIN_LOCK_UNLOCKED;
+
+static unsigned int rdtsc_bitshift;
+static u32 st_scale_f;
+static u32 st_scale_i;
+static u32 shadow_st_pcc;
+static s64 shadow_st;
+
+/*
+ * System time.
+ * Although the rest of the Linux kernel doesn't know about this, we
+ * we use it to extrapolate passage of wallclock time.
+ * We need to read the values from the shared info page "atomically" 
+ * and use the cycle counter value as the "version" number. Clashes
+ * should be very rare.
+ */
+static inline s64 __get_s_time(void)
+{
+    s32 delta_tsc;
+    u32 low;
+    u64 delta, tsc;
+
+    rdtscll(tsc);
+    low = (u32)(tsc >> rdtsc_bitshift);
+    delta_tsc = (s32)(low - shadow_st_pcc);
+    if ( unlikely(delta_tsc < 0) ) delta_tsc = 0;
+    delta = ((u64)delta_tsc * st_scale_f);
+    delta >>= 32;
+    delta += ((u64)delta_tsc * st_scale_i);
+
+    return shadow_st + delta;
+}
+
+/*
+ * Wallclock time.
+ * Based on what the hypervisor tells us, extrapolated using system time.
+ * Again need to read a number of values from the shared page "atomically".
+ * this time using a version number.
+ */
+static u32        shadow_wc_version=0;
+static long       shadow_tv_sec;
+static long       shadow_tv_usec;
+static long long  shadow_wc_timestamp;
+void do_gettimeofday(struct timeval *tv)
+{
+    unsigned long flags;
+    long          usec, sec;
+    u32                  version;
+    u64           now, cpu_freq, scale;
+
+    spin_lock_irqsave(&hyp_time_lock, flags);
+
+    while ( (version = HYPERVISOR_shared_info->wc_version) != 
+            shadow_wc_version )
+    {
+        barrier();
+
+        shadow_wc_version   = version;
+        shadow_tv_sec       = HYPERVISOR_shared_info->tv_sec;
+        shadow_tv_usec      = HYPERVISOR_shared_info->tv_usec;
+        shadow_wc_timestamp = HYPERVISOR_shared_info->wc_timestamp;
+        shadow_st_pcc       = HYPERVISOR_shared_info->st_timestamp;
+        shadow_st           = HYPERVISOR_shared_info->system_time;
+
+        rdtsc_bitshift      = HYPERVISOR_shared_info->rdtsc_bitshift;
+        cpu_freq            = HYPERVISOR_shared_info->cpu_freq;
+
+        /* XXX cpu_freq as u32 limits it to 4.29 GHz. Get a better do_div! */
+        scale = 1000000000LL << (32 + rdtsc_bitshift);
+        do_div(scale,(u32)cpu_freq);
+        st_scale_f = scale & 0xffffffff;
+        st_scale_i = scale >> 32;
+
+        barrier();
+       }
+
+    now   = __get_s_time();
+    usec  = ((unsigned long)(now-shadow_wc_timestamp))/1000;
+    sec   = shadow_tv_sec;
+    usec += shadow_tv_usec;
+
+    while ( usec >= 1000000 ) 
+    {
+        usec -= 1000000;
+        sec++;
+    }
+
+    tv->tv_sec = sec;
+    tv->tv_usec = usec;
+
+    spin_unlock_irqrestore(&hyp_time_lock, flags);
+
+#ifdef XENO_TIME_DEBUG
+    {
+        static long long old_now=0;
+        static long long wct=0, old_wct=0;
+
+        /* This debug code checks if time increase over two subsequent calls */
+        wct=(((long long)sec) * 1000000) + usec;
+        /* wall clock time going backwards */
+        if ((wct < old_wct) ) {        
+            printk("Urgh1: wc diff=%6ld, usec = %ld (0x%lX)\n",
+                   (long)(wct-old_wct), usec, usec);           
+            printk("       st diff=%lld cur st=0x%016llX old st=0x%016llX\n",
+                   now-old_now, now, old_now);
+        }
+
+        /* system time going backwards */
+        if (now<=old_now) {
+            printk("Urgh2: st diff=%lld cur st=0x%016llX old st=0x%016llX\n",
+                   now-old_now, now, old_now);
+        }
+        old_wct  = wct;
+        old_now  = now;
+    }
+#endif
+}
+
+void do_settimeofday(struct timeval *tv)
+{
+/* XXX RN: should do something special here for dom0 */
+#if 0
+    write_lock_irq(&xtime_lock);
+    /*
+     * This is revolting. We need to set "xtime" correctly. However, the
+     * value in this location is the value at the most recent update of
+     * wall time.  Discover what correction gettimeofday() would have
+     * made, and then undo it!
+     */
+    tv->tv_usec -= do_gettimeoffset();
+    tv->tv_usec -= (jiffies - wall_jiffies) * (1000000 / HZ);
+
+    while ( tv->tv_usec < 0 )
+    {
+        tv->tv_usec += 1000000;
+        tv->tv_sec--;
+    }
+
+    xtime = *tv;
+    time_adjust = 0;           /* stop active adjtime() */
+    time_status |= STA_UNSYNC;
+    time_maxerror = NTP_PHASE_LIMIT;
+    time_esterror = NTP_PHASE_LIMIT;
+    write_unlock_irq(&xtime_lock);
+#endif
+}
+
+
+/*
+ * Timer ISR. 
+ * Unlike normal Linux these don't come in at a fixed rate of HZ. 
+ * In here we wrok out how often it should have been called and then call
+ * the architecture independent part (do_timer()) the appropriate number of
+ * times. A bit of a nasty hack, to keep the "other" notion of wallclock time
+ * happy.
+ */
+static long long us_per_tick=1000000/HZ;
+static long long last_irq;
+static inline void do_timer_interrupt(int irq, void *dev_id,
+                                      struct pt_regs *regs)
+{
+    struct timeval tv;
+    long long time, delta;
+
+    /*
+     * The next bit really sucks:
+     * Linux not only uses do_gettimeofday() to keep a notion of
+     * wallclock time, but also maintains the xtime struct and jiffies.
+     * (Even worse some userland code accesses this via the sys_time()
+     * system call)
+     * Unfortunately, xtime is maintain in the architecture independent
+     * part of the timer ISR (./kernel/timer.c sic!). So, although we have
+     * perfectly valid notion of wallclock time from the hypervisor we here
+     * fake missed timer interrupts so that the arch independent part of
+     * the Timer ISR updates jiffies for us *and* once the bh gets run
+     * updates xtime accordingly. Yuck!
+     */
+
+    /* Work out the number of jiffy intervals passed and update them. */
+    do_gettimeofday(&tv);
+    time = (((long long)tv.tv_sec) * 1000000) + tv.tv_usec;
+    delta = time - last_irq;
+    if (delta <= 0) {
+        printk ("Timer ISR: Time went backwards: %lld\n", delta);
+        return;
+    }
+    while (delta >= us_per_tick) {
+        do_timer(regs);
+        delta    -= us_per_tick;
+        last_irq += us_per_tick;
+    }
+
+#if 0
+    if (!user_mode(regs))
+        x86_do_profile(regs->eip);
+#endif
+}
+
+static void timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+    write_lock(&xtime_lock);
+    do_timer_interrupt(irq, NULL, regs);
+    write_unlock(&xtime_lock);
+}
+
+static struct irqaction irq_timer = {
+    timer_interrupt, 
+    SA_INTERRUPT, 
+    0, 
+    "timer", 
+    NULL, 
+    NULL
+};
+
+void __init time_init(void)
+{
+    unsigned long long alarm;
+    u64 __cpu_khz;
+
+    __cpu_khz = HYPERVISOR_shared_info->cpu_freq;
+    do_div(__cpu_khz, 1000);
+    cpu_khz = (u32)__cpu_khz;
+    printk("Xen reported: %lu.%03lu MHz processor.\n", 
+           cpu_khz / 1000, cpu_khz % 1000);
+
+    do_gettimeofday(&xtime);
+    last_irq = (((long long)xtime.tv_sec) * 1000000) + xtime.tv_usec;
+
+    setup_irq(TIMER_IRQ, &irq_timer);
+
+    /*
+     * Start ticker. Note that timing runs of wall clock, not virtual 'domain' 
+     * time. This means that clock sshould run at the correct rate. For things 
+     * like scheduling, it's not clear whether it matters which sort of time 
+     * we use. XXX RN: unimplemented.
+     */
+
+    rdtscll(alarm);
+#if 0
+    alarm += (1000/HZ)*HYPERVISOR_shared_info->ticks_per_ms;
+    HYPERVISOR_shared_info->wall_timeout   = alarm;
+    HYPERVISOR_shared_info->domain_timeout = ~0ULL;
+#endif
+    clear_bit(_EVENT_TIMER, &HYPERVISOR_shared_info->events);
+}
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/kernel/traps.c b/xenolinux-2.4.22-sparse/arch/xeno/kernel/traps.c
new file mode 100644 (file)
index 0000000..85c6acb
--- /dev/null
@@ -0,0 +1,600 @@
+/*
+ *  linux/arch/i386/traps.c
+ *
+ *  Copyright (C) 1991, 1992  Linus Torvalds
+ *
+ *  Pentium III FXSR, SSE support
+ *     Gareth Hughes <gareth@valinux.com>, May 2000
+ */
+
+/*
+ * 'Traps.c' handles hardware traps and faults after we have saved some
+ * state in 'asm.s'.
+ */
+#include <linux/config.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/errno.h>
+#include <linux/ptrace.h>
+#include <linux/timer.h>
+#include <linux/mm.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/spinlock.h>
+#include <linux/interrupt.h>
+#include <linux/highmem.h>
+
+#include <asm/system.h>
+#include <asm/uaccess.h>
+#include <asm/io.h>
+#include <asm/atomic.h>
+#include <asm/debugreg.h>
+#include <asm/desc.h>
+#include <asm/i387.h>
+
+#include <asm/smp.h>
+#include <asm/pgalloc.h>
+
+#include <asm/hypervisor.h>
+
+#include <linux/irq.h>
+#include <linux/module.h>
+
+asmlinkage int system_call(void);
+asmlinkage void lcall7(void);
+asmlinkage void lcall27(void);
+
+asmlinkage void divide_error(void);
+asmlinkage void debug(void);
+asmlinkage void int3(void);
+asmlinkage void overflow(void);
+asmlinkage void bounds(void);
+asmlinkage void invalid_op(void);
+asmlinkage void device_not_available(void);
+asmlinkage void double_fault(void);
+asmlinkage void coprocessor_segment_overrun(void);
+asmlinkage void invalid_TSS(void);
+asmlinkage void segment_not_present(void);
+asmlinkage void stack_segment(void);
+asmlinkage void general_protection(void);
+asmlinkage void page_fault(void);
+asmlinkage void coprocessor_error(void);
+asmlinkage void simd_coprocessor_error(void);
+asmlinkage void alignment_check(void);
+asmlinkage void spurious_interrupt_bug(void);
+asmlinkage void machine_check(void);
+
+int kstack_depth_to_print = 24;
+
+
+/*
+ * If the address is either in the .text section of the
+ * kernel, or in the vmalloc'ed module regions, it *may* 
+ * be the address of a calling routine
+ */
+
+#ifdef CONFIG_MODULES
+
+extern struct module *module_list;
+extern struct module kernel_module;
+
+static inline int kernel_text_address(unsigned long addr)
+{
+       int retval = 0;
+       struct module *mod;
+
+       if (addr >= (unsigned long) &_stext &&
+           addr <= (unsigned long) &_etext)
+               return 1;
+
+       for (mod = module_list; mod != &kernel_module; mod = mod->next) {
+               /* mod_bound tests for addr being inside the vmalloc'ed
+                * module area. Of course it'd be better to test only
+                * for the .text subset... */
+               if (mod_bound(addr, 0, mod)) {
+                       retval = 1;
+                       break;
+               }
+       }
+
+       return retval;
+}
+
+#else
+
+static inline int kernel_text_address(unsigned long addr)
+{
+       return (addr >= (unsigned long) &_stext &&
+               addr <= (unsigned long) &_etext);
+}
+
+#endif
+
+void show_trace(unsigned long * stack)
+{
+       int i;
+       unsigned long addr;
+
+       if (!stack)
+               stack = (unsigned long*)&stack;
+
+       printk("Call Trace: ");
+       i = 1;
+       while (((long) stack & (THREAD_SIZE-1)) != 0) {
+               addr = *stack++;
+               if (kernel_text_address(addr)) {
+                       if (i && ((i % 6) == 0))
+                               printk("\n   ");
+                       printk("[<%08lx>] ", addr);
+                       i++;
+               }
+       }
+       printk("\n");
+}
+
+void show_trace_task(struct task_struct *tsk)
+{
+       unsigned long esp = tsk->thread.esp;
+
+       /* User space on another CPU? */
+       if ((esp ^ (unsigned long)tsk) & (PAGE_MASK<<1))
+               return;
+       show_trace((unsigned long *)esp);
+}
+
+void show_stack(unsigned long * esp)
+{
+       unsigned long *stack;
+       int i;
+
+       // debugging aid: "show_stack(NULL);" prints the
+       // back trace for this cpu.
+
+       if(esp==NULL)
+               esp=(unsigned long*)&esp;
+
+       stack = esp;
+       for(i=0; i < kstack_depth_to_print; i++) {
+               if (((long) stack & (THREAD_SIZE-1)) == 0)
+                       break;
+               if (i && ((i % 8) == 0))
+                       printk("\n       ");
+               printk("%08lx ", *stack++);
+       }
+       printk("\n");
+       show_trace(esp);
+}
+
+void show_registers(struct pt_regs *regs)
+{
+       int in_kernel = 1;
+       unsigned long esp;
+       unsigned short ss;
+
+       esp = (unsigned long) (&regs->esp);
+       ss = __KERNEL_DS;
+       if (regs->xcs & 2) {
+               in_kernel = 0;
+               esp = regs->esp;
+               ss = regs->xss & 0xffff;
+       }
+       printk("CPU:    %d\nEIP:    %04x:[<%08lx>]    %s\nEFLAGS: %08lx\n",
+               smp_processor_id(), 0xffff & regs->xcs, regs->eip, print_tainted(), regs->eflags);
+       printk("eax: %08lx   ebx: %08lx   ecx: %08lx   edx: %08lx\n",
+               regs->eax, regs->ebx, regs->ecx, regs->edx);
+       printk("esi: %08lx   edi: %08lx   ebp: %08lx   esp: %08lx\n",
+               regs->esi, regs->edi, regs->ebp, esp);
+       printk("ds: %04x   es: %04x   ss: %04x\n",
+               regs->xds & 0xffff, regs->xes & 0xffff, ss);
+       printk("Process %s (pid: %d, stackpage=%08lx)",
+               current->comm, current->pid, 4096+(unsigned long)current);
+       /*
+        * When in-kernel, we also print out the stack and code at the
+        * time of the fault..
+        */
+       if (in_kernel) {
+
+               printk("\nStack: ");
+               show_stack((unsigned long*)esp);
+
+#if 0
+                {
+                        int i;
+                       printk("\nCode: ");
+                       if(regs->eip < PAGE_OFFSET)
+                               goto bad;
+
+                       for(i=0;i<20;i++)
+                       {
+                               unsigned char c;
+                               if(__get_user(c, &((unsigned char*)regs->eip)[i])) {
+bad:
+                                       printk(" Bad EIP value.");
+                                       break;
+                               }
+                               printk("%02x ", c);
+                       }
+               }
+#endif
+       }
+       printk("\n");
+}      
+
+spinlock_t die_lock = SPIN_LOCK_UNLOCKED;
+
+void die(const char * str, struct pt_regs * regs, long err)
+{
+       console_verbose();
+       spin_lock_irq(&die_lock);
+       bust_spinlocks(1);
+       printk("%s: %04lx\n", str, err & 0xffff);
+       show_registers(regs);
+       bust_spinlocks(0);
+       spin_unlock_irq(&die_lock);
+       do_exit(SIGSEGV);
+}
+
+static inline void die_if_kernel(const char * str, struct pt_regs * regs, long err)
+{
+       if (!(2 & regs->xcs))
+               die(str, regs, err);
+}
+
+
+static void inline do_trap(int trapnr, int signr, char *str,
+                          struct pt_regs * regs, long error_code,
+                           siginfo_t *info)
+{
+       if (!(regs->xcs & 2))
+               goto kernel_trap;
+
+       /*trap_signal:*/ {
+               struct task_struct *tsk = current;
+               tsk->thread.error_code = error_code;
+               tsk->thread.trap_no = trapnr;
+               if (info)
+                       force_sig_info(signr, info, tsk);
+               else
+                       force_sig(signr, tsk);
+               return;
+       }
+
+       kernel_trap: {
+               unsigned long fixup = search_exception_table(regs->eip);
+               if (fixup)
+                       regs->eip = fixup;
+               else    
+                       die(str, regs, error_code);
+               return;
+       }
+}
+
+#define DO_ERROR(trapnr, signr, str, name) \
+asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
+{ \
+       do_trap(trapnr, signr, str, regs, error_code, NULL); \
+}
+
+#define DO_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \
+asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
+{ \
+       siginfo_t info; \
+       info.si_signo = signr; \
+       info.si_errno = 0; \
+       info.si_code = sicode; \
+       info.si_addr = (void *)siaddr; \
+       do_trap(trapnr, signr, str, regs, error_code, &info); \
+}
+
+DO_ERROR_INFO( 0, SIGFPE,  "divide error", divide_error, FPE_INTDIV, regs->eip)
+DO_ERROR( 3, SIGTRAP, "int3", int3)
+DO_ERROR( 4, SIGSEGV, "overflow", overflow)
+DO_ERROR( 5, SIGSEGV, "bounds", bounds)
+DO_ERROR_INFO( 6, SIGILL,  "invalid operand", invalid_op, ILL_ILLOPN, regs->eip)
+DO_ERROR( 7, SIGSEGV, "device not available", device_not_available)
+DO_ERROR( 8, SIGSEGV, "double fault", double_fault)
+DO_ERROR( 9, SIGFPE,  "coprocessor segment overrun", coprocessor_segment_overrun)
+DO_ERROR(10, SIGSEGV, "invalid TSS", invalid_TSS)
+DO_ERROR(11, SIGBUS,  "segment not present", segment_not_present)
+DO_ERROR(12, SIGBUS,  "stack segment", stack_segment)
+DO_ERROR_INFO(17, SIGBUS, "alignment check", alignment_check, BUS_ADRALN, 0)
+DO_ERROR(18, SIGBUS, "machine check", machine_check)
+
+asmlinkage void do_general_protection(struct pt_regs * regs, long error_code)
+{
+       if (!(regs->xcs & 2))
+               goto gp_in_kernel;
+
+       current->thread.error_code = error_code;
+       current->thread.trap_no = 13;
+       force_sig(SIGSEGV, current);
+       return;
+
+gp_in_kernel:
+       {
+               unsigned long fixup;
+               fixup = search_exception_table(regs->eip);
+               if (fixup) {
+                       regs->eip = fixup;
+                       return;
+               }
+               die("general protection fault", regs, error_code);
+       }
+}
+
+
+asmlinkage void do_debug(struct pt_regs * regs, long error_code)
+{
+    unsigned int condition;
+    struct task_struct *tsk = current;
+    siginfo_t info;
+
+    condition = HYPERVISOR_get_debugreg(6);
+
+    /* Mask out spurious debug traps due to lazy DR7 setting */
+    if (condition & (DR_TRAP0|DR_TRAP1|DR_TRAP2|DR_TRAP3)) {
+        if (!tsk->thread.debugreg[7])
+            goto clear_dr7;
+    }
+
+    /* Save debug status register where ptrace can see it */
+    tsk->thread.debugreg[6] = condition;
+
+    /* Mask out spurious TF errors due to lazy TF clearing */
+    if (condition & DR_STEP) {
+        /*
+         * The TF error should be masked out only if the current
+         * process is not traced and if the TRAP flag has been set
+         * previously by a tracing process (condition detected by
+         * the PT_DTRACE flag); remember that the i386 TRAP flag
+         * can be modified by the process itself in user mode,
+         * allowing programs to debug themselves without the ptrace()
+         * interface.
+         */
+        if ((tsk->ptrace & (PT_DTRACE|PT_PTRACED)) == PT_DTRACE)
+            goto clear_TF;
+    }
+
+    /* Ok, finally something we can handle */
+    tsk->thread.trap_no = 1;
+    tsk->thread.error_code = error_code;
+    info.si_signo = SIGTRAP;
+    info.si_errno = 0;
+    info.si_code = TRAP_BRKPT;
+        
+    /* If this is a kernel mode trap, save the user PC on entry to 
+     * the kernel, that's what the debugger can make sense of.
+     */
+    info.si_addr = ((regs->xcs & 2) == 0) ? (void *)tsk->thread.eip : 
+                                            (void *)regs->eip;
+    force_sig_info(SIGTRAP, &info, tsk);
+
+    /* Disable additional traps. They'll be re-enabled when
+     * the signal is delivered.
+     */
+ clear_dr7:
+    HYPERVISOR_set_debugreg(7, 0);
+    return;
+
+ clear_TF:
+    regs->eflags &= ~TF_MASK;
+    return;
+}
+
+
+/*
+ * Note that we play around with the 'TS' bit in an attempt to get
+ * the correct behaviour even in the presence of the asynchronous
+ * IRQ13 behaviour
+ */
+void math_error(void *eip)
+{
+       struct task_struct * task;
+       siginfo_t info;
+       unsigned short cwd, swd;
+
+       /*
+        * Save the info for the exception handler and clear the error.
+        */
+       task = current;
+       save_init_fpu(task);
+       task->thread.trap_no = 16;
+       task->thread.error_code = 0;
+       info.si_signo = SIGFPE;
+       info.si_errno = 0;
+       info.si_code = __SI_FAULT;
+       info.si_addr = eip;
+       /*
+        * (~cwd & swd) will mask out exceptions that are not set to unmasked
+        * status.  0x3f is the exception bits in these regs, 0x200 is the
+        * C1 reg you need in case of a stack fault, 0x040 is the stack
+        * fault bit.  We should only be taking one exception at a time,
+        * so if this combination doesn't produce any single exception,
+        * then we have a bad program that isn't syncronizing its FPU usage
+        * and it will suffer the consequences since we won't be able to
+        * fully reproduce the context of the exception
+        */
+       cwd = get_fpu_cwd(task);
+       swd = get_fpu_swd(task);
+       switch (((~cwd) & swd & 0x3f) | (swd & 0x240)) {
+               case 0x000:
+               default:
+                       break;
+               case 0x001: /* Invalid Op */
+               case 0x040: /* Stack Fault */
+               case 0x240: /* Stack Fault | Direction */
+                       info.si_code = FPE_FLTINV;
+                       break;
+               case 0x002: /* Denormalize */
+               case 0x010: /* Underflow */
+                       info.si_code = FPE_FLTUND;
+                       break;
+               case 0x004: /* Zero Divide */
+                       info.si_code = FPE_FLTDIV;
+                       break;
+               case 0x008: /* Overflow */
+                       info.si_code = FPE_FLTOVF;
+                       break;
+               case 0x020: /* Precision */
+                       info.si_code = FPE_FLTRES;
+                       break;
+       }
+       force_sig_info(SIGFPE, &info, task);
+}
+
+asmlinkage void do_coprocessor_error(struct pt_regs * regs, long error_code)
+{
+       ignore_irq13 = 1;
+       math_error((void *)regs->eip);
+}
+
+void simd_math_error(void *eip)
+{
+       struct task_struct * task;
+       siginfo_t info;
+       unsigned short mxcsr;
+
+       /*
+        * Save the info for the exception handler and clear the error.
+        */
+       task = current;
+       save_init_fpu(task);
+       task->thread.trap_no = 19;
+       task->thread.error_code = 0;
+       info.si_signo = SIGFPE;
+       info.si_errno = 0;
+       info.si_code = __SI_FAULT;
+       info.si_addr = eip;
+       /*
+        * The SIMD FPU exceptions are handled a little differently, as there
+        * is only a single status/control register.  Thus, to determine which
+        * unmasked exception was caught we must mask the exception mask bits
+        * at 0x1f80, and then use these to mask the exception bits at 0x3f.
+        */
+       mxcsr = get_fpu_mxcsr(task);
+       switch (~((mxcsr & 0x1f80) >> 7) & (mxcsr & 0x3f)) {
+               case 0x000:
+               default:
+                       break;
+               case 0x001: /* Invalid Op */
+                       info.si_code = FPE_FLTINV;
+                       break;
+               case 0x002: /* Denormalize */
+               case 0x010: /* Underflow */
+                       info.si_code = FPE_FLTUND;
+                       break;
+               case 0x004: /* Zero Divide */
+                       info.si_code = FPE_FLTDIV;
+                       break;
+               case 0x008: /* Overflow */
+                       info.si_code = FPE_FLTOVF;
+                       break;
+               case 0x020: /* Precision */
+                       info.si_code = FPE_FLTRES;
+                       break;
+       }
+       force_sig_info(SIGFPE, &info, task);
+}
+
+asmlinkage void do_simd_coprocessor_error(struct pt_regs * regs,
+                                         long error_code)
+{
+       if (cpu_has_xmm) {
+               /* Handle SIMD FPU exceptions on PIII+ processors. */
+               ignore_irq13 = 1;
+               simd_math_error((void *)regs->eip);
+       } else {
+               die_if_kernel("cache flush denied", regs, error_code);
+               current->thread.trap_no = 19;
+               current->thread.error_code = error_code;
+               force_sig(SIGSEGV, current);
+       }
+}
+
+asmlinkage void do_spurious_interrupt_bug(struct pt_regs * regs,
+                                         long error_code)
+{
+}
+
+/*
+ *  'math_state_restore()' saves the current math information in the
+ * old math state array, and gets the new ones from the current task
+ *
+ * Careful.. There are problems with IBM-designed IRQ13 behaviour.
+ * Don't touch unless you *really* know how it works.
+ */
+asmlinkage void math_state_restore(struct pt_regs regs)
+{
+       if (current->used_math) {
+               restore_fpu(current);
+       } else {
+               init_fpu();
+       }
+       current->flags |= PF_USEDFPU;   /* So we fnsave on switch_to() */
+}
+
+
+#define _set_gate(gate_addr,type,dpl,addr) \
+do { \
+  int __d0, __d1; \
+  __asm__ __volatile__ ("movw %%dx,%%ax\n\t" \
+       "movw %4,%%dx\n\t" \
+       "movl %%eax,%0\n\t" \
+       "movl %%edx,%1" \
+       :"=m" (*((long *) (gate_addr))), \
+        "=m" (*(1+(long *) (gate_addr))), "=&a" (__d0), "=&d" (__d1) \
+       :"i" ((short) (0x8000+(dpl<<13)+(type<<8))), \
+        "3" ((char *) (addr)),"2" (__KERNEL_CS << 16)); \
+} while (0)
+
+static void __init set_call_gate(void *a, void *addr)
+{
+       _set_gate(a,12,3,addr);
+}
+
+
+/* NB. All these are "trap gates" (i.e. events_mask isn't cleared). */
+static trap_info_t trap_table[] = {
+    {  0, 0, __KERNEL_CS, (unsigned long)divide_error                },
+    {  1, 0, __KERNEL_CS, (unsigned long)debug                       },
+    {  3, 3, __KERNEL_CS, (unsigned long)int3                        },
+    {  4, 3, __KERNEL_CS, (unsigned long)overflow                    },
+    {  5, 3, __KERNEL_CS, (unsigned long)bounds                      },
+    {  6, 0, __KERNEL_CS, (unsigned long)invalid_op                  },
+    {  7, 0, __KERNEL_CS, (unsigned long)device_not_available        },
+    {  8, 0, __KERNEL_CS, (unsigned long)double_fault                },
+    {  9, 0, __KERNEL_CS, (unsigned long)coprocessor_segment_overrun },
+    { 10, 0, __KERNEL_CS, (unsigned long)invalid_TSS                 },
+    { 11, 0, __KERNEL_CS, (unsigned long)segment_not_present         },
+    { 12, 0, __KERNEL_CS, (unsigned long)stack_segment               },
+    { 13, 0, __KERNEL_CS, (unsigned long)general_protection          },
+    { 14, 0, __KERNEL_CS, (unsigned long)page_fault                  },
+    { 15, 0, __KERNEL_CS, (unsigned long)spurious_interrupt_bug      },
+    { 16, 0, __KERNEL_CS, (unsigned long)coprocessor_error           },
+    { 17, 0, __KERNEL_CS, (unsigned long)alignment_check             },
+    { 18, 0, __KERNEL_CS, (unsigned long)machine_check               },
+    { 19, 0, __KERNEL_CS, (unsigned long)simd_coprocessor_error      },
+    { SYSCALL_VECTOR, 
+          3, __KERNEL_CS, (unsigned long)system_call                 },
+    {  0, 0,           0, 0                           }
+};
+    
+
+
+void __init trap_init(void)
+{
+    HYPERVISOR_set_trap_table(trap_table);    
+    HYPERVISOR_set_fast_trap(SYSCALL_VECTOR);
+
+    /*
+     * The default LDT is a single-entry callgate to lcall7 for iBCS and a
+     * callgate to lcall27 for Solaris/x86 binaries.
+     */
+    clear_page(&default_ldt[0]);
+    set_call_gate(&default_ldt[0],lcall7);
+    set_call_gate(&default_ldt[4],lcall27);
+    __make_page_readonly(&default_ldt[0]);
+
+    cpu_init();
+}
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/lib/Makefile b/xenolinux-2.4.22-sparse/arch/xeno/lib/Makefile
new file mode 100644 (file)
index 0000000..2224f03
--- /dev/null
@@ -0,0 +1,15 @@
+
+.S.o:
+       $(CC) $(AFLAGS) -c $< -o $*.o
+
+L_TARGET = lib.a
+
+obj-y = checksum.o old-checksum.o delay.o \
+       usercopy.o getuser.o \
+       memcpy.o strstr.o
+
+obj-$(CONFIG_X86_USE_3DNOW) += mmx.o
+obj-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.o
+obj-$(CONFIG_DEBUG_IOVIRT)  += iodebug.o
+
+include $(TOPDIR)/Rules.make
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/lib/delay.c b/xenolinux-2.4.22-sparse/arch/xeno/lib/delay.c
new file mode 100644 (file)
index 0000000..0035bed
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ *     Precise Delay Loops for i386
+ *
+ *     Copyright (C) 1993 Linus Torvalds
+ *     Copyright (C) 1997 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
+ *
+ *     The __delay function must _NOT_ be inlined as its execution time
+ *     depends wildly on alignment on many x86 processors. The additional
+ *     jump magic is needed to get the timing stable on all the CPU's
+ *     we have to worry about.
+ */
+
+#include <linux/config.h>
+#include <linux/sched.h>
+#include <linux/delay.h>
+#include <asm/processor.h>
+#include <asm/delay.h>
+
+#ifdef CONFIG_SMP
+#include <asm/smp.h>
+#endif
+
+void __delay(unsigned long loops)
+{
+       unsigned long bclock, now;
+       
+       rdtscl(bclock);
+       do
+       {
+               rep_nop();
+               rdtscl(now);
+       } while ((now-bclock) < loops);
+}
+
+inline void __const_udelay(unsigned long xloops)
+{
+       int d0;
+       __asm__("mull %0"
+               :"=d" (xloops), "=&a" (d0)
+               :"1" (xloops),"0" (current_cpu_data.loops_per_jiffy));
+        __delay(xloops * HZ);
+}
+
+void __udelay(unsigned long usecs)
+{
+       __const_udelay(usecs * 0x000010c6);  /* 2**32 / 1000000 */
+}
+
+void __ndelay(unsigned long nsecs)
+{
+       __const_udelay(nsecs * 0x00005);  /* 2**32 / 1000000000 (rounded up) */
+}
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/mm/Makefile b/xenolinux-2.4.22-sparse/arch/xeno/mm/Makefile
new file mode 100644 (file)
index 0000000..d0d1611
--- /dev/null
@@ -0,0 +1,16 @@
+#
+# Makefile for the linux i386-specific parts of the memory manager.
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definition is now in the main makefile...
+
+O_TARGET := mm.o
+
+obj-y   := init.o fault.o extable.o pageattr.o hypervisor.o ioremap.o
+
+export-objs := pageattr.o
+
+include $(TOPDIR)/Rules.make
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/mm/fault.c b/xenolinux-2.4.22-sparse/arch/xeno/mm/fault.c
new file mode 100644 (file)
index 0000000..d4d24d2
--- /dev/null
@@ -0,0 +1,325 @@
+/*
+ *  linux/arch/i386/mm/fault.c
+ *
+ *  Copyright (C) 1995  Linus Torvalds
+ */
+
+#include <linux/signal.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/types.h>
+#include <linux/ptrace.h>
+#include <linux/mman.h>
+#include <linux/mm.h>
+#include <linux/smp.h>
+#include <linux/smp_lock.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/tty.h>
+#include <linux/vt_kern.h>             /* For unblank_screen() */
+
+#include <asm/system.h>
+#include <asm/uaccess.h>
+#include <asm/pgalloc.h>
+#include <asm/hardirq.h>
+
+extern void die(const char *,struct pt_regs *,long);
+
+pgd_t *cur_pgd;
+
+extern spinlock_t timerlist_lock;
+
+/*
+ * Unlock any spinlocks which will prevent us from getting the
+ * message out (timerlist_lock is acquired through the
+ * console unblank code)
+ */
+void bust_spinlocks(int yes)
+{
+       spin_lock_init(&timerlist_lock);
+       if (yes) {
+               oops_in_progress = 1;
+       } else {
+               int loglevel_save = console_loglevel;
+#ifdef CONFIG_VT
+               unblank_screen();
+#endif
+               oops_in_progress = 0;
+               /*
+                * OK, the message is on the console.  Now we call printk()
+                * without oops_in_progress set so that printk will give klogd
+                * a poke.  Hold onto your hats...
+                */
+               console_loglevel = 15;          /* NMI oopser may have shut the console up */
+               printk(" ");
+               console_loglevel = loglevel_save;
+       }
+}
+
+/*
+ * This routine handles page faults.  It determines the address,
+ * and the problem, and then passes it off to one of the appropriate
+ * routines.
+ *
+ * error_code:
+ *     bit 0 == 0 means no page found, 1 means protection fault
+ *     bit 1 == 0 means read, 1 means write
+ *     bit 2 == 0 means kernel, 1 means user-mode
+ */
+asmlinkage void do_page_fault(struct pt_regs *regs, 
+                              unsigned long error_code,
+                              unsigned long address)
+{
+       struct task_struct *tsk = current;
+       struct mm_struct *mm;
+       struct vm_area_struct * vma;
+       unsigned long page;
+       unsigned long fixup;
+       int write;
+       siginfo_t info;
+
+        /* Set the "privileged fault" bit to something sane. */
+        error_code &= 3;
+        error_code |= (regs->xcs & 2) << 1;
+
+#if PT_UPDATE_DEBUG > 0
+        if ( (error_code == 0) && (address >= TASK_SIZE) )
+        {
+            unsigned long paddr = __pa(address);
+            int i;
+            for ( i = 0; i < pt_update_queue_idx; i++ )
+            {
+                if ( update_debug_queue[i].ptr == paddr )
+                {
+                    printk("XXX now(EIP=%08lx:ptr=%08lx) "
+                           "then(%s/%d:p/v=%08lx/%08lx)\n",
+                           regs->eip, address,
+                           update_debug_queue[i].file,
+                           update_debug_queue[i].line,
+                           update_debug_queue[i].ptr,
+                           update_debug_queue[i].val);
+                }
+            }
+        }
+#endif
+
+        if ( flush_page_update_queue() != 0 ) return;
+
+       /*
+        * We fault-in kernel-space virtual memory on-demand. The
+        * 'reference' page table is init_mm.pgd.
+        *
+        * NOTE! We MUST NOT take any locks for this case. We may
+        * be in an interrupt or a critical region, and should
+        * only copy the information from the master page table,
+        * nothing more.
+        *
+        * This verifies that the fault happens in kernel space
+        * (error_code & 4) == 0, and that the fault was not a
+        * protection error (error_code & 1) == 0.
+        */
+       if (address >= TASK_SIZE && !(error_code & 5))
+               goto vmalloc_fault;
+
+       mm = tsk->mm;
+       info.si_code = SEGV_MAPERR;
+
+       /*
+        * If we're in an interrupt or have no user
+        * context, we must not take the fault..
+        */
+       if (in_interrupt() || !mm)
+               goto no_context;
+
+       down_read(&mm->mmap_sem);
+
+       vma = find_vma(mm, address);
+       if (!vma)
+               goto bad_area;
+       if (vma->vm_start <= address)
+               goto good_area;
+       if (!(vma->vm_flags & VM_GROWSDOWN))
+               goto bad_area;
+       if (error_code & 4) {
+               /*
+                * accessing the stack below %esp is always a bug.
+                * The "+ 32" is there due to some instructions (like
+                * pusha) doing post-decrement on the stack and that
+                * doesn't show up until later..
+                */
+               if (address + 32 < regs->esp)
+                       goto bad_area;
+       }
+       if (expand_stack(vma, address))
+               goto bad_area;
+/*
+ * Ok, we have a good vm_area for this memory access, so
+ * we can handle it..
+ */
+good_area:
+       info.si_code = SEGV_ACCERR;
+       write = 0;
+       switch (error_code & 3) {
+               default:        /* 3: write, present */
+                       /* fall through */
+               case 2:         /* write, not present */
+                       if (!(vma->vm_flags & VM_WRITE))
+                               goto bad_area;
+                       write++;
+                       break;
+               case 1:         /* read, present */
+                       goto bad_area;
+               case 0:         /* read, not present */
+                       if (!(vma->vm_flags & (VM_READ | VM_EXEC)))
+                               goto bad_area;
+       }
+
+ survive:
+       /*
+        * If for any reason at all we couldn't handle the fault,
+        * make sure we exit gracefully rather than endlessly redo
+        * the fault.
+        */
+       switch (handle_mm_fault(mm, vma, address, write)) {
+       case 1:
+               tsk->min_flt++;
+               break;
+       case 2:
+               tsk->maj_flt++;
+               break;
+       case 0:
+               goto do_sigbus;
+       default:
+               goto out_of_memory;
+       }
+
+       up_read(&mm->mmap_sem);
+       return;
+
+/*
+ * Something tried to access memory that isn't in our memory map..
+ * Fix it, but check if it's kernel or user first..
+ */
+bad_area:
+       up_read(&mm->mmap_sem);
+
+       /* User mode accesses just cause a SIGSEGV */
+       if (error_code & 4) {
+               tsk->thread.cr2 = address;
+               tsk->thread.error_code = error_code;
+               tsk->thread.trap_no = 14;
+               info.si_signo = SIGSEGV;
+               info.si_errno = 0;
+               /* info.si_code has been set above */
+               info.si_addr = (void *)address;
+               force_sig_info(SIGSEGV, &info, tsk);
+               return;
+       }
+
+no_context:
+       /* Are we prepared to handle this kernel fault?  */
+       if ((fixup = search_exception_table(regs->eip)) != 0) {
+               regs->eip = fixup;
+               return;
+       }
+
+/*
+ * Oops. The kernel tried to access some bad page. We'll have to
+ * terminate things with extreme prejudice.
+ */
+
+       bust_spinlocks(1);
+
+       if (address < PAGE_SIZE)
+               printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference");
+       else
+               printk(KERN_ALERT "Unable to handle kernel paging request");
+       printk(" at virtual address %08lx\n",address);
+       printk(" printing eip:\n");
+       printk("%08lx\n", regs->eip);
+        page = ((unsigned long *) cur_pgd)[address >> 22];
+        printk(KERN_ALERT "*pde=%08lx(%08lx)\n", page, machine_to_phys(page));
+       if (page & 1) {
+               page &= PAGE_MASK;
+               address &= 0x003ff000;
+                page = machine_to_phys(page);
+               page = ((unsigned long *) __va(page))[address >> PAGE_SHIFT];
+                printk(KERN_ALERT "*pte=%08lx(%08lx)\n", page, 
+                       machine_to_phys(page));
+       }
+       die("Oops", regs, error_code);
+       bust_spinlocks(0);
+       do_exit(SIGKILL);
+
+/*
+ * We ran out of memory, or some other thing happened to us that made
+ * us unable to handle the page fault gracefully.
+ */
+out_of_memory:
+       if (tsk->pid == 1) {
+               yield();
+               goto survive;
+       }
+       up_read(&mm->mmap_sem);
+       printk("VM: killing process %s\n", tsk->comm);
+       if (error_code & 4)
+               do_exit(SIGKILL);
+       goto no_context;
+
+do_sigbus:
+       up_read(&mm->mmap_sem);
+
+       /*
+        * Send a sigbus, regardless of whether we were in kernel
+        * or user mode.
+        */
+       tsk->thread.cr2 = address;
+       tsk->thread.error_code = error_code;
+       tsk->thread.trap_no = 14;
+       info.si_signo = SIGBUS;
+       info.si_errno = 0;
+       info.si_code = BUS_ADRERR;
+       info.si_addr = (void *)address;
+       force_sig_info(SIGBUS, &info, tsk);
+
+       /* Kernel mode? Handle exceptions or die */
+       if (!(error_code & 4))
+               goto no_context;
+       return;
+
+vmalloc_fault:
+       {
+               /*
+                * Synchronize this task's top level page-table
+                * with the 'reference' page table.
+                *
+                * Do _not_ use "tsk" here. We might be inside
+                * an interrupt in the middle of a task switch..
+                */
+               int offset = __pgd_offset(address);
+               pgd_t *pgd, *pgd_k;
+               pmd_t *pmd, *pmd_k;
+               pte_t *pte_k;
+
+               pgd = offset + cur_pgd;
+               pgd_k = init_mm.pgd + offset;
+
+               if (!pgd_present(*pgd_k))
+                       goto no_context;
+               set_pgd(pgd, *pgd_k);
+               
+               pmd = pmd_offset(pgd, address);
+               pmd_k = pmd_offset(pgd_k, address);
+               if (!pmd_present(*pmd_k))
+                       goto no_context;
+               set_pmd(pmd, *pmd_k);
+                XENO_flush_page_update_queue(); /* flush PMD update */
+
+               pte_k = pte_offset(pmd_k, address);
+               if (!pte_present(*pte_k))
+                       goto no_context;
+               return;
+       }
+}
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/mm/hypervisor.c b/xenolinux-2.4.22-sparse/arch/xeno/mm/hypervisor.c
new file mode 100644 (file)
index 0000000..1935595
--- /dev/null
@@ -0,0 +1,238 @@
+/******************************************************************************
+ * xeno/mm/hypervisor.c
+ * 
+ * Update page tables via the hypervisor.
+ * 
+ * Copyright (c) 2002, K A Fraser
+ */
+
+#include <linux/config.h>
+#include <linux/sched.h>
+#include <asm/hypervisor.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
+#include <asm/multicall.h>
+
+/*
+ * This suffices to protect us if we ever move to SMP domains.
+ * Further, it protects us against interrupts. At the very least, this is
+ * required for the network driver which flushes the update queue before
+ * pushing new receive buffers.
+ */
+static spinlock_t update_lock = SPIN_LOCK_UNLOCKED;
+
+#define QUEUE_SIZE 2048
+static page_update_request_t update_queue[QUEUE_SIZE];
+unsigned int pt_update_queue_idx = 0;
+#define idx pt_update_queue_idx
+
+#if PT_UPDATE_DEBUG > 0
+page_update_debug_t update_debug_queue[QUEUE_SIZE] = {{0}};
+#undef queue_l1_entry_update
+#undef queue_l2_entry_update
+static void DEBUG_allow_pt_reads(void)
+{
+    pte_t *pte;
+    page_update_request_t update;
+    int i;
+    for ( i = idx-1; i >= 0; i-- )
+    {
+        pte = update_debug_queue[i].ptep;
+        if ( pte == NULL ) continue;
+        update_debug_queue[i].ptep = NULL;
+        update.ptr = phys_to_machine(__pa(pte));
+        update.val = update_debug_queue[i].pteval;
+        HYPERVISOR_pt_update(&update, 1);
+    }
+}
+static void DEBUG_disallow_pt_read(unsigned long pa)
+{
+    pte_t *pte;
+    pmd_t *pmd;
+    pgd_t *pgd;
+    unsigned long pteval;
+    /*
+     * We may fault because of an already outstanding update.
+     * That's okay -- it'll get fixed up in the fault handler.
+     */
+    page_update_request_t update;
+    unsigned long va = (unsigned long)__va(pa);
+    pgd = pgd_offset_k(va);
+    pmd = pmd_offset(pgd, va);
+    pte = pte_offset(pmd, va);
+    update.ptr = phys_to_machine(__pa(pte));
+    pteval = *(unsigned long *)pte;
+    update.val = pteval & ~_PAGE_PRESENT;
+    HYPERVISOR_pt_update(&update, 1);
+    update_debug_queue[idx].ptep = pte;
+    update_debug_queue[idx].pteval = pteval;
+}
+#endif
+
+#if PT_UPDATE_DEBUG > 1
+#undef queue_pt_switch
+#undef queue_tlb_flush
+#undef queue_invlpg
+#undef queue_pgd_pin
+#undef queue_pgd_unpin
+#undef queue_pte_pin
+#undef queue_pte_unpin
+#endif
+
+
+/*
+ * MULTICALL_flush_page_update_queue:
+ *   This is a version of the flush which queues as part of a multicall.
+ */
+void MULTICALL_flush_page_update_queue(void)
+{
+    unsigned long flags;
+    spin_lock_irqsave(&update_lock, flags);
+    if ( idx != 0 ) 
+    {
+#if PT_UPDATE_DEBUG > 1
+        printk("Flushing %d entries from pt update queue\n", idx);
+#endif
+#if PT_UPDATE_DEBUG > 0
+        DEBUG_allow_pt_reads();
+#endif
+        queue_multicall2(__HYPERVISOR_pt_update, (unsigned long)update_queue, idx);
+        idx = 0;
+    }
+    spin_unlock_irqrestore(&update_lock, flags);
+}
+
+static inline void __flush_page_update_queue(void)
+{
+#if PT_UPDATE_DEBUG > 1
+    printk("Flushing %d entries from pt update queue\n", idx);
+#endif
+#if PT_UPDATE_DEBUG > 0
+    DEBUG_allow_pt_reads();
+#endif
+    HYPERVISOR_pt_update(update_queue, idx);
+    idx = 0;
+}
+
+void _flush_page_update_queue(void)
+{
+    unsigned long flags;
+    spin_lock_irqsave(&update_lock, flags);
+    if ( idx != 0 ) __flush_page_update_queue();
+    spin_unlock_irqrestore(&update_lock, flags);
+}
+
+static inline void increment_index(void)
+{
+    idx++;
+    if ( unlikely(idx == QUEUE_SIZE) ) __flush_page_update_queue();
+}
+
+void queue_l1_entry_update(unsigned long ptr, unsigned long val)
+{
+    unsigned long flags;
+    spin_lock_irqsave(&update_lock, flags);
+#if PT_UPDATE_DEBUG > 0
+    DEBUG_disallow_pt_read(ptr);
+#endif
+    update_queue[idx].ptr = phys_to_machine(ptr);
+    update_queue[idx].val = val;
+    increment_index();
+    spin_unlock_irqrestore(&update_lock, flags);
+}
+
+void queue_l2_entry_update(unsigned long ptr, unsigned long val)
+{
+    unsigned long flags;
+    spin_lock_irqsave(&update_lock, flags);
+    update_queue[idx].ptr = phys_to_machine(ptr);
+    update_queue[idx].val = val;
+    increment_index();
+    spin_unlock_irqrestore(&update_lock, flags);
+}
+
+void queue_pt_switch(unsigned long ptr)
+{
+    unsigned long flags;
+    spin_lock_irqsave(&update_lock, flags);
+    update_queue[idx].ptr  = phys_to_machine(ptr);
+    update_queue[idx].ptr |= PGREQ_EXTENDED_COMMAND;
+    update_queue[idx].val  = PGEXT_NEW_BASEPTR;
+    increment_index();
+    spin_unlock_irqrestore(&update_lock, flags);
+}
+
+void queue_tlb_flush(void)
+{
+    unsigned long flags;
+    spin_lock_irqsave(&update_lock, flags);
+    update_queue[idx].ptr  = PGREQ_EXTENDED_COMMAND;
+    update_queue[idx].val  = PGEXT_TLB_FLUSH;
+    increment_index();
+    spin_unlock_irqrestore(&update_lock, flags);
+}
+
+void queue_invlpg(unsigned long ptr)
+{
+    unsigned long flags;
+    spin_lock_irqsave(&update_lock, flags);
+    update_queue[idx].ptr  = PGREQ_EXTENDED_COMMAND;
+    update_queue[idx].val  = ptr & PAGE_MASK;
+    update_queue[idx].val |= PGEXT_INVLPG;
+    increment_index();
+    spin_unlock_irqrestore(&update_lock, flags);
+}
+
+void queue_pgd_pin(unsigned long ptr)
+{
+    unsigned long flags;
+    spin_lock_irqsave(&update_lock, flags);
+    update_queue[idx].ptr  = phys_to_machine(ptr);
+    update_queue[idx].ptr |= PGREQ_EXTENDED_COMMAND;
+    update_queue[idx].val  = PGEXT_PIN_L2_TABLE;
+    increment_index();
+    spin_unlock_irqrestore(&update_lock, flags);
+}
+
+void queue_pgd_unpin(unsigned long ptr)
+{
+    unsigned long flags;
+    spin_lock_irqsave(&update_lock, flags);
+    update_queue[idx].ptr  = phys_to_machine(ptr);
+    update_queue[idx].ptr |= PGREQ_EXTENDED_COMMAND;
+    update_queue[idx].val  = PGEXT_UNPIN_TABLE;
+    increment_index();
+    spin_unlock_irqrestore(&update_lock, flags);
+}
+
+void queue_pte_pin(unsigned long ptr)
+{
+    unsigned long flags;
+    spin_lock_irqsave(&update_lock, flags);
+    update_queue[idx].ptr  = phys_to_machine(ptr);
+    update_queue[idx].ptr |= PGREQ_EXTENDED_COMMAND;
+    update_queue[idx].val  = PGEXT_PIN_L1_TABLE;
+    increment_index();
+    spin_unlock_irqrestore(&update_lock, flags);
+}
+
+void queue_pte_unpin(unsigned long ptr)
+{
+    unsigned long flags;
+    spin_lock_irqsave(&update_lock, flags);
+    update_queue[idx].ptr  = phys_to_machine(ptr);
+    update_queue[idx].ptr |= PGREQ_EXTENDED_COMMAND;
+    update_queue[idx].val  = PGEXT_UNPIN_TABLE;
+    increment_index();
+    spin_unlock_irqrestore(&update_lock, flags);
+}
+
+void queue_set_ldt(unsigned long ptr, unsigned long len)
+{
+    unsigned long flags;
+    spin_lock_irqsave(&update_lock, flags);
+    update_queue[idx].ptr  = PGREQ_EXTENDED_COMMAND | ptr;
+    update_queue[idx].val  = PGEXT_SET_LDT | (len << PGEXT_CMD_SHIFT);
+    increment_index();
+    spin_unlock_irqrestore(&update_lock, flags);
+}
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/mm/init.c b/xenolinux-2.4.22-sparse/arch/xeno/mm/init.c
new file mode 100644 (file)
index 0000000..acce1fb
--- /dev/null
@@ -0,0 +1,394 @@
+/*
+ *  linux/arch/i386/mm/init.c
+ *
+ *  Copyright (C) 1995  Linus Torvalds
+ *
+ *  Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
+ */
+
+#include <linux/config.h>
+#include <linux/signal.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/types.h>
+#include <linux/ptrace.h>
+#include <linux/mman.h>
+#include <linux/mm.h>
+#include <linux/swap.h>
+#include <linux/smp.h>
+#include <linux/init.h>
+#ifdef CONFIG_BLK_DEV_INITRD
+#include <linux/blk.h>
+#endif
+#include <linux/highmem.h>
+#include <linux/pagemap.h>
+#include <linux/bootmem.h>
+#include <linux/slab.h>
+
+#include <asm/processor.h>
+#include <asm/system.h>
+#include <asm/uaccess.h>
+#include <asm/pgtable.h>
+#include <asm/pgalloc.h>
+#include <asm/dma.h>
+#include <asm/apic.h>
+#include <asm/tlb.h>
+
+mmu_gather_t mmu_gathers[NR_CPUS];
+unsigned long highstart_pfn, highend_pfn;
+static unsigned long totalram_pages;
+static unsigned long totalhigh_pages;
+
+int do_check_pgt_cache(int low, int high)
+{
+       int freed = 0;
+       if(pgtable_cache_size > high) {
+               do {
+            if (!QUICKLIST_EMPTY(pgd_quicklist)) {
+                               free_pgd_slow(get_pgd_fast());
+                               freed++;
+                       }
+            if (!QUICKLIST_EMPTY(pte_quicklist)) {
+                               pte_free_slow(pte_alloc_one_fast(NULL, 0));
+                               freed++;
+                       }
+               } while(pgtable_cache_size > low);
+       }
+       return freed;
+}
+
+void show_mem(void)
+{
+       int i, total = 0, reserved = 0;
+       int shared = 0, cached = 0;
+       int highmem = 0;
+
+       printk("Mem-info:\n");
+       show_free_areas();
+       printk("Free swap:       %6dkB\n",nr_swap_pages<<(PAGE_SHIFT-10));
+       i = max_mapnr;
+       while (i-- > 0) {
+               total++;
+               if (PageHighMem(mem_map+i))
+                       highmem++;
+               if (PageReserved(mem_map+i))
+                       reserved++;
+               else if (PageSwapCache(mem_map+i))
+                       cached++;
+               else if (page_count(mem_map+i))
+                       shared += page_count(mem_map+i) - 1;
+       }
+       printk("%d pages of RAM\n", total);
+       printk("%d pages of HIGHMEM\n",highmem);
+       printk("%d reserved pages\n",reserved);
+       printk("%d pages shared\n",shared);
+       printk("%d pages swap cached\n",cached);
+       printk("%ld pages in page table cache\n",pgtable_cache_size);
+       show_buffers();
+}
+
+/* References to section boundaries */
+
+extern char _text, _etext, _edata, __bss_start, _end;
+extern char __init_begin, __init_end;
+
+static inline void set_pte_phys (unsigned long vaddr,
+                       unsigned long phys, pgprot_t flags)
+{
+       pgprot_t prot;
+       pgd_t *pgd;
+       pmd_t *pmd;
+       pte_t *pte;
+
+    pgd = init_mm.pgd + __pgd_offset(vaddr);
+       if (pgd_none(*pgd)) {
+               printk("PAE BUG #00!\n");
+               return;
+       }
+       pmd = pmd_offset(pgd, vaddr);
+       if (pmd_none(*pmd)) {
+               printk("PAE BUG #01!\n");
+               return;
+       }
+       pte = pte_offset(pmd, vaddr);
+
+       if (pte_val(*pte))
+               pte_ERROR(*pte);
+
+       pgprot_val(prot) = pgprot_val(PAGE_KERNEL) | pgprot_val(flags);
+
+       /* We queue directly, avoiding hidden phys->machine translation. */
+       queue_l1_entry_update(__pa(pte), phys | pgprot_val(prot));
+
+       /*
+        * It's enough to flush this one mapping.
+        * (PGE mappings get flushed as well)
+        */
+       __flush_tlb_one(vaddr);
+}
+
+void __set_fixmap (enum fixed_addresses idx, unsigned long phys, 
+                   pgprot_t flags)
+{
+       unsigned long address = __fix_to_virt(idx);
+
+       if (idx >= __end_of_fixed_addresses) {
+               printk("Invalid __set_fixmap\n");
+               return;
+       }
+       set_pte_phys(address, phys, flags);
+}
+
+static void __init fixrange_init (unsigned long start, 
+                                  unsigned long end, pgd_t *pgd_base)
+{
+       pgd_t *pgd, *kpgd;
+       pmd_t *pmd, *kpmd;
+       pte_t *pte, *kpte;
+       int i, j;
+       unsigned long vaddr;
+
+       vaddr = start;
+       i = __pgd_offset(vaddr);
+       j = __pmd_offset(vaddr);
+       pgd = pgd_base + i;
+
+       for ( ; (i < PTRS_PER_PGD) && (vaddr != end); pgd++, i++) {
+#if CONFIG_X86_PAE
+               if (pgd_none(*pgd)) {
+                       pmd = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);
+                       set_pgd(pgd, __pgd(__pa(pmd) + 0x1));
+                       if (pmd != pmd_offset(pgd, 0))
+                               printk("PAE BUG #02!\n");
+               }
+               pmd = pmd_offset(pgd, vaddr);
+#else
+               pmd = (pmd_t *)pgd;
+#endif
+               for (; (j < PTRS_PER_PMD) && (vaddr != end); pmd++, j++) {
+                       if (pmd_none(*pmd)) {
+                               pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
+                               clear_page(pte);
+                               kpgd = pgd_offset_k((unsigned long)pte);
+                               kpmd = pmd_offset(kpgd, (unsigned long)pte);
+                               kpte = pte_offset(kpmd, (unsigned long)pte);
+                               queue_l1_entry_update(__pa(kpte),
+                                      (*(unsigned long *)kpte)&~_PAGE_RW);
+
+                               set_pmd(pmd, __pmd(_KERNPG_TABLE + __pa(pte)));
+
+                               // XXX Xen below reqd ?
+                               //if (pte != pte_offset(pmd, 0))
+                               //      BUG();
+                       }
+                       vaddr += PMD_SIZE;
+               }
+               j = 0;
+       }
+       
+       XENO_flush_page_update_queue();
+}
+
+
+static void __init zone_sizes_init(void)
+{
+       unsigned long zones_size[MAX_NR_ZONES] = {0, 0, 0};
+       unsigned int max_dma, high, low;
+
+       max_dma = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT;
+       low = max_low_pfn;
+       high = highend_pfn;
+
+       if (low < max_dma)
+               zones_size[ZONE_DMA] = low;
+       else {
+               zones_size[ZONE_DMA] = max_dma;
+               zones_size[ZONE_NORMAL] = low - max_dma;
+#ifdef CONFIG_HIGHMEM
+               zones_size[ZONE_HIGHMEM] = high - low;
+#endif
+       }
+       free_area_init(zones_size);
+}
+
+/*
+ * paging_init() sets up the page tables - note that the first 8MB are
+ * already mapped by head.S.
+ *
+ * This routines also unmaps the page at virtual kernel address 0, so
+ * that we can trap those pesky NULL-reference errors in the kernel.
+ */
+void __init paging_init(void)
+{
+       unsigned long vaddr;
+
+       zone_sizes_init();
+
+       /*
+        * Fixed mappings, only the page table structure has to be created -
+        * mappings will be set by set_fixmap():
+        */
+       vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK;
+       fixrange_init(vaddr, HYPERVISOR_VIRT_START, init_mm.pgd);
+
+       /* Cheesy: this can probably be moved to the blkdev driver. */
+       set_fixmap(FIX_BLKRING_BASE, start_info.blk_ring);
+
+#ifdef CONFIG_HIGHMEM
+#error
+       kmap_init();
+#endif
+}
+
+static inline int page_is_ram (unsigned long pagenr)
+{
+       return 1;
+}
+
+#ifdef CONFIG_HIGHMEM
+void __init one_highpage_init(struct page *page, int pfn, int bad_ppro)
+{
+       if (!page_is_ram(pfn)) {
+               SetPageReserved(page);
+               return;
+       }
+       
+       if (bad_ppro && page_kills_ppro(pfn)) {
+               SetPageReserved(page);
+               return;
+       }
+       
+       ClearPageReserved(page);
+       set_bit(PG_highmem, &page->flags);
+       atomic_set(&page->count, 1);
+       __free_page(page);
+       totalhigh_pages++;
+}
+#endif /* CONFIG_HIGHMEM */
+
+static void __init set_max_mapnr_init(void)
+{
+#ifdef CONFIG_HIGHMEM
+        highmem_start_page = mem_map + highstart_pfn;
+        max_mapnr = num_physpages = highend_pfn;
+        num_mappedpages = max_low_pfn;
+#else
+        max_mapnr = num_mappedpages = num_physpages = max_low_pfn;
+#endif
+}
+
+static int __init free_pages_init(void)
+{
+#ifdef CONFIG_HIGHMEM
+#error Where is this supposed to be initialised?
+        int bad_ppro;
+#endif
+       int reservedpages, pfn;
+
+       /* this will put all low memory onto the freelists */
+       totalram_pages += free_all_bootmem();
+
+       reservedpages = 0;
+       for (pfn = 0; pfn < max_low_pfn; pfn++) {
+               /*
+                * Only count reserved RAM pages
+                */
+               if (page_is_ram(pfn) && PageReserved(mem_map+pfn))
+                       reservedpages++;
+       }
+#ifdef CONFIG_HIGHMEM
+       for (pfn = highend_pfn-1; pfn >= highstart_pfn; pfn--)
+               one_highpage_init((struct page *) (mem_map + pfn), pfn, bad_ppro);
+       totalram_pages += totalhigh_pages;
+#endif
+       return reservedpages;
+}
+
+void __init mem_init(void)
+{
+       int codesize, reservedpages, datasize, initsize;
+
+       if (!mem_map)
+               BUG();
+       
+       set_max_mapnr_init();
+
+       high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);
+
+       /* clear the zero-page */
+       memset(empty_zero_page, 0, PAGE_SIZE);
+
+       reservedpages = free_pages_init();
+
+       codesize =  (unsigned long) &_etext - (unsigned long) &_text;
+       datasize =  (unsigned long) &_edata - (unsigned long) &_etext;
+       initsize =  (unsigned long) &__init_end - (unsigned long) &__init_begin;
+
+       printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, %dk reserved, %dk data, %dk init, %ldk highmem)\n",
+               (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
+               max_mapnr << (PAGE_SHIFT-10),
+               codesize >> 10,
+               reservedpages << (PAGE_SHIFT-10),
+               datasize >> 10,
+               initsize >> 10,
+               (unsigned long) (totalhigh_pages << (PAGE_SHIFT-10))
+              );
+
+    boot_cpu_data.wp_works_ok = 1;
+}
+
+void free_initmem(void)
+{
+       unsigned long addr;
+
+       addr = (unsigned long)(&__init_begin);
+       for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
+               ClearPageReserved(virt_to_page(addr));
+               set_page_count(virt_to_page(addr), 1);
+               free_page(addr);
+               totalram_pages++;
+       }
+       printk (KERN_INFO "Freeing unused kernel memory: %dk freed\n", (&__init_end - &__init_begin) >> 10);
+}
+
+#ifdef CONFIG_BLK_DEV_INITRD
+void free_initrd_mem(unsigned long start, unsigned long end)
+{
+       if (start < end)
+               printk (KERN_INFO "Freeing initrd memory: %ldk freed\n", (end - start) >> 10);
+       for (; start < end; start += PAGE_SIZE) {
+               ClearPageReserved(virt_to_page(start));
+               set_page_count(virt_to_page(start), 1);
+               free_page(start);
+               totalram_pages++;
+       }
+}
+#endif
+
+void si_meminfo(struct sysinfo *val)
+{
+       val->totalram = totalram_pages;
+       val->sharedram = 0;
+       val->freeram = nr_free_pages();
+       val->bufferram = atomic_read(&buffermem_pages);
+       val->totalhigh = totalhigh_pages;
+       val->freehigh = nr_free_highpages();
+       val->mem_unit = PAGE_SIZE;
+       return;
+}
+
+#if defined(CONFIG_X86_PAE)
+struct kmem_cache_s *pae_pgd_cachep;
+void __init pgtable_cache_init(void)
+{
+       /*
+        * PAE pgds must be 16-byte aligned:
+        */
+       pae_pgd_cachep = kmem_cache_create("pae_pgd", 32, 0,
+               SLAB_HWCACHE_ALIGN | SLAB_MUST_HWCACHE_ALIGN, NULL, NULL);
+       if (!pae_pgd_cachep)
+               panic("init_pae(): Cannot alloc pae_pgd SLAB cache");
+}
+#endif /* CONFIG_X86_PAE */
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/mm/ioremap.c b/xenolinux-2.4.22-sparse/arch/xeno/mm/ioremap.c
new file mode 100644 (file)
index 0000000..d537956
--- /dev/null
@@ -0,0 +1,227 @@
+/*
+ * arch/xeno/mm/ioremap.c
+ *
+ * Re-map IO memory to kernel address space so that we can access it.
+ *
+ * (C) Copyright 1995 1996 Linus Torvalds
+ *
+ * Modifications for Xenolinux (c) 2003 Keir Fraser
+ */
+
+#include <linux/slab.h>
+#include <linux/mm.h>
+#include <linux/mman.h>
+#include <linux/vmalloc.h>
+#include <asm/io.h>
+#include <asm/pgalloc.h>
+#include <asm/uaccess.h>
+#include <asm/tlb.h>
+#include <asm/mmu.h>
+
+#if defined(CONFIG_XENO_PRIV)
+
+#define direct_set_pte(pteptr, pteval) \
+  queue_l1_entry_update(__pa(pteptr)|PGREQ_UNCHECKED_UPDATE, (pteval).pte_low)
+#define __direct_pte(x) ((pte_t) { (x) } )
+#define __direct_mk_pte(page_nr,pgprot) \
+  __direct_pte(((page_nr) << PAGE_SHIFT) | pgprot_val(pgprot))
+#define direct_mk_pte_phys(physpage, pgprot) \
+  __direct_mk_pte((physpage) >> PAGE_SHIFT, pgprot)
+
+
+static inline void direct_remap_area_pte(pte_t *pte, 
+                                         unsigned long address, 
+                                         unsigned long size,
+                                         unsigned long machine_addr, 
+                                         pgprot_t prot)
+{
+    unsigned long end;
+
+    address &= ~PMD_MASK;
+    end = address + size;
+    if (end > PMD_SIZE)
+        end = PMD_SIZE;
+    if (address >= end)
+        BUG();
+    do {
+        if (!pte_none(*pte)) {
+            printk("direct_remap_area_pte: page already exists\n");
+            BUG();
+        }
+        direct_set_pte(pte, pte_mkio(direct_mk_pte_phys(machine_addr, prot))); 
+        address += PAGE_SIZE;
+        machine_addr += PAGE_SIZE;
+        pte++;
+    } while (address && (address < end));
+}
+
+static inline int direct_remap_area_pmd(struct mm_struct *mm,
+                                        pmd_t *pmd, 
+                                        unsigned long address, 
+                                        unsigned long size,
+                                        unsigned long machine_addr,
+                                        pgprot_t prot)
+{
+    unsigned long end;
+
+    address &= ~PGDIR_MASK;
+    end = address + size;
+    if (end > PGDIR_SIZE)
+        end = PGDIR_SIZE;
+    machine_addr -= address;
+    if (address >= end)
+        BUG();
+    do {
+        pte_t * pte = pte_alloc(mm, pmd, address);
+        if (!pte)
+            return -ENOMEM;
+        direct_remap_area_pte(pte, address, end - address, 
+                              address + machine_addr, prot);
+        address = (address + PMD_SIZE) & PMD_MASK;
+        pmd++;
+    } while (address && (address < end));
+    return 0;
+}
+int direct_remap_area_pages(struct mm_struct *mm,
+                            unsigned long address, 
+                            unsigned long machine_addr,
+                            unsigned long size, 
+                            pgprot_t prot)
+{
+    int error = 0;
+    pgd_t * dir;
+    unsigned long end = address + size;
+
+    machine_addr -= address;
+    dir = pgd_offset(mm, address);
+    flush_cache_all();
+    if (address >= end)
+        BUG();
+    spin_lock(&mm->page_table_lock);
+    do {
+        pmd_t *pmd = pmd_alloc(mm, dir, address);
+        error = -ENOMEM;
+        if (!pmd)
+            break;
+        error = direct_remap_area_pmd(mm, pmd, address, end - address,
+                                      machine_addr + address, prot);
+        if (error)
+            break;
+        address = (address + PGDIR_SIZE) & PGDIR_MASK;
+        dir++;
+    } while (address && (address < end));
+    spin_unlock(&mm->page_table_lock);
+    flush_tlb_all();
+    return error;
+}
+
+#endif /* CONFIG_XENO_PRIV */
+
+
+/*
+ * Remap an arbitrary machine address space into the kernel virtual
+ * address space. Needed when a privileged instance of Xenolinux wants
+ * to access space outside its world directly.
+ *
+ * NOTE! We need to allow non-page-aligned mappings too: we will obviously
+ * have to convert them into an offset in a page-aligned mapping, but the
+ * caller shouldn't need to know that small detail.
+ */
+void * __ioremap(unsigned long machine_addr, 
+                 unsigned long size, 
+                 unsigned long flags)
+{
+#if defined(CONFIG_XENO_PRIV)
+    void * addr;
+    struct vm_struct * area;
+    unsigned long offset, last_addr;
+    pgprot_t prot;
+
+    /* Only privileged Xenolinux can make unchecked pagetable updates. */
+    if ( !(start_info.flags & SIF_PRIVILEGED) )
+        return NULL;
+
+    /* Don't allow wraparound or zero size */
+    last_addr = machine_addr + size - 1;
+    if (!size || last_addr < machine_addr)
+        return NULL;
+
+    /* Mappings have to be page-aligned */
+    offset = machine_addr & ~PAGE_MASK;
+    machine_addr &= PAGE_MASK;
+    size = PAGE_ALIGN(last_addr) - machine_addr;
+
+    /* Ok, go for it */
+    area = get_vm_area(size, VM_IOREMAP);
+    if (!area)
+        return NULL;
+    addr = area->addr;
+    prot = __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | 
+                    _PAGE_ACCESSED | flags);
+    if (direct_remap_area_pages(&init_mm, VMALLOC_VMADDR(addr), 
+                                machine_addr, size, prot)) {
+        vfree(addr);
+        return NULL;
+    }
+    return (void *) (offset + (char *)addr);
+#else
+    return NULL;
+#endif
+}
+
+void iounmap(void *addr)
+{
+    vfree((void *)((unsigned long)addr & PAGE_MASK));
+}
+
+/* implementation of boot time ioremap for purpose of provising access
+to the vga console for privileged domains. Unlike boot time ioremap on 
+other architectures, ours is permanent and not reclaimed when then vmalloc
+infrastructure is started */
+
+void __init *bt_ioremap(unsigned long machine_addr, unsigned long size)
+{
+        unsigned long offset, last_addr;
+        unsigned int nrpages;
+        enum fixed_addresses idx;
+
+        /* Don't allow wraparound or zero size */
+        last_addr = machine_addr + size - 1;
+        if (!size || last_addr < machine_addr)
+                return NULL;
+
+        /*
+         * Mappings have to be page-aligned
+         */
+        offset = machine_addr & ~PAGE_MASK;
+        machine_addr &= PAGE_MASK;
+        size = PAGE_ALIGN(last_addr) - machine_addr;
+
+        /*
+         * Mappings have to fit in the FIX_BTMAP area.
+         */
+        nrpages = size >> PAGE_SHIFT;
+        if (nrpages > NR_FIX_BTMAPS)
+                return NULL;
+
+        /*
+         * Ok, go for it..
+         */
+        idx = FIX_BTMAP_BEGIN;
+        while (nrpages > 0) {
+                set_fixmap(idx, machine_addr);
+                machine_addr += PAGE_SIZE;
+                --idx;
+                --nrpages;
+        }
+
+       flush_tlb_all();
+
+        return (void*) (offset + fix_to_virt(FIX_BTMAP_BEGIN));
+}
+
+
+#if 0 /* We don't support these functions. They shouldn't be required. */
+void __init bt_iounmap(void *addr, unsigned long size) {}
+#endif
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/vmlinux.lds b/xenolinux-2.4.22-sparse/arch/xeno/vmlinux.lds
new file mode 100644 (file)
index 0000000..7c4c4f8
--- /dev/null
@@ -0,0 +1,82 @@
+/* ld script to make i386 Linux kernel
+ * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>;
+ */
+OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
+OUTPUT_ARCH(i386)
+ENTRY(_start)
+SECTIONS
+{
+  . = 0xC0000000 + 0x000000;
+  _text = .;                   /* Text and read-only data */
+  .text : {
+       *(.text)
+       *(.fixup)
+       *(.gnu.warning)
+       } = 0x9090
+
+  _etext = .;                  /* End of text section */
+
+  .rodata : { *(.rodata) *(.rodata.*) }
+  .kstrtab : { *(.kstrtab) }
+
+  . = ALIGN(16);               /* Exception table */
+  __start___ex_table = .;
+  __ex_table : { *(__ex_table) }
+  __stop___ex_table = .;
+
+  __start___ksymtab = .;       /* Kernel symbol table */
+  __ksymtab : { *(__ksymtab) }
+  __stop___ksymtab = .;
+
+  .data : {                    /* Data */
+       *(.data)
+       CONSTRUCTORS
+       }
+
+  _edata = .;                  /* End of data section */
+
+  . = ALIGN(8192);             /* init_task */
+  .data.init_task : { *(.data.init_task) }
+
+  . = ALIGN(4096);             /* Init code and data */
+  __init_begin = .;
+  .text.init : { *(.text.init) }
+  .data.init : { *(.data.init) }
+  . = ALIGN(16);
+  __setup_start = .;
+  .setup.init : { *(.setup.init) }
+  __setup_end = .;
+  __initcall_start = .;
+  .initcall.init : { *(.initcall.init) }
+  __initcall_end = .;
+  . = ALIGN(4096);
+  __init_end = .;
+
+  . = ALIGN(4096);
+  .data.page_aligned : { *(.data.idt) }
+
+  . = ALIGN(32);
+  .data.cacheline_aligned : { *(.data.cacheline_aligned) }
+
+  __bss_start = .;             /* BSS */
+  .bss : {
+       *(.bss)
+       }
+  _end = . ;
+
+  /* Sections to be discarded */
+  /DISCARD/ : {
+       *(.text.exit)
+       *(.data.exit)
+       *(.exitcall.exit)
+       }
+
+  /* Stabs debugging sections.  */
+  .stab 0 : { *(.stab) }
+  .stabstr 0 : { *(.stabstr) }
+  .stab.excl 0 : { *(.stab.excl) }
+  .stab.exclstr 0 : { *(.stab.exclstr) }
+  .stab.index 0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment 0 : { *(.comment) }
+}
diff --git a/xenolinux-2.4.22-sparse/drivers/block/genhd.c b/xenolinux-2.4.22-sparse/drivers/block/genhd.c
new file mode 100644 (file)
index 0000000..403d52e
--- /dev/null
@@ -0,0 +1,258 @@
+/*
+ *  Code extracted from
+ *  linux/kernel/hd.c
+ *
+ *  Copyright (C) 1991-1998  Linus Torvalds
+ *
+ *  devfs support - jj, rgooch, 980122
+ *
+ *  Moved partition checking code to fs/partitions* - Russell King
+ *  (linux@arm.uk.linux.org)
+ */
+
+/*
+ * TODO:  rip out the remaining init crap from this file  --hch
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/fs.h>
+#include <linux/genhd.h>
+#include <linux/kernel.h>
+#include <linux/blk.h>
+#include <linux/init.h>
+#include <linux/spinlock.h>
+#include <linux/seq_file.h>
+
+
+/*
+ * Global kernel list of partitioning information.
+ *
+ * XXX: you should _never_ access this directly.
+ *     the only reason this is exported is source compatiblity.
+ */
+/*static*/ struct gendisk *gendisk_head;
+static struct gendisk *gendisk_array[MAX_BLKDEV];
+static rwlock_t gendisk_lock = RW_LOCK_UNLOCKED;
+
+EXPORT_SYMBOL(gendisk_head);
+
+
+/**
+ * add_gendisk - add partitioning information to kernel list
+ * @gp: per-device partitioning information
+ *
+ * This function registers the partitioning information in @gp
+ * with the kernel.
+ */
+void
+add_gendisk(struct gendisk *gp)
+{
+       struct gendisk *sgp;
+
+       write_lock(&gendisk_lock);
+
+       /*
+        *      In 2.5 this will go away. Fix the drivers who rely on
+        *      old behaviour.
+        */
+
+       for (sgp = gendisk_head; sgp; sgp = sgp->next)
+       {
+               if (sgp == gp)
+               {
+//                     printk(KERN_ERR "add_gendisk: device major %d is buggy and added a live gendisk!\n",
+//                             sgp->major)
+                       goto out;
+               }
+       }
+       gendisk_array[gp->major] = gp;
+       gp->next = gendisk_head;
+       gendisk_head = gp;
+out:
+       write_unlock(&gendisk_lock);
+}
+
+EXPORT_SYMBOL(add_gendisk);
+
+
+/**
+ * del_gendisk - remove partitioning information from kernel list
+ * @gp: per-device partitioning information
+ *
+ * This function unregisters the partitioning information in @gp
+ * with the kernel.
+ */
+void
+del_gendisk(struct gendisk *gp)
+{
+       struct gendisk **gpp;
+
+       write_lock(&gendisk_lock);
+       gendisk_array[gp->major] = NULL;
+       for (gpp = &gendisk_head; *gpp; gpp = &((*gpp)->next))
+               if (*gpp == gp)
+                       break;
+       if (*gpp)
+               *gpp = (*gpp)->next;
+       write_unlock(&gendisk_lock);
+}
+
+EXPORT_SYMBOL(del_gendisk);
+
+
+/**
+ * get_gendisk - get partitioning information for a given device
+ * @dev: device to get partitioning information for
+ *
+ * This function gets the structure containing partitioning
+ * information for the given device @dev.
+ */
+struct gendisk *
+get_gendisk(kdev_t dev)
+{
+       struct gendisk *gp = NULL;
+       int maj = MAJOR(dev);
+
+       read_lock(&gendisk_lock);
+       if ((gp = gendisk_array[maj]))
+               goto out;
+
+       /* This is needed for early 2.4 source compatiblity.  --hch */
+       for (gp = gendisk_head; gp; gp = gp->next)
+               if (gp->major == maj)
+                       break;
+out:
+       read_unlock(&gendisk_lock);
+       return gp;
+}
+
+EXPORT_SYMBOL(get_gendisk);
+
+
+/**
+ * walk_gendisk - issue a command for every registered gendisk
+ * @walk: user-specified callback
+ * @data: opaque data for the callback
+ *
+ * This function walks through the gendisk chain and calls back
+ * into @walk for every element.
+ */
+int
+walk_gendisk(int (*walk)(struct gendisk *, void *), void *data)
+{
+       struct gendisk *gp;
+       int error = 0;
+
+       read_lock(&gendisk_lock);
+       for (gp = gendisk_head; gp; gp = gp->next)
+               if ((error = walk(gp, data)))
+                       break;
+       read_unlock(&gendisk_lock);
+
+       return error;
+}
+
+#ifdef CONFIG_PROC_FS
+/* iterator */
+static void *part_start(struct seq_file *s, loff_t *ppos)
+{
+       struct gendisk *gp;
+       loff_t pos = *ppos;
+
+       read_lock(&gendisk_lock);
+       for (gp = gendisk_head; gp; gp = gp->next)
+               if (!pos--)
+                       return gp;
+       return NULL;
+}
+
+static void *part_next(struct seq_file *s, void *v, loff_t *pos)
+{
+       ++*pos;
+       return ((struct gendisk *)v)->next;
+}
+
+static void part_stop(struct seq_file *s, void *v)
+{
+       read_unlock(&gendisk_lock);
+}
+
+static int part_show(struct seq_file *s, void *v)
+{
+       struct gendisk *gp = v;
+       char buf[64];
+       int n;
+
+       if (gp == gendisk_head) {
+               seq_puts(s, "major minor  #blocks  start_sect   nr_sects name"
+#ifdef CONFIG_BLK_STATS
+                           "     rio rmerge rsect ruse wio wmerge "
+                           "wsect wuse running use aveq"
+#endif
+                          "\n\n");
+       }
+
+       /* show the full disk and all non-0 size partitions of it */
+       for (n = 0; n < (gp->nr_real << gp->minor_shift); n++) {
+               if (gp->part[n].nr_sects) {
+#ifdef CONFIG_BLK_STATS
+                       struct hd_struct *hd = &gp->part[n];
+
+                       disk_round_stats(hd);
+                       seq_printf(s, "%4d  %4d %10d %10ld %s "
+                                     "%d %d %d %d %d %d %d %d %d %d %d\n",
+                                     gp->major, n, gp->sizes[n],
+                                     gp->part[n].start_sect,
+                                     gp->part[n].nr_sects,
+                                     disk_name(gp, n, buf),
+                                     hd->rd_ios, hd->rd_merges,
+#define MSEC(x) ((x) * 1000 / HZ)
+                                     hd->rd_sectors, MSEC(hd->rd_ticks),
+                                     hd->wr_ios, hd->wr_merges,
+                                     hd->wr_sectors, MSEC(hd->wr_ticks),
+                                     hd->ios_in_flight, MSEC(hd->io_ticks),
+                                     MSEC(hd->aveq));
+#else
+                       seq_printf(s, "%4d  %4d %10d %10ld %10ld %s\n",
+                                  gp->major, n, gp->sizes[n],
+                                  gp->part[n].start_sect,
+                                  gp->part[n].nr_sects,
+                                  disk_name(gp, n, buf));
+#endif /* CONFIG_BLK_STATS */
+               }
+       }
+
+       return 0;
+}
+
+struct seq_operations partitions_op = {
+       .start          = part_start,
+       .next           = part_next,
+       .stop           = part_stop,
+       .show           = part_show,
+};
+#endif
+
+extern int blk_dev_init(void);
+extern int net_dev_init(void);
+extern void console_map_init(void);
+extern int atmdev_init(void);
+
+int __init device_init(void)
+{
+       blk_dev_init();
+       sti();
+#ifdef CONFIG_NET
+       net_dev_init();
+#endif
+#ifdef CONFIG_ATM
+       (void) atmdev_init();
+#endif
+#ifdef CONFIG_VT
+       console_map_init();
+#endif
+       return 0;
+}
+
+__initcall(device_init);
diff --git a/xenolinux-2.4.22-sparse/drivers/block/ll_rw_blk.c b/xenolinux-2.4.22-sparse/drivers/block/ll_rw_blk.c
new file mode 100644 (file)
index 0000000..17bc32b
--- /dev/null
@@ -0,0 +1,1627 @@
+/*
+ *  linux/drivers/block/ll_rw_blk.c
+ *
+ * Copyright (C) 1991, 1992 Linus Torvalds
+ * Copyright (C) 1994,      Karl Keyte: Added support for disk statistics
+ * Elevator latency, (C) 2000  Andrea Arcangeli <andrea@suse.de> SuSE
+ * Queue request tables / lock, selectable elevator, Jens Axboe <axboe@suse.de>
+ * kernel-doc documentation started by NeilBrown <neilb@cse.unsw.edu.au> -  July2000
+ */
+
+/*
+ * This handles all read/write requests to block devices
+ */
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/kernel_stat.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/config.h>
+#include <linux/locks.h>
+#include <linux/mm.h>
+#include <linux/swap.h>
+#include <linux/init.h>
+#include <linux/smp_lock.h>
+#include <linux/completion.h>
+#include <linux/bootmem.h>
+
+#include <asm/system.h>
+#include <asm/io.h>
+#include <linux/blk.h>
+#include <linux/highmem.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+
+/*
+ * MAC Floppy IWM hooks
+ */
+
+#ifdef CONFIG_MAC_FLOPPY_IWM
+extern int mac_floppy_init(void);
+#endif
+
+/*
+ * For the allocated request tables
+ */
+static kmem_cache_t *request_cachep;
+
+/*
+ * The "disk" task queue is used to start the actual requests
+ * after a plug
+ */
+DECLARE_TASK_QUEUE(tq_disk);
+
+/*
+ * Protect the request list against multiple users..
+ *
+ * With this spinlock the Linux block IO subsystem is 100% SMP threaded
+ * from the IRQ event side, and almost 100% SMP threaded from the syscall
+ * side (we still have protect against block device array operations, and
+ * the do_request() side is casually still unsafe. The kernel lock protects
+ * this part currently.).
+ *
+ * there is a fair chance that things will work just OK if these functions
+ * are called with no global kernel lock held ...
+ */
+spinlock_t io_request_lock = SPIN_LOCK_UNLOCKED;
+
+/* This specifies how many sectors to read ahead on the disk. */
+
+int read_ahead[MAX_BLKDEV];
+
+/* blk_dev_struct is:
+ *     *request_fn
+ *     *current_request
+ */
+struct blk_dev_struct blk_dev[MAX_BLKDEV]; /* initialized by blk_dev_init() */
+
+/*
+ * blk_size contains the size of all block-devices in units of 1024 byte
+ * sectors:
+ *
+ * blk_size[MAJOR][MINOR]
+ *
+ * if (!blk_size[MAJOR]) then no minor size checking is done.
+ */
+int * blk_size[MAX_BLKDEV];
+
+/*
+ * blksize_size contains the size of all block-devices:
+ *
+ * blksize_size[MAJOR][MINOR]
+ *
+ * if (!blksize_size[MAJOR]) then 1024 bytes is assumed.
+ */
+int * blksize_size[MAX_BLKDEV];
+
+/*
+ * hardsect_size contains the size of the hardware sector of a device.
+ *
+ * hardsect_size[MAJOR][MINOR]
+ *
+ * if (!hardsect_size[MAJOR])
+ *             then 512 bytes is assumed.
+ * else
+ *             sector_size is hardsect_size[MAJOR][MINOR]
+ * This is currently set by some scsi devices and read by the msdos fs driver.
+ * Other uses may appear later.
+ */
+int * hardsect_size[MAX_BLKDEV];
+
+/*
+ * The following tunes the read-ahead algorithm in mm/filemap.c
+ */
+int * max_readahead[MAX_BLKDEV];
+
+/*
+ * Max number of sectors per request
+ */
+int * max_sectors[MAX_BLKDEV];
+
+unsigned long blk_max_low_pfn, blk_max_pfn;
+int blk_nohighio = 0;
+
+static inline int get_max_sectors(kdev_t dev)
+{
+       if (!max_sectors[MAJOR(dev)])
+               return MAX_SECTORS;
+       return max_sectors[MAJOR(dev)][MINOR(dev)];
+}
+
+inline request_queue_t *blk_get_queue(kdev_t dev)
+{
+       struct blk_dev_struct *bdev = blk_dev + MAJOR(dev);
+
+       if (bdev->queue)
+               return bdev->queue(dev);
+       else
+               return &blk_dev[MAJOR(dev)].request_queue;
+}
+
+static int __blk_cleanup_queue(struct request_list *list)
+{
+       struct list_head *head = &list->free;
+       struct request *rq;
+       int i = 0;
+
+       while (!list_empty(head)) {
+               rq = list_entry(head->next, struct request, queue);
+               list_del(&rq->queue);
+               kmem_cache_free(request_cachep, rq);
+               i++;
+       };
+
+       if (i != list->count)
+               printk("request list leak!\n");
+
+       list->count = 0;
+       return i;
+}
+
+/**
+ * blk_cleanup_queue: - release a &request_queue_t when it is no longer needed
+ * @q:    the request queue to be released
+ *
+ * Description:
+ *     blk_cleanup_queue is the pair to blk_init_queue().  It should
+ *     be called when a request queue is being released; typically
+ *     when a block device is being de-registered.  Currently, its
+ *     primary task it to free all the &struct request structures that
+ *     were allocated to the queue.
+ * Caveat: 
+ *     Hopefully the low level driver will have finished any
+ *     outstanding requests first...
+ **/
+void blk_cleanup_queue(request_queue_t * q)
+{
+       int count = q->nr_requests;
+
+       count -= __blk_cleanup_queue(&q->rq);
+
+       if (count)
+               printk("blk_cleanup_queue: leaked requests (%d)\n", count);
+       if (atomic_read(&q->nr_sectors))
+               printk("blk_cleanup_queue: leaked sectors (%d)\n", atomic_read(&q->nr_sectors));
+
+       memset(q, 0, sizeof(*q));
+}
+
+/**
+ * blk_queue_headactive - indicate whether head of request queue may be active
+ * @q:       The queue which this applies to.
+ * @active:  A flag indication where the head of the queue is active.
+ *
+ * Description:
+ *    The driver for a block device may choose to leave the currently active
+ *    request on the request queue, removing it only when it has completed.
+ *    The queue handling routines assume this by default for safety reasons
+ *    and will not involve the head of the request queue in any merging or
+ *    reordering of requests when the queue is unplugged (and thus may be
+ *    working on this particular request).
+ *
+ *    If a driver removes requests from the queue before processing them, then
+ *    it may indicate that it does so, there by allowing the head of the queue
+ *    to be involved in merging and reordering.  This is done be calling
+ *    blk_queue_headactive() with an @active flag of %0.
+ *
+ *    If a driver processes several requests at once, it must remove them (or
+ *    at least all but one of them) from the request queue.
+ *
+ *    When a queue is plugged the head will be assumed to be inactive.
+ **/
+void blk_queue_headactive(request_queue_t * q, int active)
+{
+       q->head_active = active;
+}
+
+/**
+ * blk_queue_throttle_sectors - indicates you will call sector throttling funcs
+ * @q:       The queue which this applies to.
+ * @active:  A flag indication if you want sector throttling on
+ *
+ * Description:
+ * The sector throttling code allows us to put a limit on the number of
+ * sectors pending io to the disk at a given time, sending @active nonzero
+ * indicates you will call blk_started_sectors and blk_finished_sectors in
+ * addition to calling blk_started_io and blk_finished_io in order to
+ * keep track of the number of sectors in flight.
+ **/
+void blk_queue_throttle_sectors(request_queue_t * q, int active)
+{
+       q->can_throttle = active;
+}
+
+/**
+ * blk_queue_make_request - define an alternate make_request function for a device
+ * @q:  the request queue for the device to be affected
+ * @mfn: the alternate make_request function
+ *
+ * Description:
+ *    The normal way for &struct buffer_heads to be passed to a device
+ *    driver is for them to be collected into requests on a request
+ *    queue, and then to allow the device driver to select requests
+ *    off that queue when it is ready.  This works well for many block
+ *    devices. However some block devices (typically virtual devices
+ *    such as md or lvm) do not benefit from the processing on the
+ *    request queue, and are served best by having the requests passed
+ *    directly to them.  This can be achieved by providing a function
+ *    to blk_queue_make_request().
+ *
+ * Caveat:
+ *    The driver that does this *must* be able to deal appropriately
+ *    with buffers in "highmemory", either by calling bh_kmap() to get
+ *    a kernel mapping, to by calling create_bounce() to create a
+ *    buffer in normal memory.
+ **/
+
+void blk_queue_make_request(request_queue_t * q, make_request_fn * mfn)
+{
+       q->make_request_fn = mfn;
+}
+
+/**
+ * blk_queue_bounce_limit - set bounce buffer limit for queue
+ * @q:  the request queue for the device
+ * @dma_addr:   bus address limit
+ *
+ * Description:
+ *    Different hardware can have different requirements as to what pages
+ *    it can do I/O directly to. A low level driver can call
+ *    blk_queue_bounce_limit to have lower memory pages allocated as bounce
+ *    buffers for doing I/O to pages residing above @page. By default
+ *    the block layer sets this to the highest numbered "low" memory page.
+ **/
+void blk_queue_bounce_limit(request_queue_t *q, u64 dma_addr)
+{
+       unsigned long bounce_pfn = dma_addr >> PAGE_SHIFT;
+       unsigned long mb = dma_addr >> 20;
+       static request_queue_t *old_q;
+
+       /*
+        * keep this for debugging for now...
+        */
+       if (dma_addr != BLK_BOUNCE_HIGH && q != old_q) {
+               old_q = q;
+               printk("blk: queue %p, ", q);
+               if (dma_addr == BLK_BOUNCE_ANY)
+                       printk("no I/O memory limit\n");
+               else
+                       printk("I/O limit %luMb (mask 0x%Lx)\n", mb,
+                              (long long) dma_addr);
+       }
+
+       q->bounce_pfn = bounce_pfn;
+}
+
+
+/*
+ * can we merge the two segments, or do we need to start a new one?
+ */
+inline int blk_seg_merge_ok(struct buffer_head *bh, struct buffer_head *nxt)
+{
+       /*
+        * if bh and nxt are contigous and don't cross a 4g boundary, it's ok
+        */
+       if (BH_CONTIG(bh, nxt) && BH_PHYS_4G(bh, nxt))
+               return 1;
+
+       return 0;
+}
+
+static inline int ll_new_segment(request_queue_t *q, struct request *req, int max_segments)
+{
+       if (req->nr_segments < max_segments) {
+               req->nr_segments++;
+               return 1;
+       }
+       return 0;
+}
+
+static int ll_back_merge_fn(request_queue_t *q, struct request *req, 
+                           struct buffer_head *bh, int max_segments)
+{
+       if (blk_seg_merge_ok(req->bhtail, bh))
+               return 1;
+
+       return ll_new_segment(q, req, max_segments);
+}
+
+static int ll_front_merge_fn(request_queue_t *q, struct request *req, 
+                            struct buffer_head *bh, int max_segments)
+{
+       if (blk_seg_merge_ok(bh, req->bh))
+               return 1;
+
+       return ll_new_segment(q, req, max_segments);
+}
+
+static int ll_merge_requests_fn(request_queue_t *q, struct request *req,
+                               struct request *next, int max_segments)
+{
+       int total_segments = req->nr_segments + next->nr_segments;
+
+       if (blk_seg_merge_ok(req->bhtail, next->bh))
+               total_segments--;
+
+       if (total_segments > max_segments)
+               return 0;
+
+       req->nr_segments = total_segments;
+       return 1;
+}
+
+/*
+ * "plug" the device if there are no outstanding requests: this will
+ * force the transfer to start only after we have put all the requests
+ * on the list.
+ *
+ * This is called with interrupts off and no requests on the queue.
+ * (and with the request spinlock acquired)
+ */
+static void generic_plug_device(request_queue_t *q, kdev_t dev)
+{
+       /*
+        * no need to replug device
+        */
+       if (!list_empty(&q->queue_head) || q->plugged)
+               return;
+
+       q->plugged = 1;
+       queue_task(&q->plug_tq, &tq_disk);
+}
+
+/*
+ * remove the plug and let it rip..
+ */
+static inline void __generic_unplug_device(request_queue_t *q)
+{
+       if (q->plugged) {
+               q->plugged = 0;
+               if (!list_empty(&q->queue_head))
+                       q->request_fn(q);
+       }
+}
+
+void generic_unplug_device(void *data)
+{
+       request_queue_t *q = (request_queue_t *) data;
+       unsigned long flags;
+
+       spin_lock_irqsave(&io_request_lock, flags);
+       __generic_unplug_device(q);
+       spin_unlock_irqrestore(&io_request_lock, flags);
+}
+
+/** blk_grow_request_list
+ *  @q: The &request_queue_t
+ *  @nr_requests: how many requests are desired
+ *
+ * More free requests are added to the queue's free lists, bringing
+ * the total number of requests to @nr_requests.
+ *
+ * The requests are added equally to the request queue's read
+ * and write freelists.
+ *
+ * This function can sleep.
+ *
+ * Returns the (new) number of requests which the queue has available.
+ */
+int blk_grow_request_list(request_queue_t *q, int nr_requests, int max_queue_sectors)
+{
+       unsigned long flags;
+       /* Several broken drivers assume that this function doesn't sleep,
+        * this causes system hangs during boot.
+        * As a temporary fix, make the function non-blocking.
+        */
+       spin_lock_irqsave(&io_request_lock, flags);
+       while (q->nr_requests < nr_requests) {
+               struct request *rq;
+
+               rq = kmem_cache_alloc(request_cachep, SLAB_ATOMIC);
+               if (rq == NULL)
+                       break;
+               memset(rq, 0, sizeof(*rq));
+               rq->rq_status = RQ_INACTIVE;
+               list_add(&rq->queue, &q->rq.free);
+               q->rq.count++;
+
+               q->nr_requests++;
+       }
+
+       /*
+        * Wakeup waiters after both one quarter of the
+        * max-in-fligh queue and one quarter of the requests
+        * are available again.
+        */
+
+       q->batch_requests = q->nr_requests / 4;
+       if (q->batch_requests > 32)
+               q->batch_requests = 32;
+       q->batch_sectors = max_queue_sectors / 4;
+       q->max_queue_sectors = max_queue_sectors;
+       BUG_ON(!q->batch_sectors);
+       atomic_set(&q->nr_sectors, 0);
+
+       spin_unlock_irqrestore(&io_request_lock, flags);
+       return q->nr_requests;
+}
+
+static void blk_init_free_list(request_queue_t *q)
+{
+       struct sysinfo si;
+       int megs;               /* Total memory, in megabytes */
+       int nr_requests, max_queue_sectors = MAX_QUEUE_SECTORS;
+  
+       INIT_LIST_HEAD(&q->rq.free);
+       q->rq.count = 0;
+       q->rq.pending[READ] = q->rq.pending[WRITE] = 0;
+       q->nr_requests = 0;
+
+       si_meminfo(&si);
+       megs = si.totalram >> (20 - PAGE_SHIFT);
+       nr_requests = MAX_NR_REQUESTS;
+       if (megs < 30) {
+               nr_requests /= 2;
+               max_queue_sectors /= 2;
+       }
+       /* notice early if anybody screwed the defaults */
+       BUG_ON(!nr_requests);
+       BUG_ON(!max_queue_sectors);
+       blk_grow_request_list(q, nr_requests, max_queue_sectors);
+
+       init_waitqueue_head(&q->wait_for_requests);
+
+       spin_lock_init(&q->queue_lock);
+}
+
+static int __make_request(request_queue_t * q, int rw, struct buffer_head * bh);
+
+/**
+ * blk_init_queue  - prepare a request queue for use with a block device
+ * @q:    The &request_queue_t to be initialised
+ * @rfn:  The function to be called to process requests that have been
+ *        placed on the queue.
+ *
+ * Description:
+ *    If a block device wishes to use the standard request handling procedures,
+ *    which sorts requests and coalesces adjacent requests, then it must
+ *    call blk_init_queue().  The function @rfn will be called when there
+ *    are requests on the queue that need to be processed.  If the device
+ *    supports plugging, then @rfn may not be called immediately when requests
+ *    are available on the queue, but may be called at some time later instead.
+ *    Plugged queues are generally unplugged when a buffer belonging to one
+ *    of the requests on the queue is needed, or due to memory pressure.
+ *
+ *    @rfn is not required, or even expected, to remove all requests off the
+ *    queue, but only as many as it can handle at a time.  If it does leave
+ *    requests on the queue, it is responsible for arranging that the requests
+ *    get dealt with eventually.
+ *
+ *    A global spin lock $io_request_lock must be held while manipulating the
+ *    requests on the request queue.
+ *
+ *    The request on the head of the queue is by default assumed to be
+ *    potentially active, and it is not considered for re-ordering or merging
+ *    whenever the given queue is unplugged. This behaviour can be changed with
+ *    blk_queue_headactive().
+ *
+ * Note:
+ *    blk_init_queue() must be paired with a blk_cleanup_queue() call
+ *    when the block device is deactivated (such as at module unload).
+ **/
+void blk_init_queue(request_queue_t * q, request_fn_proc * rfn)
+{
+       INIT_LIST_HEAD(&q->queue_head);
+       elevator_init(&q->elevator, ELEVATOR_LINUS);
+       blk_init_free_list(q);
+       q->request_fn           = rfn;
+       q->back_merge_fn        = ll_back_merge_fn;
+       q->front_merge_fn       = ll_front_merge_fn;
+       q->merge_requests_fn    = ll_merge_requests_fn;
+       q->make_request_fn      = __make_request;
+       q->plug_tq.sync         = 0;
+       q->plug_tq.routine      = &generic_unplug_device;
+       q->plug_tq.data         = q;
+       q->plugged              = 0;
+       q->can_throttle         = 0;
+
+       /*
+        * These booleans describe the queue properties.  We set the
+        * default (and most common) values here.  Other drivers can
+        * use the appropriate functions to alter the queue properties.
+        * as appropriate.
+        */
+       q->plug_device_fn       = generic_plug_device;
+       q->head_active          = 1;
+
+       blk_queue_bounce_limit(q, BLK_BOUNCE_HIGH);
+}
+
+#define blkdev_free_rq(list) list_entry((list)->next, struct request, queue);
+/*
+ * Get a free request. io_request_lock must be held and interrupts
+ * disabled on the way in.  Returns NULL if there are no free requests.
+ */
+static struct request *get_request(request_queue_t *q, int rw)
+{
+       struct request *rq = NULL;
+       struct request_list *rl = &q->rq;
+
+       if (blk_oversized_queue(q)) {
+               int rlim = q->nr_requests >> 5;
+
+               if (rlim < 4)
+                       rlim = 4;
+
+               /*
+                * if its a write, or we have more than a handful of reads
+                * pending, bail out
+                */
+               if ((rw == WRITE) || (rw == READ && rl->pending[READ] > rlim))
+                       return NULL;
+               if (blk_oversized_queue_reads(q))
+                       return NULL;
+       }
+       
+       if (!list_empty(&rl->free)) {
+               rq = blkdev_free_rq(&rl->free);
+               list_del(&rq->queue);
+               rl->count--;
+               rl->pending[rw]++;
+               rq->rq_status = RQ_ACTIVE;
+               rq->cmd = rw;
+               rq->special = NULL;
+               rq->q = q;
+       }
+
+       return rq;
+}
+
+/*
+ * Here's the request allocation design, low latency version:
+ *
+ * 1: Blocking on request exhaustion is a key part of I/O throttling.
+ * 
+ * 2: We want to be `fair' to all requesters.  We must avoid starvation, and
+ *    attempt to ensure that all requesters sleep for a similar duration.  Hence
+ *    no stealing requests when there are other processes waiting.
+ *
+ * There used to be more here, attempting to allow a process to send in a
+ * number of requests once it has woken up.  But, there's no way to 
+ * tell if a process has just been woken up, or if it is a new process
+ * coming in to steal requests from the waiters.  So, we give up and force
+ * everyone to wait fairly.
+ * 
+ * So here's what we do:
+ * 
+ *    a) A READA requester fails if free_requests < batch_requests
+ * 
+ *       We don't want READA requests to prevent sleepers from ever
+ *       waking.  Note that READA is used extremely rarely - a few
+ *       filesystems use it for directory readahead.
+ * 
+ *  When a process wants a new request:
+ * 
+ *    b) If free_requests == 0, the requester sleeps in FIFO manner, and
+ *       the queue full condition is set.  The full condition is not
+ *       cleared until there are no longer any waiters.  Once the full
+ *       condition is set, all new io must wait, hopefully for a very
+ *       short period of time.
+ * 
+ *  When a request is released:
+ * 
+ *    c) If free_requests < batch_requests, do nothing.
+ * 
+ *    d) If free_requests >= batch_requests, wake up a single waiter.
+ *
+ *   As each waiter gets a request, he wakes another waiter.  We do this
+ *   to prevent a race where an unplug might get run before a request makes
+ *   it's way onto the queue.  The result is a cascade of wakeups, so delaying
+ *   the initial wakeup until we've got batch_requests available helps avoid
+ *   wakeups where there aren't any requests available yet.
+ */
+
+static struct request *__get_request_wait(request_queue_t *q, int rw)
+{
+       register struct request *rq;
+       DECLARE_WAITQUEUE(wait, current);
+
+       add_wait_queue_exclusive(&q->wait_for_requests, &wait);
+
+       do {
+               set_current_state(TASK_UNINTERRUPTIBLE);
+               spin_lock_irq(&io_request_lock);
+               if (blk_oversized_queue(q) || q->rq.count == 0) {
+                       __generic_unplug_device(q);
+                       spin_unlock_irq(&io_request_lock);
+                       schedule();
+                       spin_lock_irq(&io_request_lock);
+               }
+               rq = get_request(q, rw);
+               spin_unlock_irq(&io_request_lock);
+       } while (rq == NULL);
+       remove_wait_queue(&q->wait_for_requests, &wait);
+       current->state = TASK_RUNNING;
+
+       return rq;
+}
+
+static void get_request_wait_wakeup(request_queue_t *q, int rw)
+{
+       /*
+        * avoid losing an unplug if a second __get_request_wait did the
+        * generic_unplug_device while our __get_request_wait was running
+        * w/o the queue_lock held and w/ our request out of the queue.
+        */     
+       if (waitqueue_active(&q->wait_for_requests))
+               wake_up(&q->wait_for_requests);
+}
+
+/* RO fail safe mechanism */
+
+static long ro_bits[MAX_BLKDEV][8];
+
+int is_read_only(kdev_t dev)
+{
+       int minor,major;
+
+       major = MAJOR(dev);
+       minor = MINOR(dev);
+       if (major < 0 || major >= MAX_BLKDEV) return 0;
+       return ro_bits[major][minor >> 5] & (1 << (minor & 31));
+}
+
+void set_device_ro(kdev_t dev,int flag)
+{
+       int minor,major;
+
+       major = MAJOR(dev);
+       minor = MINOR(dev);
+       if (major < 0 || major >= MAX_BLKDEV) return;
+       if (flag) ro_bits[major][minor >> 5] |= 1 << (minor & 31);
+       else ro_bits[major][minor >> 5] &= ~(1 << (minor & 31));
+}
+
+inline void drive_stat_acct (kdev_t dev, int rw,
+                               unsigned long nr_sectors, int new_io)
+{
+       unsigned int major = MAJOR(dev);
+       unsigned int index;
+
+       index = disk_index(dev);
+       if ((index >= DK_MAX_DISK) || (major >= DK_MAX_MAJOR))
+               return;
+
+       kstat.dk_drive[major][index] += new_io;
+       if (rw == READ) {
+               kstat.dk_drive_rio[major][index] += new_io;
+               kstat.dk_drive_rblk[major][index] += nr_sectors;
+       } else if (rw == WRITE) {
+               kstat.dk_drive_wio[major][index] += new_io;
+               kstat.dk_drive_wblk[major][index] += nr_sectors;
+       } else
+               printk(KERN_ERR "drive_stat_acct: cmd not R/W?\n");
+}
+
+#ifdef CONFIG_BLK_STATS
+/*
+ * Return up to two hd_structs on which to do IO accounting for a given
+ * request.
+ *
+ * On a partitioned device, we want to account both against the partition
+ * and against the whole disk.
+ */
+static void locate_hd_struct(struct request *req, 
+                            struct hd_struct **hd1,
+                            struct hd_struct **hd2)
+{
+       struct gendisk *gd;
+
+       *hd1 = NULL;
+       *hd2 = NULL;
+       
+       gd = get_gendisk(req->rq_dev);
+       if (gd && gd->part) {
+               /* Mask out the partition bits: account for the entire disk */
+               int devnr = MINOR(req->rq_dev) >> gd->minor_shift;
+               int whole_minor = devnr << gd->minor_shift;
+
+               *hd1 = &gd->part[whole_minor];
+               if (whole_minor != MINOR(req->rq_dev))
+                       *hd2= &gd->part[MINOR(req->rq_dev)];
+       }
+}
+
+/*
+ * Round off the performance stats on an hd_struct.
+ *
+ * The average IO queue length and utilisation statistics are maintained
+ * by observing the current state of the queue length and the amount of
+ * time it has been in this state for.
+ * Normally, that accounting is done on IO completion, but that can result
+ * in more than a second's worth of IO being accounted for within any one
+ * second, leading to >100% utilisation.  To deal with that, we do a
+ * round-off before returning the results when reading /proc/partitions,
+ * accounting immediately for all queue usage up to the current jiffies and
+ * restarting the counters again.
+ */
+void disk_round_stats(struct hd_struct *hd)
+{
+       unsigned long now = jiffies;
+       
+       hd->aveq += (hd->ios_in_flight * (jiffies - hd->last_queue_change));
+       hd->last_queue_change = now;
+
+       if (hd->ios_in_flight)
+               hd->io_ticks += (now - hd->last_idle_time);
+       hd->last_idle_time = now;       
+}
+
+static inline void down_ios(struct hd_struct *hd)
+{
+       disk_round_stats(hd);   
+       --hd->ios_in_flight;
+}
+
+static inline void up_ios(struct hd_struct *hd)
+{
+       disk_round_stats(hd);
+       ++hd->ios_in_flight;
+}
+
+static void account_io_start(struct hd_struct *hd, struct request *req,
+                            int merge, int sectors)
+{
+       switch (req->cmd) {
+       case READ:
+               if (merge)
+                       hd->rd_merges++;
+               hd->rd_sectors += sectors;
+               break;
+       case WRITE:
+               if (merge)
+                       hd->wr_merges++;
+               hd->wr_sectors += sectors;
+               break;
+       }
+       if (!merge)
+               up_ios(hd);
+}
+
+static void account_io_end(struct hd_struct *hd, struct request *req)
+{
+       unsigned long duration = jiffies - req->start_time;
+       switch (req->cmd) {
+       case READ:
+               hd->rd_ticks += duration;
+               hd->rd_ios++;
+               break;
+       case WRITE:
+               hd->wr_ticks += duration;
+               hd->wr_ios++;
+               break;
+       }
+       down_ios(hd);
+}
+
+void req_new_io(struct request *req, int merge, int sectors)
+{
+       struct hd_struct *hd1, *hd2;
+
+       locate_hd_struct(req, &hd1, &hd2);
+       if (hd1)
+               account_io_start(hd1, req, merge, sectors);
+       if (hd2)
+               account_io_start(hd2, req, merge, sectors);
+}
+
+void req_merged_io(struct request *req)
+{
+       struct hd_struct *hd1, *hd2;
+
+       locate_hd_struct(req, &hd1, &hd2);
+       if (hd1)
+               down_ios(hd1);
+       if (hd2)        
+               down_ios(hd2);
+}
+
+void req_finished_io(struct request *req)
+{
+       struct hd_struct *hd1, *hd2;
+
+       locate_hd_struct(req, &hd1, &hd2);
+       if (hd1)
+               account_io_end(hd1, req);
+       if (hd2)        
+               account_io_end(hd2, req);
+}
+EXPORT_SYMBOL(req_finished_io);
+#endif /* CONFIG_BLK_STATS */
+
+/*
+ * add-request adds a request to the linked list.
+ * io_request_lock is held and interrupts disabled, as we muck with the
+ * request queue list.
+ *
+ * By this point, req->cmd is always either READ/WRITE, never READA,
+ * which is important for drive_stat_acct() above.
+ */
+static inline void add_request(request_queue_t * q, struct request * req,
+                              struct list_head *insert_here)
+{
+       drive_stat_acct(req->rq_dev, req->cmd, req->nr_sectors, 1);
+
+       if (!q->plugged && q->head_active && insert_here == &q->queue_head) {
+               spin_unlock_irq(&io_request_lock);
+               printk("list_empty(&q->queue_head) is %d\n", 
+                      list_empty(&q->queue_head)); 
+               BUG();
+       }
+
+       /*
+        * elevator indicated where it wants this request to be
+        * inserted at elevator_merge time
+        */
+       list_add(&req->queue, insert_here);
+}
+
+/*
+ * Must be called with io_request_lock held and interrupts disabled
+ */
+void blkdev_release_request(struct request *req)
+{
+       request_queue_t *q = req->q;
+
+       req->rq_status = RQ_INACTIVE;
+       req->q = NULL;
+
+       /*
+        * Request may not have originated from ll_rw_blk. if not,
+        * assume it has free buffers and check waiters
+        */
+       if (q) {
+               struct request_list *rl = &q->rq;
+               int oversized_batch = 0;
+
+               if (q->can_throttle)
+                       oversized_batch = blk_oversized_queue_batch(q);
+               rl->count++;
+               /*
+                * paranoia check
+                */
+               if (req->cmd == READ || req->cmd == WRITE)
+                       rl->pending[req->cmd]--;
+               if (rl->pending[READ] > q->nr_requests)
+                       printk("blk: reads: %u\n", rl->pending[READ]);
+               if (rl->pending[WRITE] > q->nr_requests)
+                       printk("blk: writes: %u\n", rl->pending[WRITE]);
+               if (rl->pending[READ] + rl->pending[WRITE] > q->nr_requests)
+                       printk("blk: r/w: %u + %u > %u\n", rl->pending[READ], rl->pending[WRITE], q->nr_requests);
+               list_add(&req->queue, &rl->free);
+               if (rl->count >= q->batch_requests && !oversized_batch) {
+                       smp_mb();
+                       if (waitqueue_active(&q->wait_for_requests))
+                               wake_up(&q->wait_for_requests);
+               }
+       }
+}
+
+/*
+ * Has to be called with the request spinlock acquired
+ */
+static void attempt_merge(request_queue_t * q,
+                         struct request *req,
+                         int max_sectors,
+                         int max_segments)
+{
+       struct request *next;
+  
+       next = blkdev_next_request(req);
+       if (req->sector + req->nr_sectors != next->sector)
+               return;
+       if (req->cmd != next->cmd
+           || req->rq_dev != next->rq_dev
+           || req->nr_sectors + next->nr_sectors > max_sectors
+           || next->waiting)
+               return;
+       /*
+        * If we are not allowed to merge these requests, then
+        * return.  If we are allowed to merge, then the count
+        * will have been updated to the appropriate number,
+        * and we shouldn't do it here too.
+        */
+       if (!q->merge_requests_fn(q, req, next, max_segments))
+               return;
+
+       q->elevator.elevator_merge_req_fn(req, next);
+       req->bhtail->b_reqnext = next->bh;
+       req->bhtail = next->bhtail;
+       req->nr_sectors = req->hard_nr_sectors += next->hard_nr_sectors;
+       list_del(&next->queue);
+
+       /* One last thing: we have removed a request, so we now have one
+          less expected IO to complete for accounting purposes. */
+       req_merged_io(req);
+
+       blkdev_release_request(next);
+}
+
+static inline void attempt_back_merge(request_queue_t * q,
+                                     struct request *req,
+                                     int max_sectors,
+                                     int max_segments)
+{
+       if (&req->queue == q->queue_head.prev)
+               return;
+       attempt_merge(q, req, max_sectors, max_segments);
+}
+
+static inline void attempt_front_merge(request_queue_t * q,
+                                      struct list_head * head,
+                                      struct request *req,
+                                      int max_sectors,
+                                      int max_segments)
+{
+       struct list_head * prev;
+
+       prev = req->queue.prev;
+       if (head == prev)
+               return;
+       attempt_merge(q, blkdev_entry_to_request(prev), max_sectors, max_segments);
+}
+
+static int __make_request(request_queue_t * q, int rw,
+                                 struct buffer_head * bh)
+{
+       unsigned int sector, count, sync;
+       int max_segments = MAX_SEGMENTS;
+       struct request * req, *freereq = NULL;
+       int rw_ahead, max_sectors, el_ret;
+       struct list_head *head, *insert_here;
+       int latency;
+       elevator_t *elevator = &q->elevator;
+       int should_wake = 0;
+
+       count = bh->b_size >> 9;
+       sector = bh->b_rsector;
+       sync = test_and_clear_bit(BH_Sync, &bh->b_state);
+
+       rw_ahead = 0;   /* normal case; gets changed below for READA */
+       switch (rw) {
+               case READA:
+#if 0  /* bread() misinterprets failed READA attempts as IO errors on SMP */
+                       rw_ahead = 1;
+#endif
+                       rw = READ;      /* drop into READ */
+               case READ:
+               case WRITE:
+                       latency = elevator_request_latency(elevator, rw);
+                       break;
+               default:
+                       BUG();
+                       goto end_io;
+       }
+
+       /* We'd better have a real physical mapping!
+          Check this bit only if the buffer was dirty and just locked
+          down by us so at this point flushpage will block and
+          won't clear the mapped bit under us. */
+       if (!buffer_mapped(bh))
+               BUG();
+
+       /*
+        * Temporary solution - in 2.5 this will be done by the lowlevel
+        * driver. Create a bounce buffer if the buffer data points into
+        * high memory - keep the original buffer otherwise.
+        */
+       bh = blk_queue_bounce(q, rw, bh);
+
+/* look for a free request. */
+       /*
+        * Try to coalesce the new request with old requests
+        */
+       max_sectors = get_max_sectors(bh->b_rdev);
+
+       req = NULL;
+       head = &q->queue_head;
+       /*
+        * Now we acquire the request spinlock, we have to be mega careful
+        * not to schedule or do something nonatomic
+        */
+       spin_lock_irq(&io_request_lock);
+
+again:
+       insert_here = head->prev;
+
+       if (list_empty(head)) {
+               q->plug_device_fn(q, bh->b_rdev); /* is atomic */
+               goto get_rq;
+       } else if (q->head_active && !q->plugged)
+               head = head->next;
+
+       el_ret = elevator->elevator_merge_fn(q, &req, head, bh, rw,max_sectors);
+       switch (el_ret) {
+
+               case ELEVATOR_BACK_MERGE:
+                       if (!q->back_merge_fn(q, req, bh, max_segments)) {
+                               insert_here = &req->queue;
+                               break;
+                       }
+                       req->bhtail->b_reqnext = bh;
+                       req->bhtail = bh;
+                       req->nr_sectors = req->hard_nr_sectors += count;
+                       blk_started_io(count);
+                       blk_started_sectors(req, count);
+                       drive_stat_acct(req->rq_dev, req->cmd, count, 0);
+                       req_new_io(req, 1, count);
+                       attempt_back_merge(q, req, max_sectors, max_segments);
+                       goto out;
+
+               case ELEVATOR_FRONT_MERGE:
+                       if (!q->front_merge_fn(q, req, bh, max_segments)) {
+                               insert_here = req->queue.prev;
+                               break;
+                       }
+                       bh->b_reqnext = req->bh;
+                       req->bh = bh;
+                       /*
+                        * may not be valid, but queues not having bounce
+                        * enabled for highmem pages must not look at
+                        * ->buffer anyway
+                        */
+                       req->buffer = bh->b_data;
+                       req->current_nr_sectors = req->hard_cur_sectors = count;
+                       req->sector = req->hard_sector = sector;
+                       req->nr_sectors = req->hard_nr_sectors += count;
+                       blk_started_io(count);
+                       blk_started_sectors(req, count);
+                       drive_stat_acct(req->rq_dev, req->cmd, count, 0);
+                       req_new_io(req, 1, count);
+                       attempt_front_merge(q, head, req, max_sectors, max_segments);
+                       goto out;
+
+               /*
+                * elevator says don't/can't merge. get new request
+                */
+               case ELEVATOR_NO_MERGE:
+                       /*
+                        * use elevator hints as to where to insert the
+                        * request. if no hints, just add it to the back
+                        * of the queue
+                        */
+                       if (req)
+                               insert_here = &req->queue;
+                       break;
+
+               default:
+                       printk("elevator returned crap (%d)\n", el_ret);
+                       BUG();
+       }
+               
+get_rq:
+       if (freereq) {
+               req = freereq;
+               freereq = NULL;
+       } else {
+               /*
+                * See description above __get_request_wait()
+                */
+               if (rw_ahead) {
+                       if (q->rq.count < q->batch_requests || blk_oversized_queue_batch(q)) {
+                               spin_unlock_irq(&io_request_lock);
+                               goto end_io;
+                       }
+                       req = get_request(q, rw);
+                       if (req == NULL)
+                               BUG();
+               } else {
+                       req = get_request(q, rw);
+                       if (req == NULL) {
+                               spin_unlock_irq(&io_request_lock);
+                               freereq = __get_request_wait(q, rw);
+                               head = &q->queue_head;
+                               spin_lock_irq(&io_request_lock);
+                               should_wake = 1;
+                               goto again;
+                       }
+               }
+       }
+
+/* fill up the request-info, and add it to the queue */
+       req->elevator_sequence = latency;
+       req->cmd = rw;
+       req->errors = 0;
+       req->hard_sector = req->sector = sector;
+       req->hard_nr_sectors = req->nr_sectors = count;
+       req->current_nr_sectors = req->hard_cur_sectors = count;
+       req->nr_segments = 1; /* Always 1 for a new request. */
+       req->nr_hw_segments = 1; /* Always 1 for a new request. */
+       req->buffer = bh->b_data;
+       req->waiting = NULL;
+       req->bh = bh;
+       req->bhtail = bh;
+       req->rq_dev = bh->b_rdev;
+       req->start_time = jiffies;
+       req_new_io(req, 0, count);
+       blk_started_io(count);
+       blk_started_sectors(req, count);
+       add_request(q, req, insert_here);
+out:
+       if (freereq)
+               blkdev_release_request(freereq);
+       if (should_wake)
+               get_request_wait_wakeup(q, rw);
+       if (sync)
+               __generic_unplug_device(q);
+       spin_unlock_irq(&io_request_lock);
+       return 0;
+end_io:
+       bh->b_end_io(bh, test_bit(BH_Uptodate, &bh->b_state));
+       return 0;
+}
+
+/**
+ * generic_make_request: hand a buffer head to it's device driver for I/O
+ * @rw:  READ, WRITE, or READA - what sort of I/O is desired.
+ * @bh:  The buffer head describing the location in memory and on the device.
+ *
+ * generic_make_request() is used to make I/O requests of block
+ * devices. It is passed a &struct buffer_head and a &rw value.  The
+ * %READ and %WRITE options are (hopefully) obvious in meaning.  The
+ * %READA value means that a read is required, but that the driver is
+ * free to fail the request if, for example, it cannot get needed
+ * resources immediately.
+ *
+ * generic_make_request() does not return any status.  The
+ * success/failure status of the request, along with notification of
+ * completion, is delivered asynchronously through the bh->b_end_io
+ * function described (one day) else where.
+ *
+ * The caller of generic_make_request must make sure that b_page,
+ * b_addr, b_size are set to describe the memory buffer, that b_rdev
+ * and b_rsector are set to describe the device address, and the
+ * b_end_io and optionally b_private are set to describe how
+ * completion notification should be signaled.  BH_Mapped should also
+ * be set (to confirm that b_dev and b_blocknr are valid).
+ *
+ * generic_make_request and the drivers it calls may use b_reqnext,
+ * and may change b_rdev and b_rsector.  So the values of these fields
+ * should NOT be depended on after the call to generic_make_request.
+ * Because of this, the caller should record the device address
+ * information in b_dev and b_blocknr.
+ *
+ * Apart from those fields mentioned above, no other fields, and in
+ * particular, no other flags, are changed by generic_make_request or
+ * any lower level drivers.
+ * */
+void generic_make_request (int rw, struct buffer_head * bh)
+{
+       int major = MAJOR(bh->b_rdev);
+       int minorsize = 0;
+       request_queue_t *q;
+
+       if (!bh->b_end_io)
+               BUG();
+
+       /* Test device size, when known. */
+       if (blk_size[major])
+               minorsize = blk_size[major][MINOR(bh->b_rdev)];
+       if (minorsize) {
+               unsigned long maxsector = (minorsize << 1) + 1;
+               unsigned long sector = bh->b_rsector;
+               unsigned int count = bh->b_size >> 9;
+
+               if (maxsector < count || maxsector - count < sector) {
+                       /* Yecch */
+                       bh->b_state &= ~(1 << BH_Dirty);
+
+                       /* This may well happen - the kernel calls bread()
+                          without checking the size of the device, e.g.,
+                          when mounting a device. */
+                       printk(KERN_INFO
+                              "attempt to access beyond end of device\n");
+                       printk(KERN_INFO "%s: rw=%d, want=%ld, limit=%d\n",
+                              kdevname(bh->b_rdev), rw,
+                              (sector + count)>>1, minorsize);
+
+                       bh->b_end_io(bh, 0);
+                       return;
+               }
+       }
+
+       /*
+        * Resolve the mapping until finished. (drivers are
+        * still free to implement/resolve their own stacking
+        * by explicitly returning 0)
+        */
+       /* NOTE: we don't repeat the blk_size check for each new device.
+        * Stacking drivers are expected to know what they are doing.
+        */
+       do {
+               q = blk_get_queue(bh->b_rdev);
+               if (!q) {
+                       printk(KERN_ERR
+                              "generic_make_request: Trying to access "
+                              "nonexistent block-device %s (%ld)\n",
+                              kdevname(bh->b_rdev), bh->b_rsector);
+                       buffer_IO_error(bh);
+                       break;
+               }
+       } while (q->make_request_fn(q, rw, bh));
+}
+
+
+/**
+ * submit_bh: submit a buffer_head to the block device later for I/O
+ * @rw: whether to %READ or %WRITE, or maybe to %READA (read ahead)
+ * @bh: The &struct buffer_head which describes the I/O
+ *
+ * submit_bh() is very similar in purpose to generic_make_request(), and
+ * uses that function to do most of the work.
+ *
+ * The extra functionality provided by submit_bh is to determine
+ * b_rsector from b_blocknr and b_size, and to set b_rdev from b_dev.
+ * This is is appropriate for IO requests that come from the buffer
+ * cache and page cache which (currently) always use aligned blocks.
+ */
+void submit_bh(int rw, struct buffer_head * bh)
+{
+       int count = bh->b_size >> 9;
+
+       if (!test_bit(BH_Lock, &bh->b_state))
+               BUG();
+
+       set_bit(BH_Req, &bh->b_state);
+       set_bit(BH_Launder, &bh->b_state);
+
+       /*
+        * First step, 'identity mapping' - RAID or LVM might
+        * further remap this.
+        */
+       bh->b_rdev = bh->b_dev;
+       bh->b_rsector = bh->b_blocknr * count;
+
+       get_bh(bh);
+       generic_make_request(rw, bh);
+
+       /* fix race condition with wait_on_buffer() */
+       smp_mb(); /* spin_unlock may have inclusive semantics */
+       if (waitqueue_active(&bh->b_wait))
+               wake_up(&bh->b_wait);
+
+       put_bh(bh);
+       switch (rw) {
+               case WRITE:
+                       kstat.pgpgout += count;
+                       break;
+               default:
+                       kstat.pgpgin += count;
+                       break;
+       }
+}
+
+/**
+ * ll_rw_block: low-level access to block devices
+ * @rw: whether to %READ or %WRITE or maybe %READA (readahead)
+ * @nr: number of &struct buffer_heads in the array
+ * @bhs: array of pointers to &struct buffer_head
+ *
+ * ll_rw_block() takes an array of pointers to &struct buffer_heads,
+ * and requests an I/O operation on them, either a %READ or a %WRITE.
+ * The third %READA option is described in the documentation for
+ * generic_make_request() which ll_rw_block() calls.
+ *
+ * This function provides extra functionality that is not in
+ * generic_make_request() that is relevant to buffers in the buffer
+ * cache or page cache.  In particular it drops any buffer that it
+ * cannot get a lock on (with the BH_Lock state bit), any buffer that
+ * appears to be clean when doing a write request, and any buffer that
+ * appears to be up-to-date when doing read request.  Further it marks
+ * as clean buffers that are processed for writing (the buffer cache
+ * wont assume that they are actually clean until the buffer gets
+ * unlocked).
+ *
+ * ll_rw_block sets b_end_io to simple completion handler that marks
+ * the buffer up-to-date (if approriate), unlocks the buffer and wakes
+ * any waiters.  As client that needs a more interesting completion
+ * routine should call submit_bh() (or generic_make_request())
+ * directly.
+ *
+ * Caveat:
+ *  All of the buffers must be for the same device, and must also be
+ *  of the current approved size for the device.  */
+
+void ll_rw_block(int rw, int nr, struct buffer_head * bhs[])
+{
+       unsigned int major;
+       int correct_size;
+       int i;
+
+       if (!nr)
+               return;
+
+       major = MAJOR(bhs[0]->b_dev);
+
+       /* Determine correct block size for this device. */
+       correct_size = get_hardsect_size(bhs[0]->b_dev);
+
+       /* Verify requested block sizes. */
+       for (i = 0; i < nr; i++) {
+               struct buffer_head *bh = bhs[i];
+               if (bh->b_size % correct_size) {
+                       printk(KERN_NOTICE "ll_rw_block: device %s: "
+                              "only %d-char blocks implemented (%u)\n",
+                              kdevname(bhs[0]->b_dev),
+                              correct_size, bh->b_size);
+                       goto sorry;
+               }
+       }
+
+       if ((rw & WRITE) && is_read_only(bhs[0]->b_dev)) {
+               printk(KERN_NOTICE "Can't write to read-only device %s\n",
+                      kdevname(bhs[0]->b_dev));
+               goto sorry;
+       }
+
+       for (i = 0; i < nr; i++) {
+               struct buffer_head *bh = bhs[i];
+
+               /* Only one thread can actually submit the I/O. */
+               if (test_and_set_bit(BH_Lock, &bh->b_state))
+                       continue;
+
+               /* We have the buffer lock */
+               atomic_inc(&bh->b_count);
+               bh->b_end_io = end_buffer_io_sync;
+
+               switch(rw) {
+               case WRITE:
+                       if (!atomic_set_buffer_clean(bh))
+                               /* Hmmph! Nothing to write */
+                               goto end_io;
+                       __mark_buffer_clean(bh);
+                       break;
+
+               case READA:
+               case READ:
+                       if (buffer_uptodate(bh))
+                               /* Hmmph! Already have it */
+                               goto end_io;
+                       break;
+               default:
+                       BUG();
+       end_io:
+                       bh->b_end_io(bh, test_bit(BH_Uptodate, &bh->b_state));
+                       continue;
+               }
+
+               submit_bh(rw, bh);
+       }
+       return;
+
+sorry:
+       /* Make sure we don't get infinite dirty retries.. */
+       for (i = 0; i < nr; i++)
+               mark_buffer_clean(bhs[i]);
+}
+
+#ifdef CONFIG_STRAM_SWAP
+extern int stram_device_init (void);
+#endif
+
+
+/**
+ * end_that_request_first - end I/O on one buffer.
+ * @req:      the request being processed
+ * @uptodate: 0 for I/O error
+ * @name:     the name printed for an I/O error
+ *
+ * Description:
+ *     Ends I/O on the first buffer attached to @req, and sets it up
+ *     for the next buffer_head (if any) in the cluster.
+ *     
+ * Return:
+ *     0 - we are done with this request, call end_that_request_last()
+ *     1 - still buffers pending for this request
+ *
+ * Caveat: 
+ *     Drivers implementing their own end_request handling must call
+ *     blk_finished_io() appropriately.
+ **/
+
+int end_that_request_first (struct request *req, int uptodate, char *name)
+{
+       struct buffer_head * bh;
+       int nsect;
+
+       req->errors = 0;
+       if (!uptodate)
+               printk("end_request: I/O error, dev %s (%s), sector %lu\n",
+                       kdevname(req->rq_dev), name, req->sector);
+
+       if ((bh = req->bh) != NULL) {
+               nsect = bh->b_size >> 9;
+               blk_finished_io(nsect);
+               blk_finished_sectors(req, nsect);
+               req->bh = bh->b_reqnext;
+               bh->b_reqnext = NULL;
+               bh->b_end_io(bh, uptodate);
+               if ((bh = req->bh) != NULL) {
+                       req->hard_sector += nsect;
+                       req->hard_nr_sectors -= nsect;
+                       req->sector = req->hard_sector;
+                       req->nr_sectors = req->hard_nr_sectors;
+
+                       req->current_nr_sectors = bh->b_size >> 9;
+                       req->hard_cur_sectors = req->current_nr_sectors;
+                       if (req->nr_sectors < req->current_nr_sectors) {
+                               req->nr_sectors = req->current_nr_sectors;
+                               printk("end_request: buffer-list destroyed\n");
+                       }
+                       req->buffer = bh->b_data;
+                       return 1;
+               }
+       }
+       return 0;
+}
+
+void end_that_request_last(struct request *req)
+{
+       struct completion *waiting = req->waiting;
+
+       req_finished_io(req);
+       blkdev_release_request(req);
+       if (waiting)
+               complete(waiting);
+}
+
+int __init blk_dev_init(void)
+{
+       struct blk_dev_struct *dev;
+
+       request_cachep = kmem_cache_create("blkdev_requests",
+                                          sizeof(struct request),
+                                          0, SLAB_HWCACHE_ALIGN, NULL, NULL);
+
+       if (!request_cachep)
+               panic("Can't create request pool slab cache\n");
+
+       for (dev = blk_dev + MAX_BLKDEV; dev-- != blk_dev;)
+               dev->queue = NULL;
+
+       memset(ro_bits,0,sizeof(ro_bits));
+       memset(max_readahead, 0, sizeof(max_readahead));
+       memset(max_sectors, 0, sizeof(max_sectors));
+
+       blk_max_low_pfn = max_low_pfn - 1;
+       blk_max_pfn = max_pfn - 1;
+
+#ifdef CONFIG_AMIGA_Z2RAM
+       z2_init();
+#endif
+#ifdef CONFIG_STRAM_SWAP
+       stram_device_init();
+#endif
+#ifdef CONFIG_ISP16_CDI
+       isp16_init();
+#endif
+#ifdef CONFIG_BLK_DEV_PS2
+       ps2esdi_init();
+#endif
+#ifdef CONFIG_BLK_DEV_XD
+       xd_init();
+#endif
+#ifdef CONFIG_BLK_DEV_MFM
+       mfm_init();
+#endif
+#ifdef CONFIG_PARIDE
+       { extern void paride_init(void); paride_init(); };
+#endif
+#ifdef CONFIG_MAC_FLOPPY
+       swim3_init();
+#endif
+#ifdef CONFIG_BLK_DEV_SWIM_IOP
+       swimiop_init();
+#endif
+#ifdef CONFIG_AMIGA_FLOPPY
+       amiga_floppy_init();
+#endif
+#ifdef CONFIG_ATARI_FLOPPY
+       atari_floppy_init();
+#endif
+#ifdef CONFIG_BLK_DEV_FD
+       floppy_init();
+#else
+#if defined(__i386__) && !defined(CONFIG_XENO) /* Do we even need this? */
+       outb_p(0xc, 0x3f2);
+#endif
+#endif
+#ifdef CONFIG_CDU31A
+       cdu31a_init();
+#endif
+#ifdef CONFIG_ATARI_ACSI
+       acsi_init();
+#endif
+#ifdef CONFIG_MCD
+       mcd_init();
+#endif
+#ifdef CONFIG_MCDX
+       mcdx_init();
+#endif
+#ifdef CONFIG_SBPCD
+       sbpcd_init();
+#endif
+#ifdef CONFIG_AZTCD
+       aztcd_init();
+#endif
+#ifdef CONFIG_CDU535
+       sony535_init();
+#endif
+#ifdef CONFIG_GSCD
+       gscd_init();
+#endif
+#ifdef CONFIG_CM206
+       cm206_init();
+#endif
+#ifdef CONFIG_OPTCD
+       optcd_init();
+#endif
+#ifdef CONFIG_SJCD
+       sjcd_init();
+#endif
+#ifdef CONFIG_APBLOCK
+       ap_init();
+#endif
+#ifdef CONFIG_DDV
+       ddv_init();
+#endif
+#ifdef CONFIG_MDISK
+       mdisk_init();
+#endif
+#ifdef CONFIG_DASD
+       dasd_init();
+#endif
+#if defined(CONFIG_S390_TAPE) && defined(CONFIG_S390_TAPE_BLOCK)
+       tapeblock_init();
+#endif
+#ifdef CONFIG_BLK_DEV_XPRAM
+        xpram_init();
+#endif
+
+#ifdef CONFIG_SUN_JSFLASH
+       jsfd_init();
+#endif
+
+#ifdef CONFIG_XENOLINUX_BLOCK
+    xlblk_init();
+    xlseg_init();
+    xlseg_proc_init();
+#endif
+
+       return 0;
+};
+
+EXPORT_SYMBOL(io_request_lock);
+EXPORT_SYMBOL(end_that_request_first);
+EXPORT_SYMBOL(end_that_request_last);
+EXPORT_SYMBOL(blk_grow_request_list);
+EXPORT_SYMBOL(blk_init_queue);
+EXPORT_SYMBOL(blk_get_queue);
+EXPORT_SYMBOL(blk_cleanup_queue);
+EXPORT_SYMBOL(blk_queue_headactive);
+EXPORT_SYMBOL(blk_queue_throttle_sectors);
+EXPORT_SYMBOL(blk_queue_make_request);
+EXPORT_SYMBOL(generic_make_request);
+EXPORT_SYMBOL(blkdev_release_request);
+EXPORT_SYMBOL(generic_unplug_device);
+EXPORT_SYMBOL(blk_queue_bounce_limit);
+EXPORT_SYMBOL(blk_max_low_pfn);
+EXPORT_SYMBOL(blk_max_pfn);
+EXPORT_SYMBOL(blk_seg_merge_ok);
+EXPORT_SYMBOL(blk_nohighio);
diff --git a/xenolinux-2.4.22-sparse/drivers/char/mem.c b/xenolinux-2.4.22-sparse/drivers/char/mem.c
new file mode 100644 (file)
index 0000000..bb0ab61
--- /dev/null
@@ -0,0 +1,807 @@
+/*
+ *  linux/drivers/char/mem.c
+ *
+ *  Copyright (C) 1991, 1992  Linus Torvalds
+ *
+ *  Added devfs support. 
+ *    Jan-11-1998, C. Scott Ananian <cananian@alumni.princeton.edu>
+ *  Shared /dev/zero mmaping support, Feb 2000, Kanoj Sarcar <kanoj@sgi.com>
+ *
+ *  MODIFIED FOR XENOLINUX by Keir Fraser, 10th July 2003.
+ *  Xenolinux has strange semantics for /dev/mem and /dev/kmem!!
+ *   1. mmap will not work on /dev/kmem
+ *   2. mmap on /dev/mem interprets the 'file offset' as a machine address
+ *      rather than a physical address.
+ *  I don't believe anyone sane mmaps /dev/kmem, but /dev/mem is mmapped
+ *  to get at memory-mapped I/O spaces (eg. the VESA X server does this).
+ *  For this to work at all we need to expect machine addresses.
+ *  Reading/writing of /dev/kmem expects kernel virtual addresses, as usual.
+ *  Reading/writing of /dev/mem expects 'physical addresses' as usual -- this
+ *  is because /dev/mem can only read/write existing kernel mappings, which
+ *  will be normal RAM, and we should present pseudo-physical layout for all
+ *  except I/O (which is the sticky case that mmap is hacked to deal with).
+ */
+
+#include <linux/config.h>
+#include <linux/mm.h>
+#include <linux/miscdevice.h>
+#include <linux/tpqic02.h>
+#include <linux/ftape.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+#include <linux/mman.h>
+#include <linux/random.h>
+#include <linux/init.h>
+#include <linux/raw.h>
+#include <linux/tty.h>
+#include <linux/capability.h>
+
+#include <asm/uaccess.h>
+#include <asm/io.h>
+#include <asm/pgalloc.h>
+
+#ifdef CONFIG_I2C
+extern int i2c_init_all(void);
+#endif
+#ifdef CONFIG_FB
+extern void fbmem_init(void);
+#endif
+#ifdef CONFIG_PROM_CONSOLE
+extern void prom_con_init(void);
+#endif
+#ifdef CONFIG_MDA_CONSOLE
+extern void mda_console_init(void);
+#endif
+#if defined(CONFIG_S390_TAPE) && defined(CONFIG_S390_TAPE_CHAR)
+extern void tapechar_init(void);
+#endif
+     
+static ssize_t do_write_mem(struct file * file, void *p, unsigned long realp,
+                           const char * buf, size_t count, loff_t *ppos)
+{
+       ssize_t written;
+
+       written = 0;
+#if defined(__sparc__) || defined(__mc68000__)
+       /* we don't have page 0 mapped on sparc and m68k.. */
+       if (realp < PAGE_SIZE) {
+               unsigned long sz = PAGE_SIZE-realp;
+               if (sz > count) sz = count; 
+               /* Hmm. Do something? */
+               buf+=sz;
+               p+=sz;
+               count-=sz;
+               written+=sz;
+       }
+#endif
+       if (copy_from_user(p, buf, count))
+               return -EFAULT;
+       written += count;
+       *ppos += written;
+       return written;
+}
+
+
+/*
+ * This funcion reads the *physical* memory. The f_pos points directly to the 
+ * memory location. 
+ */
+static ssize_t read_mem(struct file * file, char * buf,
+                       size_t count, loff_t *ppos)
+{
+       unsigned long p = *ppos;
+       unsigned long end_mem;
+       ssize_t read;
+       
+       end_mem = __pa(high_memory);
+       if (p >= end_mem)
+               return 0;
+       if (count > end_mem - p)
+               count = end_mem - p;
+       read = 0;
+#if defined(__sparc__) || defined(__mc68000__)
+       /* we don't have page 0 mapped on sparc and m68k.. */
+       if (p < PAGE_SIZE) {
+               unsigned long sz = PAGE_SIZE-p;
+               if (sz > count) 
+                       sz = count; 
+               if (sz > 0) {
+                       if (clear_user(buf, sz))
+                               return -EFAULT;
+                       buf += sz; 
+                       p += sz; 
+                       count -= sz; 
+                       read += sz; 
+               }
+       }
+#endif
+       if (copy_to_user(buf, __va(p), count))
+               return -EFAULT;
+       read += count;
+       *ppos += read;
+       return read;
+}
+
+static ssize_t write_mem(struct file * file, const char * buf, 
+                        size_t count, loff_t *ppos)
+{
+       unsigned long p = *ppos;
+       unsigned long end_mem;
+
+       end_mem = __pa(high_memory);
+       if (p >= end_mem)
+               return 0;
+       if (count > end_mem - p)
+               count = end_mem - p;
+       return do_write_mem(file, __va(p), p, buf, count, ppos);
+}
+
+#ifndef pgprot_noncached
+
+/*
+ * This should probably be per-architecture in <asm/pgtable.h>
+ */
+static inline pgprot_t pgprot_noncached(pgprot_t _prot)
+{
+       unsigned long prot = pgprot_val(_prot);
+
+#if defined(__i386__) || defined(__x86_64__)
+       /* On PPro and successors, PCD alone doesn't always mean 
+           uncached because of interactions with the MTRRs. PCD | PWT
+           means definitely uncached. */ 
+       if (boot_cpu_data.x86 > 3)
+               prot |= _PAGE_PCD | _PAGE_PWT;
+#elif defined(__powerpc__)
+       prot |= _PAGE_NO_CACHE | _PAGE_GUARDED;
+#elif defined(__mc68000__)
+#ifdef SUN3_PAGE_NOCACHE
+       if (MMU_IS_SUN3)
+               prot |= SUN3_PAGE_NOCACHE;
+       else
+#endif
+       if (MMU_IS_851 || MMU_IS_030)
+               prot |= _PAGE_NOCACHE030;
+       /* Use no-cache mode, serialized */
+       else if (MMU_IS_040 || MMU_IS_060)
+               prot = (prot & _CACHEMASK040) | _PAGE_NOCACHE_S;
+#endif
+
+       return __pgprot(prot);
+}
+
+#endif /* !pgprot_noncached */
+
+/*
+ * Architectures vary in how they handle caching for addresses 
+ * outside of main memory.
+ */
+static inline int noncached_address(unsigned long addr)
+{
+#if defined(__i386__)
+       /* 
+        * On the PPro and successors, the MTRRs are used to set
+        * memory types for physical addresses outside main memory, 
+        * so blindly setting PCD or PWT on those pages is wrong.
+        * For Pentiums and earlier, the surround logic should disable 
+        * caching for the high addresses through the KEN pin, but
+        * we maintain the tradition of paranoia in this code.
+        */
+       return !( test_bit(X86_FEATURE_MTRR, &boot_cpu_data.x86_capability) ||
+                 test_bit(X86_FEATURE_K6_MTRR, &boot_cpu_data.x86_capability) ||
+                 test_bit(X86_FEATURE_CYRIX_ARR, &boot_cpu_data.x86_capability) ||
+                 test_bit(X86_FEATURE_CENTAUR_MCR, &boot_cpu_data.x86_capability) )
+         && addr >= __pa(high_memory);
+#else
+       return addr >= __pa(high_memory);
+#endif
+}
+
+static int mmap_mem(struct file * file, struct vm_area_struct * vma)
+{
+       unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
+
+#if defined(CONFIG_XENO) && defined(CONFIG_XENO_PRIV)
+       if (!(start_info.flags & SIF_PRIVILEGED))
+               return -ENXIO;
+
+       /* DONTCOPY is essential for Xenolinux as copy_page_range is broken. */
+       vma->vm_flags |= VM_RESERVED | VM_IO | VM_DONTCOPY;
+       vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
+       if (direct_remap_area_pages(vma->vm_mm, vma->vm_start, offset, 
+                            vma->vm_end-vma->vm_start, vma->vm_page_prot))
+               return -EAGAIN;
+       return 0;
+#elif defined(CONFIG_XENO)
+       return -ENXIO;
+#else
+       /*
+        * Accessing memory above the top the kernel knows about or
+        * through a file pointer that was marked O_SYNC will be
+        * done non-cached.
+        */
+       if (noncached_address(offset) || (file->f_flags & O_SYNC))
+               vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
+
+       /* Don't try to swap out physical pages.. */
+       vma->vm_flags |= VM_RESERVED;
+
+       /*
+        * Don't dump addresses that are not real memory to a core file.
+        */
+       if (offset >= __pa(high_memory) || (file->f_flags & O_SYNC))
+               vma->vm_flags |= VM_IO;
+
+       if (remap_page_range(vma->vm_start, offset, vma->vm_end-vma->vm_start,
+                            vma->vm_page_prot))
+               return -EAGAIN;
+       return 0;
+#endif
+}
+
+/*
+ * This function reads the *virtual* memory as seen by the kernel.
+ */
+static ssize_t read_kmem(struct file *file, char *buf, 
+                        size_t count, loff_t *ppos)
+{
+       unsigned long p = *ppos;
+       ssize_t read = 0;
+       ssize_t virtr = 0;
+       char * kbuf; /* k-addr because vread() takes vmlist_lock rwlock */
+               
+       if (p < (unsigned long) high_memory) {
+               read = count;
+               if (count > (unsigned long) high_memory - p)
+                       read = (unsigned long) high_memory - p;
+
+#if defined(__sparc__) || defined(__mc68000__)
+               /* we don't have page 0 mapped on sparc and m68k.. */
+               if (p < PAGE_SIZE && read > 0) {
+                       size_t tmp = PAGE_SIZE - p;
+                       if (tmp > read) tmp = read;
+                       if (clear_user(buf, tmp))
+                               return -EFAULT;
+                       buf += tmp;
+                       p += tmp;
+                       read -= tmp;
+                       count -= tmp;
+               }
+#endif
+               if (copy_to_user(buf, (char *)p, read))
+                       return -EFAULT;
+               p += read;
+               buf += read;
+               count -= read;
+       }
+
+       if (count > 0) {
+               kbuf = (char *)__get_free_page(GFP_KERNEL);
+               if (!kbuf)
+                       return -ENOMEM;
+               while (count > 0) {
+                       int len = count;
+
+                       if (len > PAGE_SIZE)
+                               len = PAGE_SIZE;
+                       len = vread(kbuf, (char *)p, len);
+                       if (!len)
+                               break;
+                       if (copy_to_user(buf, kbuf, len)) {
+                               free_page((unsigned long)kbuf);
+                               return -EFAULT;
+                       }
+                       count -= len;
+                       buf += len;
+                       virtr += len;
+                       p += len;
+               }
+               free_page((unsigned long)kbuf);
+       }
+       *ppos = p;
+       return virtr + read;
+}
+
+extern long vwrite(char *buf, char *addr, unsigned long count);
+
+/*
+ * This function writes to the *virtual* memory as seen by the kernel.
+ */
+static ssize_t write_kmem(struct file * file, const char * buf, 
+                         size_t count, loff_t *ppos)
+{
+       unsigned long p = *ppos;
+       ssize_t wrote = 0;
+       ssize_t virtr = 0;
+       char * kbuf; /* k-addr because vwrite() takes vmlist_lock rwlock */
+
+       if (p < (unsigned long) high_memory) {
+               wrote = count;
+               if (count > (unsigned long) high_memory - p)
+                       wrote = (unsigned long) high_memory - p;
+
+               wrote = do_write_mem(file, (void*)p, p, buf, wrote, ppos);
+
+               p += wrote;
+               buf += wrote;
+               count -= wrote;
+       }
+
+       if (count > 0) {
+               kbuf = (char *)__get_free_page(GFP_KERNEL);
+               if (!kbuf)
+                       return -ENOMEM;
+               while (count > 0) {
+                       int len = count;
+
+                       if (len > PAGE_SIZE)
+                               len = PAGE_SIZE;
+                       if (len && copy_from_user(kbuf, buf, len)) {
+                               free_page((unsigned long)kbuf);
+                               return -EFAULT;
+                       }
+                       len = vwrite(kbuf, (char *)p, len);
+                       count -= len;
+                       buf += len;
+                       virtr += len;
+                       p += len;
+               }
+               free_page((unsigned long)kbuf);
+       }
+
+       *ppos = p;
+       return virtr + wrote;
+}
+
+#if defined(CONFIG_ISA) || !defined(__mc68000__)
+static ssize_t read_port(struct file * file, char * buf,
+                        size_t count, loff_t *ppos)
+{
+       unsigned long i = *ppos;
+       char *tmp = buf;
+
+       if (verify_area(VERIFY_WRITE,buf,count))
+               return -EFAULT; 
+       while (count-- > 0 && i < 65536) {
+               if (__put_user(inb(i),tmp) < 0) 
+                       return -EFAULT;  
+               i++;
+               tmp++;
+       }
+       *ppos = i;
+       return tmp-buf;
+}
+
+static ssize_t write_port(struct file * file, const char * buf,
+                         size_t count, loff_t *ppos)
+{
+       unsigned long i = *ppos;
+       const char * tmp = buf;
+
+       if (verify_area(VERIFY_READ,buf,count))
+               return -EFAULT;
+       while (count-- > 0 && i < 65536) {
+               char c;
+               if (__get_user(c, tmp)) 
+                       return -EFAULT; 
+               outb(c,i);
+               i++;
+               tmp++;
+       }
+       *ppos = i;
+       return tmp-buf;
+}
+#endif
+
+static ssize_t read_null(struct file * file, char * buf,
+                        size_t count, loff_t *ppos)
+{
+       return 0;
+}
+
+static ssize_t write_null(struct file * file, const char * buf,
+                         size_t count, loff_t *ppos)
+{
+       return count;
+}
+
+/*
+ * For fun, we are using the MMU for this.
+ */
+static inline size_t read_zero_pagealigned(char * buf, size_t size)
+{
+       struct mm_struct *mm;
+       struct vm_area_struct * vma;
+       unsigned long addr=(unsigned long)buf;
+
+       mm = current->mm;
+       /* Oops, this was forgotten before. -ben */
+       down_read(&mm->mmap_sem);
+
+       /* For private mappings, just map in zero pages. */
+       for (vma = find_vma(mm, addr); vma; vma = vma->vm_next) {
+               unsigned long count;
+
+               if (vma->vm_start > addr || (vma->vm_flags & VM_WRITE) == 0)
+                       goto out_up;
+               if (vma->vm_flags & VM_SHARED)
+                       break;
+#if defined(CONFIG_XENO_PRIV)
+               if (vma->vm_flags & VM_IO)
+                       break;
+#endif
+               count = vma->vm_end - addr;
+               if (count > size)
+                       count = size;
+
+               zap_page_range(mm, addr, count);
+               zeromap_page_range(addr, count, PAGE_COPY);
+
+               size -= count;
+               buf += count;
+               addr += count;
+               if (size == 0)
+                       goto out_up;
+       }
+
+       up_read(&mm->mmap_sem);
+       
+       /* The shared case is hard. Let's do the conventional zeroing. */ 
+       do {
+               unsigned long unwritten = clear_user(buf, PAGE_SIZE);
+               if (unwritten)
+                       return size + unwritten - PAGE_SIZE;
+               if (current->need_resched)
+                       schedule();
+               buf += PAGE_SIZE;
+               size -= PAGE_SIZE;
+       } while (size);
+
+       return size;
+out_up:
+       up_read(&mm->mmap_sem);
+       return size;
+}
+
+static ssize_t read_zero(struct file * file, char * buf, 
+                        size_t count, loff_t *ppos)
+{
+       unsigned long left, unwritten, written = 0;
+
+       if (!count)
+               return 0;
+
+       if (!access_ok(VERIFY_WRITE, buf, count))
+               return -EFAULT;
+
+       left = count;
+
+       /* do we want to be clever? Arbitrary cut-off */
+       if (count >= PAGE_SIZE*4) {
+               unsigned long partial;
+
+               /* How much left of the page? */
+               partial = (PAGE_SIZE-1) & -(unsigned long) buf;
+               unwritten = clear_user(buf, partial);
+               written = partial - unwritten;
+               if (unwritten)
+                       goto out;
+               left -= partial;
+               buf += partial;
+               unwritten = read_zero_pagealigned(buf, left & PAGE_MASK);
+               written += (left & PAGE_MASK) - unwritten;
+               if (unwritten)
+                       goto out;
+               buf += left & PAGE_MASK;
+               left &= ~PAGE_MASK;
+       }
+       unwritten = clear_user(buf, left);
+       written += left - unwritten;
+out:
+       return written ? written : -EFAULT;
+}
+
+static int mmap_zero(struct file * file, struct vm_area_struct * vma)
+{
+       if (vma->vm_flags & VM_SHARED)
+               return shmem_zero_setup(vma);
+       if (zeromap_page_range(vma->vm_start, vma->vm_end - vma->vm_start, vma->vm_page_prot))
+               return -EAGAIN;
+       return 0;
+}
+
+static ssize_t write_full(struct file * file, const char * buf,
+                         size_t count, loff_t *ppos)
+{
+       return -ENOSPC;
+}
+
+/*
+ * Special lseek() function for /dev/null and /dev/zero.  Most notably, you
+ * can fopen() both devices with "a" now.  This was previously impossible.
+ * -- SRB.
+ */
+
+static loff_t null_lseek(struct file * file, loff_t offset, int orig)
+{
+       return file->f_pos = 0;
+}
+
+/*
+ * The memory devices use the full 32/64 bits of the offset, and so we cannot
+ * check against negative addresses: they are ok. The return value is weird,
+ * though, in that case (0).
+ *
+ * also note that seeking relative to the "end of file" isn't supported:
+ * it has no meaning, so it returns -EINVAL.
+ */
+static loff_t memory_lseek(struct file * file, loff_t offset, int orig)
+{
+       switch (orig) {
+               case 0:
+                       file->f_pos = offset;
+                       return file->f_pos;
+               case 1:
+                       file->f_pos += offset;
+                       return file->f_pos;
+               default:
+                       return -EINVAL;
+       }
+}
+
+static int open_port(struct inode * inode, struct file * filp)
+{
+       return capable(CAP_SYS_RAWIO) ? 0 : -EPERM;
+}
+
+struct page *kmem_vm_nopage(struct vm_area_struct *vma, unsigned long address, int write)
+{
+       unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
+       unsigned long kaddr;
+       pgd_t *pgd;
+       pmd_t *pmd;
+       pte_t *ptep, pte;
+       struct page *page = NULL;
+
+       /* address is user VA; convert to kernel VA of desired page */
+       kaddr = (address - vma->vm_start) + offset;
+       kaddr = VMALLOC_VMADDR(kaddr);
+
+       spin_lock(&init_mm.page_table_lock);
+
+       /* Lookup page structure for kernel VA */
+       pgd = pgd_offset(&init_mm, kaddr);
+       if (pgd_none(*pgd) || pgd_bad(*pgd))
+               goto out;
+       pmd = pmd_offset(pgd, kaddr);
+       if (pmd_none(*pmd) || pmd_bad(*pmd))
+               goto out;
+       ptep = pte_offset(pmd, kaddr);
+       if (!ptep)
+               goto out;
+       pte = *ptep;
+       if (!pte_present(pte))
+               goto out;
+       if (write && !pte_write(pte))
+               goto out;
+       page = pte_page(pte);
+       if (!VALID_PAGE(page)) {
+               page = NULL;
+               goto out;
+       }
+
+       /* Increment reference count on page */
+       get_page(page);
+
+out:
+       spin_unlock(&init_mm.page_table_lock);
+
+       return page;
+}
+
+struct vm_operations_struct kmem_vm_ops = {
+       nopage:         kmem_vm_nopage,
+};
+
+static int mmap_kmem(struct file * file, struct vm_area_struct * vma)
+{
+       unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
+       unsigned long size = vma->vm_end - vma->vm_start;
+
+#if defined(CONFIG_XENO)
+       return -ENXIO;
+#endif
+
+       /*
+        * If the user is not attempting to mmap a high memory address then
+        * the standard mmap_mem mechanism will work.  High memory addresses
+        * need special handling, as remap_page_range expects a physically-
+        * contiguous range of kernel addresses (such as obtained in kmalloc).
+        */
+       if ((offset + size) < (unsigned long) high_memory)
+               return mmap_mem(file, vma);
+
+       /*
+        * Accessing memory above the top the kernel knows about or
+        * through a file pointer that was marked O_SYNC will be
+        * done non-cached.
+        */
+       if (noncached_address(offset) || (file->f_flags & O_SYNC))
+               vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
+
+       /* Don't do anything here; "nopage" will fill the holes */
+       vma->vm_ops = &kmem_vm_ops;
+
+       /* Don't try to swap out physical pages.. */
+       vma->vm_flags |= VM_RESERVED;
+
+       /*
+        * Don't dump addresses that are not real memory to a core file.
+        */
+       vma->vm_flags |= VM_IO;
+
+       return 0;
+}
+
+#define zero_lseek     null_lseek
+#define full_lseek      null_lseek
+#define write_zero     write_null
+#define read_full       read_zero
+#define open_mem       open_port
+#define open_kmem      open_mem
+
+static struct file_operations mem_fops = {
+       llseek:         memory_lseek,
+       read:           read_mem,
+       write:          write_mem,
+       mmap:           mmap_mem,
+       open:           open_mem,
+};
+
+static struct file_operations kmem_fops = {
+       llseek:         memory_lseek,
+       read:           read_kmem,
+       write:          write_kmem,
+       mmap:           mmap_kmem,
+       open:           open_kmem,
+};
+
+static struct file_operations null_fops = {
+       llseek:         null_lseek,
+       read:           read_null,
+       write:          write_null,
+};
+
+#if defined(CONFIG_ISA) || !defined(__mc68000__)
+static struct file_operations port_fops = {
+       llseek:         memory_lseek,
+       read:           read_port,
+       write:          write_port,
+       open:           open_port,
+};
+#endif
+
+static struct file_operations zero_fops = {
+       llseek:         zero_lseek,
+       read:           read_zero,
+       write:          write_zero,
+       mmap:           mmap_zero,
+};
+
+static struct file_operations full_fops = {
+       llseek:         full_lseek,
+       read:           read_full,
+       write:          write_full,
+};
+
+static int memory_open(struct inode * inode, struct file * filp)
+{
+       switch (MINOR(inode->i_rdev)) {
+               case 1:
+                       filp->f_op = &mem_fops;
+                       break;
+               case 2:
+                       filp->f_op = &kmem_fops;
+                       break;
+               case 3:
+                       filp->f_op = &null_fops;
+                       break;
+#if defined(CONFIG_ISA) || !defined(__mc68000__)
+               case 4:
+#if defined(CONFIG_XENO)
+#if defined(CONFIG_XENO_PRIV)
+                       if (!(start_info.flags & SIF_PRIVILEGED))
+#endif
+                               return -ENXIO;
+#endif
+                       filp->f_op = &port_fops;
+                       break;
+#endif
+               case 5:
+                       filp->f_op = &zero_fops;
+                       break;
+               case 7:
+                       filp->f_op = &full_fops;
+                       break;
+               case 8:
+                       filp->f_op = &random_fops;
+                       break;
+               case 9:
+                       filp->f_op = &urandom_fops;
+                       break;
+               default:
+                       return -ENXIO;
+       }
+       if (filp->f_op && filp->f_op->open)
+               return filp->f_op->open(inode,filp);
+       return 0;
+}
+
+void __init memory_devfs_register (void)
+{
+    /*  These are never unregistered  */
+    static const struct {
+       unsigned short minor;
+       char *name;
+       umode_t mode;
+       struct file_operations *fops;
+    } list[] = { /* list of minor devices */
+       {1, "mem",     S_IRUSR | S_IWUSR | S_IRGRP, &mem_fops},
+       {2, "kmem",    S_IRUSR | S_IWUSR | S_IRGRP, &kmem_fops},
+       {3, "null",    S_IRUGO | S_IWUGO,           &null_fops},
+#if defined(CONFIG_ISA) || !defined(__mc68000__)
+       {4, "port",    S_IRUSR | S_IWUSR | S_IRGRP, &port_fops},
+#endif
+       {5, "zero",    S_IRUGO | S_IWUGO,           &zero_fops},
+       {7, "full",    S_IRUGO | S_IWUGO,           &full_fops},
+       {8, "random",  S_IRUGO | S_IWUSR,           &random_fops},
+       {9, "urandom", S_IRUGO | S_IWUSR,           &urandom_fops}
+    };
+    int i;
+
+    for (i=0; i<(sizeof(list)/sizeof(*list)); i++)
+       devfs_register (NULL, list[i].name, DEVFS_FL_NONE,
+                       MEM_MAJOR, list[i].minor,
+                       list[i].mode | S_IFCHR,
+                       list[i].fops, NULL);
+}
+
+static struct file_operations memory_fops = {
+       open:           memory_open,    /* just a selector for the real open */
+};
+
+int __init chr_dev_init(void)
+{
+       if (devfs_register_chrdev(MEM_MAJOR,"mem",&memory_fops))
+               printk("unable to get major %d for memory devs\n", MEM_MAJOR);
+       memory_devfs_register();
+       rand_initialize();
+#ifdef CONFIG_I2C
+       i2c_init_all();
+#endif
+#if defined (CONFIG_FB)
+       fbmem_init();
+#endif
+#if defined (CONFIG_PROM_CONSOLE)
+       prom_con_init();
+#endif
+#if defined (CONFIG_MDA_CONSOLE)
+       mda_console_init();
+#endif
+       tty_init();
+#ifdef CONFIG_M68K_PRINTER
+       lp_m68k_init();
+#endif
+       misc_init();
+#if CONFIG_QIC02_TAPE
+       qic02_tape_init();
+#endif
+#ifdef CONFIG_FTAPE
+       ftape_init();
+#endif
+#if defined(CONFIG_S390_TAPE) && defined(CONFIG_S390_TAPE_CHAR)
+       tapechar_init();
+#endif
+       return 0;
+}
+
+__initcall(chr_dev_init);
diff --git a/xenolinux-2.4.22-sparse/drivers/char/tty_io.c b/xenolinux-2.4.22-sparse/drivers/char/tty_io.c
new file mode 100644 (file)
index 0000000..741fa85
--- /dev/null
@@ -0,0 +1,2463 @@
+/*
+ *  linux/drivers/char/tty_io.c
+ *
+ *  Copyright (C) 1991, 1992  Linus Torvalds
+ */
+
+/*
+ * 'tty_io.c' gives an orthogonal feeling to tty's, be they consoles
+ * or rs-channels. It also implements echoing, cooked mode etc.
+ *
+ * Kill-line thanks to John T Kohl, who also corrected VMIN = VTIME = 0.
+ *
+ * Modified by Theodore Ts'o, 9/14/92, to dynamically allocate the
+ * tty_struct and tty_queue structures.  Previously there was an array
+ * of 256 tty_struct's which was statically allocated, and the
+ * tty_queue structures were allocated at boot time.  Both are now
+ * dynamically allocated only when the tty is open.
+ *
+ * Also restructured routines so that there is more of a separation
+ * between the high-level tty routines (tty_io.c and tty_ioctl.c) and
+ * the low-level tty routines (serial.c, pty.c, console.c).  This
+ * makes for cleaner and more compact code.  -TYT, 9/17/92 
+ *
+ * Modified by Fred N. van Kempen, 01/29/93, to add line disciplines
+ * which can be dynamically activated and de-activated by the line
+ * discipline handling modules (like SLIP).
+ *
+ * NOTE: pay no attention to the line discipline code (yet); its
+ * interface is still subject to change in this version...
+ * -- TYT, 1/31/92
+ *
+ * Added functionality to the OPOST tty handling.  No delays, but all
+ * other bits should be there.
+ *     -- Nick Holloway <alfie@dcs.warwick.ac.uk>, 27th May 1993.
+ *
+ * Rewrote canonical mode and added more termios flags.
+ *     -- julian@uhunix.uhcc.hawaii.edu (J. Cowley), 13Jan94
+ *
+ * Reorganized FASYNC support so mouse code can share it.
+ *     -- ctm@ardi.com, 9Sep95
+ *
+ * New TIOCLINUX variants added.
+ *     -- mj@k332.feld.cvut.cz, 19-Nov-95
+ * 
+ * Restrict vt switching via ioctl()
+ *      -- grif@cs.ucr.edu, 5-Dec-95
+ *
+ * Move console and virtual terminal code to more appropriate files,
+ * implement CONFIG_VT and generalize console device interface.
+ *     -- Marko Kohtala <Marko.Kohtala@hut.fi>, March 97
+ *
+ * Rewrote init_dev and release_dev to eliminate races.
+ *     -- Bill Hawes <whawes@star.net>, June 97
+ *
+ * Added devfs support.
+ *      -- C. Scott Ananian <cananian@alumni.princeton.edu>, 13-Jan-1998
+ *
+ * Added support for a Unix98-style ptmx device.
+ *      -- C. Scott Ananian <cananian@alumni.princeton.edu>, 14-Jan-1998
+ *
+ * Reduced memory usage for older ARM systems
+ *      -- Russell King <rmk@arm.linux.org.uk>
+ *
+ * Move do_SAK() into process context.  Less stack use in devfs functions.
+ * alloc_tty_struct() always uses kmalloc() -- Andrew Morton <andrewm@uow.edu.eu> 17Mar01
+ */
+
+#include <linux/config.h>
+#include <linux/types.h>
+#include <linux/major.h>
+#include <linux/errno.h>
+#include <linux/signal.h>
+#include <linux/fcntl.h>
+#include <linux/sched.h>
+#include <linux/interrupt.h>
+#include <linux/tty.h>
+#include <linux/tty_driver.h>
+#include <linux/tty_flip.h>
+#include <linux/devpts_fs.h>
+#include <linux/file.h>
+#include <linux/console.h>
+#include <linux/timer.h>
+#include <linux/ctype.h>
+#include <linux/kd.h>
+#include <linux/mm.h>
+#include <linux/string.h>
+#include <linux/slab.h>
+#include <linux/poll.h>
+#include <linux/proc_fs.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/smp_lock.h>
+
+#include <asm/uaccess.h>
+#include <asm/system.h>
+#include <asm/bitops.h>
+
+#include <linux/kbd_kern.h>
+#include <linux/vt_kern.h>
+#include <linux/selection.h>
+#include <linux/devfs_fs_kernel.h>
+
+#include <linux/kmod.h>
+
+#ifdef CONFIG_XEN_CONSOLE
+extern void xen_console_init(void);
+#endif
+
+#ifdef CONFIG_VT
+extern void con_init_devfs (void);
+#endif
+
+extern void disable_early_printk(void);
+
+#define CONSOLE_DEV MKDEV(TTY_MAJOR,0)
+#define TTY_DEV MKDEV(TTYAUX_MAJOR,0)
+#define SYSCONS_DEV MKDEV(TTYAUX_MAJOR,1)
+#define PTMX_DEV MKDEV(TTYAUX_MAJOR,2)
+
+#undef TTY_DEBUG_HANGUP
+
+#define TTY_PARANOIA_CHECK 1
+#define CHECK_TTY_COUNT 1
+
+struct termios tty_std_termios;                /* for the benefit of tty drivers  */
+struct tty_driver *tty_drivers;                /* linked list of tty drivers */
+struct tty_ldisc ldiscs[NR_LDISCS];    /* line disc dispatch table     */
+
+#ifdef CONFIG_UNIX98_PTYS
+extern struct tty_driver ptm_driver[]; /* Unix98 pty masters; for /dev/ptmx */
+extern struct tty_driver pts_driver[]; /* Unix98 pty slaves;  for /dev/ptmx */
+#endif
+
+static void initialize_tty_struct(struct tty_struct *tty);
+
+static ssize_t tty_read(struct file *, char *, size_t, loff_t *);
+static ssize_t tty_write(struct file *, const char *, size_t, loff_t *);
+static unsigned int tty_poll(struct file *, poll_table *);
+static int tty_open(struct inode *, struct file *);
+static int tty_release(struct inode *, struct file *);
+int tty_ioctl(struct inode * inode, struct file * file,
+             unsigned int cmd, unsigned long arg);
+static int tty_fasync(int fd, struct file * filp, int on);
+extern int vme_scc_init (void);
+extern long vme_scc_console_init(void);
+extern int serial167_init(void);
+extern long serial167_console_init(void);
+extern void console_8xx_init(void);
+extern void au1x00_serial_console_init(void);
+extern int rs_8xx_init(void);
+extern void mac_scc_console_init(void);
+extern void hwc_console_init(void);
+extern void hwc_tty_init(void);
+extern void con3215_init(void);
+extern void tty3215_init(void);
+extern void tub3270_con_init(void);
+extern void tub3270_init(void);
+extern void rs285_console_init(void);
+extern void sa1100_rs_console_init(void);
+extern void sgi_serial_console_init(void);
+extern void sci_console_init(void);
+extern void dec_serial_console_init(void);
+extern void tx3912_console_init(void);
+extern void tx3912_rs_init(void);
+extern void txx927_console_init(void);
+extern void txx9_rs_init(void);
+extern void txx9_serial_console_init(void);
+extern void sb1250_serial_console_init(void);
+extern void arc_console_init(void);
+
+#ifndef MIN
+#define MIN(a,b)       ((a) < (b) ? (a) : (b))
+#endif
+#ifndef MAX
+#define MAX(a,b)       ((a) < (b) ? (b) : (a))
+#endif
+
+static struct tty_struct *alloc_tty_struct(void)
+{
+       struct tty_struct *tty;
+
+       tty = kmalloc(sizeof(struct tty_struct), GFP_KERNEL);
+       if (tty)
+               memset(tty, 0, sizeof(struct tty_struct));
+       return tty;
+}
+
+static inline void free_tty_struct(struct tty_struct *tty)
+{
+       kfree(tty);
+}
+
+/*
+ * This routine returns the name of tty.
+ */
+static char *
+_tty_make_name(struct tty_struct *tty, const char *name, char *buf)
+{
+       int idx = (tty)?MINOR(tty->device) - tty->driver.minor_start:0;
+
+       if (!tty) /* Hmm.  NULL pointer.  That's fun. */
+               strcpy(buf, "NULL tty");
+       else
+               sprintf(buf, name,
+                       idx + tty->driver.name_base);
+               
+       return buf;
+}
+
+#define TTY_NUMBER(tty) (MINOR((tty)->device) - (tty)->driver.minor_start + \
+                        (tty)->driver.name_base)
+
+char *tty_name(struct tty_struct *tty, char *buf)
+{
+       return _tty_make_name(tty, (tty)?tty->driver.name:NULL, buf);
+}
+
+inline int tty_paranoia_check(struct tty_struct *tty, kdev_t device,
+                             const char *routine)
+{
+#ifdef TTY_PARANOIA_CHECK
+       static const char badmagic[] = KERN_WARNING
+               "Warning: bad magic number for tty struct (%s) in %s\n";
+       static const char badtty[] = KERN_WARNING
+               "Warning: null TTY for (%s) in %s\n";
+
+       if (!tty) {
+               printk(badtty, kdevname(device), routine);
+               return 1;
+       }
+       if (tty->magic != TTY_MAGIC) {
+               printk(badmagic, kdevname(device), routine);
+               return 1;
+       }
+#endif
+       return 0;
+}
+
+static int check_tty_count(struct tty_struct *tty, const char *routine)
+{
+#ifdef CHECK_TTY_COUNT
+       struct list_head *p;
+       int count = 0;
+       
+       file_list_lock();
+       for(p = tty->tty_files.next; p != &tty->tty_files; p = p->next) {
+               if(list_entry(p, struct file, f_list)->private_data == tty)
+                       count++;
+       }
+       file_list_unlock();
+       if (tty->driver.type == TTY_DRIVER_TYPE_PTY &&
+           tty->driver.subtype == PTY_TYPE_SLAVE &&
+           tty->link && tty->link->count)
+               count++;
+       if (tty->count != count) {
+               printk(KERN_WARNING "Warning: dev (%s) tty->count(%d) "
+                                   "!= #fd's(%d) in %s\n",
+                      kdevname(tty->device), tty->count, count, routine);
+               return count;
+       }       
+#endif
+       return 0;
+}
+
+int tty_register_ldisc(int disc, struct tty_ldisc *new_ldisc)
+{
+       if (disc < N_TTY || disc >= NR_LDISCS)
+               return -EINVAL;
+       
+       if (new_ldisc) {
+               ldiscs[disc] = *new_ldisc;
+               ldiscs[disc].flags |= LDISC_FLAG_DEFINED;
+               ldiscs[disc].num = disc;
+       } else
+               memset(&ldiscs[disc], 0, sizeof(struct tty_ldisc));
+       
+       return 0;
+}
+
+EXPORT_SYMBOL(tty_register_ldisc);
+
+/* Set the discipline of a tty line. */
+static int tty_set_ldisc(struct tty_struct *tty, int ldisc)
+{
+       int     retval = 0;
+       struct  tty_ldisc o_ldisc;
+       char buf[64];
+
+       if ((ldisc < N_TTY) || (ldisc >= NR_LDISCS))
+               return -EINVAL;
+       /* Eduardo Blanco <ejbs@cs.cs.com.uy> */
+       /* Cyrus Durgin <cider@speakeasy.org> */
+       if (!(ldiscs[ldisc].flags & LDISC_FLAG_DEFINED)) {
+               char modname [20];
+               sprintf(modname, "tty-ldisc-%d", ldisc);
+               request_module (modname);
+       }
+       if (!(ldiscs[ldisc].flags & LDISC_FLAG_DEFINED))
+               return -EINVAL;
+
+       if (tty->ldisc.num == ldisc)
+               return 0;       /* We are already in the desired discipline */
+       o_ldisc = tty->ldisc;
+
+       tty_wait_until_sent(tty, 0);
+       
+       /* Shutdown the current discipline. */
+       if (tty->ldisc.close)
+               (tty->ldisc.close)(tty);
+
+       /* Now set up the new line discipline. */
+       tty->ldisc = ldiscs[ldisc];
+       tty->termios->c_line = ldisc;
+       if (tty->ldisc.open)
+               retval = (tty->ldisc.open)(tty);
+       if (retval < 0) {
+               tty->ldisc = o_ldisc;
+               tty->termios->c_line = tty->ldisc.num;
+               if (tty->ldisc.open && (tty->ldisc.open(tty) < 0)) {
+                       tty->ldisc = ldiscs[N_TTY];
+                       tty->termios->c_line = N_TTY;
+                       if (tty->ldisc.open) {
+                               int r = tty->ldisc.open(tty);
+
+                               if (r < 0)
+                                       panic("Couldn't open N_TTY ldisc for "
+                                             "%s --- error %d.",
+                                             tty_name(tty, buf), r);
+                       }
+               }
+       }
+       if (tty->ldisc.num != o_ldisc.num && tty->driver.set_ldisc)
+               tty->driver.set_ldisc(tty);
+       return retval;
+}
+
+/*
+ * This routine returns a tty driver structure, given a device number
+ */
+struct tty_driver *get_tty_driver(kdev_t device)
+{
+       int     major, minor;
+       struct tty_driver *p;
+       
+       minor = MINOR(device);
+       major = MAJOR(device);
+
+       for (p = tty_drivers; p; p = p->next) {
+               if (p->major != major)
+                       continue;
+               if (minor < p->minor_start)
+                       continue;
+               if (minor >= p->minor_start + p->num)
+                       continue;
+               return p;
+       }
+       return NULL;
+}
+
+/*
+ * If we try to write to, or set the state of, a terminal and we're
+ * not in the foreground, send a SIGTTOU.  If the signal is blocked or
+ * ignored, go ahead and perform the operation.  (POSIX 7.2)
+ */
+int tty_check_change(struct tty_struct * tty)
+{
+       if (current->tty != tty)
+               return 0;
+       if (tty->pgrp <= 0) {
+               printk(KERN_WARNING "tty_check_change: tty->pgrp <= 0!\n");
+               return 0;
+       }
+       if (current->pgrp == tty->pgrp)
+               return 0;
+       if (is_ignored(SIGTTOU))
+               return 0;
+       if (is_orphaned_pgrp(current->pgrp))
+               return -EIO;
+       (void) kill_pg(current->pgrp,SIGTTOU,1);
+       return -ERESTARTSYS;
+}
+
+static ssize_t hung_up_tty_read(struct file * file, char * buf,
+                               size_t count, loff_t *ppos)
+{
+       /* Can't seek (pread) on ttys.  */
+       if (ppos != &file->f_pos)
+               return -ESPIPE;
+       return 0;
+}
+
+static ssize_t hung_up_tty_write(struct file * file, const char * buf,
+                                size_t count, loff_t *ppos)
+{
+       /* Can't seek (pwrite) on ttys.  */
+       if (ppos != &file->f_pos)
+               return -ESPIPE;
+       return -EIO;
+}
+
+/* No kernel lock held - none needed ;) */
+static unsigned int hung_up_tty_poll(struct file * filp, poll_table * wait)
+{
+       return POLLIN | POLLOUT | POLLERR | POLLHUP | POLLRDNORM | POLLWRNORM;
+}
+
+static int hung_up_tty_ioctl(struct inode * inode, struct file * file,
+                            unsigned int cmd, unsigned long arg)
+{
+       return cmd == TIOCSPGRP ? -ENOTTY : -EIO;
+}
+
+static struct file_operations tty_fops = {
+       llseek:         no_llseek,
+       read:           tty_read,
+       write:          tty_write,
+       poll:           tty_poll,
+       ioctl:          tty_ioctl,
+       open:           tty_open,
+       release:        tty_release,
+       fasync:         tty_fasync,
+};
+
+static struct file_operations hung_up_tty_fops = {
+       llseek:         no_llseek,
+       read:           hung_up_tty_read,
+       write:          hung_up_tty_write,
+       poll:           hung_up_tty_poll,
+       ioctl:          hung_up_tty_ioctl,
+       release:        tty_release,
+};
+
+static spinlock_t redirect_lock = SPIN_LOCK_UNLOCKED;
+static struct file *redirect;
+/*
+ * This can be called by the "eventd" kernel thread.  That is process synchronous,
+ * but doesn't hold any locks, so we need to make sure we have the appropriate
+ * locks for what we're doing..
+ */
+void do_tty_hangup(void *data)
+{
+       struct tty_struct *tty = (struct tty_struct *) data;
+       struct file * cons_filp = NULL;
+       struct file *f = NULL;
+       struct task_struct *p;
+       struct list_head *l;
+       int    closecount = 0, n;
+
+       if (!tty)
+               return;
+
+       /* inuse_filps is protected by the single kernel lock */
+       lock_kernel();
+
+       spin_lock(&redirect_lock);
+       if (redirect && redirect->private_data == tty) {
+               f = redirect;
+               redirect = NULL;
+       }
+       spin_unlock(&redirect_lock);
+       if (f)
+               fput(f);
+       
+       check_tty_count(tty, "do_tty_hangup");
+       file_list_lock();
+       for (l = tty->tty_files.next; l != &tty->tty_files; l = l->next) {
+               struct file * filp = list_entry(l, struct file, f_list);
+               if (filp->f_dentry->d_inode->i_rdev == CONSOLE_DEV ||
+                   filp->f_dentry->d_inode->i_rdev == SYSCONS_DEV) {
+                       cons_filp = filp;
+                       continue;
+               }
+               if (filp->f_op != &tty_fops)
+                       continue;
+               closecount++;
+               tty_fasync(-1, filp, 0);        /* can't block */
+               filp->f_op = &hung_up_tty_fops;
+       }
+       file_list_unlock();
+       
+       /* FIXME! What are the locking issues here? This may me overdoing things.. */
+       {
+               unsigned long flags;
+
+               save_flags(flags); cli();
+               if (tty->ldisc.flush_buffer)
+                       tty->ldisc.flush_buffer(tty);
+               if (tty->driver.flush_buffer)
+                       tty->driver.flush_buffer(tty);
+               if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) &&
+                   tty->ldisc.write_wakeup)
+                       (tty->ldisc.write_wakeup)(tty);
+               restore_flags(flags);
+       }
+
+       wake_up_interruptible(&tty->write_wait);
+       wake_up_interruptible(&tty->read_wait);
+
+       /*
+        * Shutdown the current line discipline, and reset it to
+        * N_TTY.
+        */
+       if (tty->driver.flags & TTY_DRIVER_RESET_TERMIOS)
+               *tty->termios = tty->driver.init_termios;
+       if (tty->ldisc.num != ldiscs[N_TTY].num) {
+               if (tty->ldisc.close)
+                       (tty->ldisc.close)(tty);
+               tty->ldisc = ldiscs[N_TTY];
+               tty->termios->c_line = N_TTY;
+               if (tty->ldisc.open) {
+                       int i = (tty->ldisc.open)(tty);
+                       if (i < 0)
+                               printk(KERN_ERR "do_tty_hangup: N_TTY open: "
+                                               "error %d\n", -i);
+               }
+       }
+       
+       read_lock(&tasklist_lock);
+       for_each_task(p) {
+               if ((tty->session > 0) && (p->session == tty->session) &&
+                   p->leader) {
+                       send_sig(SIGHUP,p,1);
+                       send_sig(SIGCONT,p,1);
+                       if (tty->pgrp > 0)
+                               p->tty_old_pgrp = tty->pgrp;
+               }
+               if (p->tty == tty)
+                       p->tty = NULL;
+       }
+       read_unlock(&tasklist_lock);
+
+       tty->flags = 0;
+       tty->session = 0;
+       tty->pgrp = -1;
+       tty->ctrl_status = 0;
+       /*
+        *      If one of the devices matches a console pointer, we
+        *      cannot just call hangup() because that will cause
+        *      tty->count and state->count to go out of sync.
+        *      So we just call close() the right number of times.
+        */
+       if (cons_filp) {
+               if (tty->driver.close)
+                       for (n = 0; n < closecount; n++)
+                               tty->driver.close(tty, cons_filp);
+       } else if (tty->driver.hangup)
+               (tty->driver.hangup)(tty);
+       unlock_kernel();
+}
+
+void tty_hangup(struct tty_struct * tty)
+{
+#ifdef TTY_DEBUG_HANGUP
+       char    buf[64];
+       
+       printk(KERN_DEBUG "%s hangup...\n", tty_name(tty, buf));
+#endif
+       schedule_task(&tty->tq_hangup);
+}
+
+void tty_vhangup(struct tty_struct * tty)
+{
+#ifdef TTY_DEBUG_HANGUP
+       char    buf[64];
+
+       printk(KERN_DEBUG "%s vhangup...\n", tty_name(tty, buf));
+#endif
+       do_tty_hangup((void *) tty);
+}
+
+int tty_hung_up_p(struct file * filp)
+{
+       return (filp->f_op == &hung_up_tty_fops);
+}
+
+/*
+ * This function is typically called only by the session leader, when
+ * it wants to disassociate itself from its controlling tty.
+ *
+ * It performs the following functions:
+ *     (1)  Sends a SIGHUP and SIGCONT to the foreground process group
+ *     (2)  Clears the tty from being controlling the session
+ *     (3)  Clears the controlling tty for all processes in the
+ *             session group.
+ *
+ * The argument on_exit is set to 1 if called when a process is
+ * exiting; it is 0 if called by the ioctl TIOCNOTTY.
+ */
+void disassociate_ctty(int on_exit)
+{
+       struct tty_struct *tty = current->tty;
+       struct task_struct *p;
+       int tty_pgrp = -1;
+
+       if (tty) {
+               tty_pgrp = tty->pgrp;
+               if (on_exit && tty->driver.type != TTY_DRIVER_TYPE_PTY)
+                       tty_vhangup(tty);
+       } else {
+               if (current->tty_old_pgrp) {
+                       kill_pg(current->tty_old_pgrp, SIGHUP, on_exit);
+                       kill_pg(current->tty_old_pgrp, SIGCONT, on_exit);
+               }
+               return;
+       }
+       if (tty_pgrp > 0) {
+               kill_pg(tty_pgrp, SIGHUP, on_exit);
+               if (!on_exit)
+                       kill_pg(tty_pgrp, SIGCONT, on_exit);
+       }
+
+       current->tty_old_pgrp = 0;
+       tty->session = 0;
+       tty->pgrp = -1;
+
+       read_lock(&tasklist_lock);
+       for_each_task(p)
+               if (p->session == current->session)
+                       p->tty = NULL;
+       read_unlock(&tasklist_lock);
+}
+
+void stop_tty(struct tty_struct *tty)
+{
+       if (tty->stopped)
+               return;
+       tty->stopped = 1;
+       if (tty->link && tty->link->packet) {
+               tty->ctrl_status &= ~TIOCPKT_START;
+               tty->ctrl_status |= TIOCPKT_STOP;
+               wake_up_interruptible(&tty->link->read_wait);
+       }
+       if (tty->driver.stop)
+               (tty->driver.stop)(tty);
+}
+
+void start_tty(struct tty_struct *tty)
+{
+       if (!tty->stopped || tty->flow_stopped)
+               return;
+       tty->stopped = 0;
+       if (tty->link && tty->link->packet) {
+               tty->ctrl_status &= ~TIOCPKT_STOP;
+               tty->ctrl_status |= TIOCPKT_START;
+               wake_up_interruptible(&tty->link->read_wait);
+       }
+       if (tty->driver.start)
+               (tty->driver.start)(tty);
+       if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) &&
+           tty->ldisc.write_wakeup)
+               (tty->ldisc.write_wakeup)(tty);
+       wake_up_interruptible(&tty->write_wait);
+}
+
+static ssize_t tty_read(struct file * file, char * buf, size_t count, 
+                       loff_t *ppos)
+{
+       int i;
+       struct tty_struct * tty;
+       struct inode *inode;
+
+       /* Can't seek (pread) on ttys.  */
+       if (ppos != &file->f_pos)
+               return -ESPIPE;
+
+       tty = (struct tty_struct *)file->private_data;
+       inode = file->f_dentry->d_inode;
+       if (tty_paranoia_check(tty, inode->i_rdev, "tty_read"))
+               return -EIO;
+       if (!tty || (test_bit(TTY_IO_ERROR, &tty->flags)))
+               return -EIO;
+
+       /* This check not only needs to be done before reading, but also
+          whenever read_chan() gets woken up after sleeping, so I've
+          moved it to there.  This should only be done for the N_TTY
+          line discipline, anyway.  Same goes for write_chan(). -- jlc. */
+#if 0
+       if ((inode->i_rdev != CONSOLE_DEV) && /* don't stop on /dev/console */
+           (tty->pgrp > 0) &&
+           (current->tty == tty) &&
+           (tty->pgrp != current->pgrp))
+               if (is_ignored(SIGTTIN) || is_orphaned_pgrp(current->pgrp))
+                       return -EIO;
+               else {
+                       (void) kill_pg(current->pgrp, SIGTTIN, 1);
+                       return -ERESTARTSYS;
+               }
+#endif
+       lock_kernel();
+       if (tty->ldisc.read)
+               i = (tty->ldisc.read)(tty,file,buf,count);
+       else
+               i = -EIO;
+       unlock_kernel();
+       if (i > 0)
+               inode->i_atime = CURRENT_TIME;
+       return i;
+}
+
+/*
+ * Split writes up in sane blocksizes to avoid
+ * denial-of-service type attacks
+ */
+static inline ssize_t do_tty_write(
+       ssize_t (*write)(struct tty_struct *, struct file *, const unsigned char *, size_t),
+       struct tty_struct *tty,
+       struct file *file,
+       const unsigned char *buf,
+       size_t count)
+{
+       ssize_t ret = 0, written = 0;
+       
+       if (file->f_flags & O_NONBLOCK) {
+               if (down_trylock(&tty->atomic_write))
+                       return -EAGAIN;
+       }
+       else {
+               if (down_interruptible(&tty->atomic_write))
+                       return -ERESTARTSYS;
+       }
+       if ( test_bit(TTY_NO_WRITE_SPLIT, &tty->flags) ) {
+               lock_kernel();
+               written = write(tty, file, buf, count);
+               unlock_kernel();
+       } else {
+               for (;;) {
+                       unsigned long size = MAX(PAGE_SIZE*2,16384);
+                       if (size > count)
+                               size = count;
+                       lock_kernel();
+                       ret = write(tty, file, buf, size);
+                       unlock_kernel();
+                       if (ret <= 0)
+                               break;
+                       written += ret;
+                       buf += ret;
+                       count -= ret;
+                       if (!count)
+                               break;
+                       ret = -ERESTARTSYS;
+                       if (signal_pending(current))
+                               break;
+                       if (current->need_resched)
+                               schedule();
+               }
+       }
+       if (written) {
+               file->f_dentry->d_inode->i_mtime = CURRENT_TIME;
+               ret = written;
+       }
+       up(&tty->atomic_write);
+       return ret;
+}
+
+
+static ssize_t tty_write(struct file * file, const char * buf, size_t count,
+                        loff_t *ppos)
+{
+       int is_console;
+       struct tty_struct * tty;
+       struct inode *inode = file->f_dentry->d_inode;
+
+       /* Can't seek (pwrite) on ttys.  */
+       if (ppos != &file->f_pos)
+               return -ESPIPE;
+
+       /*
+        *      For now, we redirect writes from /dev/console as
+        *      well as /dev/tty0.
+        */
+       inode = file->f_dentry->d_inode;
+       is_console = (inode->i_rdev == SYSCONS_DEV ||
+                     inode->i_rdev == CONSOLE_DEV);
+
+       if (is_console) {
+               struct file *p = NULL;
+
+               spin_lock(&redirect_lock);
+               if (redirect) {
+                       get_file(redirect);
+                       p = redirect;
+               }
+               spin_unlock(&redirect_lock);
+
+               if (p) {
+                       ssize_t res = p->f_op->write(p, buf, count, &p->f_pos);
+                       fput(p);
+                       return res;
+               }
+       }
+
+       tty = (struct tty_struct *)file->private_data;
+       if (tty_paranoia_check(tty, inode->i_rdev, "tty_write"))
+               return -EIO;
+       if (!tty || !tty->driver.write || (test_bit(TTY_IO_ERROR, &tty->flags)))
+               return -EIO;
+#if 0
+       if (!is_console && L_TOSTOP(tty) && (tty->pgrp > 0) &&
+           (current->tty == tty) && (tty->pgrp != current->pgrp)) {
+               if (is_orphaned_pgrp(current->pgrp))
+                       return -EIO;
+               if (!is_ignored(SIGTTOU)) {
+                       (void) kill_pg(current->pgrp, SIGTTOU, 1);
+                       return -ERESTARTSYS;
+               }
+       }
+#endif
+       if (!tty->ldisc.write)
+               return -EIO;
+       return do_tty_write(tty->ldisc.write, tty, file,
+                           (const unsigned char *)buf, count);
+}
+
+/* Semaphore to protect creating and releasing a tty */
+static DECLARE_MUTEX(tty_sem);
+
+static void down_tty_sem(int index)
+{
+       down(&tty_sem);
+}
+
+static void up_tty_sem(int index)
+{
+       up(&tty_sem);
+}
+
+static void release_mem(struct tty_struct *tty, int idx);
+
+/*
+ * WSH 06/09/97: Rewritten to remove races and properly clean up after a
+ * failed open.  The new code protects the open with a semaphore, so it's
+ * really quite straightforward.  The semaphore locking can probably be
+ * relaxed for the (most common) case of reopening a tty.
+ */
+static int init_dev(kdev_t device, struct tty_struct **ret_tty)
+{
+       struct tty_struct *tty, *o_tty;
+       struct termios *tp, **tp_loc, *o_tp, **o_tp_loc;
+       struct termios *ltp, **ltp_loc, *o_ltp, **o_ltp_loc;
+       struct tty_driver *driver;      
+       int retval=0;
+       int idx;
+
+       driver = get_tty_driver(device);
+       if (!driver) {
+         return -ENODEV;
+       }
+
+       idx = MINOR(device) - driver->minor_start;
+
+       /* 
+        * Check whether we need to acquire the tty semaphore to avoid
+        * race conditions.  For now, play it safe.
+        */
+       down_tty_sem(idx);
+
+       /* check whether we're reopening an existing tty */
+       tty = driver->table[idx];
+       if (tty) goto fast_track;
+
+       /*
+        * First time open is complex, especially for PTY devices.
+        * This code guarantees that either everything succeeds and the
+        * TTY is ready for operation, or else the table slots are vacated
+        * and the allocated memory released.  (Except that the termios 
+        * and locked termios may be retained.)
+        */
+
+       o_tty = NULL;
+       tp = o_tp = NULL;
+       ltp = o_ltp = NULL;
+
+       tty = alloc_tty_struct();
+       if(!tty)
+               goto fail_no_mem;
+       initialize_tty_struct(tty);
+       tty->device = device;
+       tty->driver = *driver;
+
+       tp_loc = &driver->termios[idx];
+       if (!*tp_loc) {
+               tp = (struct termios *) kmalloc(sizeof(struct termios),
+                                               GFP_KERNEL);
+               if (!tp)
+                       goto free_mem_out;
+               *tp = driver->init_termios;
+       }
+
+       ltp_loc = &driver->termios_locked[idx];
+       if (!*ltp_loc) {
+               ltp = (struct termios *) kmalloc(sizeof(struct termios),
+                                                GFP_KERNEL);
+               if (!ltp)
+                       goto free_mem_out;
+               memset(ltp, 0, sizeof(struct termios));
+       }
+
+       if (driver->type == TTY_DRIVER_TYPE_PTY) {
+               o_tty = alloc_tty_struct();
+               if (!o_tty)
+                       goto free_mem_out;
+               initialize_tty_struct(o_tty);
+               o_tty->device = (kdev_t) MKDEV(driver->other->major,
+                                       driver->other->minor_start + idx);
+               o_tty->driver = *driver->other;
+
+               o_tp_loc  = &driver->other->termios[idx];
+               if (!*o_tp_loc) {
+                       o_tp = (struct termios *)
+                               kmalloc(sizeof(struct termios), GFP_KERNEL);
+                       if (!o_tp)
+                               goto free_mem_out;
+                       *o_tp = driver->other->init_termios;
+               }
+
+               o_ltp_loc = &driver->other->termios_locked[idx];
+               if (!*o_ltp_loc) {
+                       o_ltp = (struct termios *)
+                               kmalloc(sizeof(struct termios), GFP_KERNEL);
+                       if (!o_ltp)
+                               goto free_mem_out;
+                       memset(o_ltp, 0, sizeof(struct termios));
+               }
+
+               /*
+                * Everything allocated ... set up the o_tty structure.
+                */
+               driver->other->table[idx] = o_tty;
+               if (!*o_tp_loc)
+                       *o_tp_loc = o_tp;
+               if (!*o_ltp_loc)
+                       *o_ltp_loc = o_ltp;
+               o_tty->termios = *o_tp_loc;
+               o_tty->termios_locked = *o_ltp_loc;
+               (*driver->other->refcount)++;
+               if (driver->subtype == PTY_TYPE_MASTER)
+                       o_tty->count++;
+
+               /* Establish the links in both directions */
+               tty->link   = o_tty;
+               o_tty->link = tty;
+       }
+
+       /* 
+        * All structures have been allocated, so now we install them.
+        * Failures after this point use release_mem to clean up, so 
+        * there's no need to null out the local pointers.
+        */
+       driver->table[idx] = tty;
+       
+       if (!*tp_loc)
+               *tp_loc = tp;
+       if (!*ltp_loc)
+               *ltp_loc = ltp;
+       tty->termios = *tp_loc;
+       tty->termios_locked = *ltp_loc;
+       (*driver->refcount)++;
+       tty->count++;
+
+       /* 
+        * Structures all installed ... call the ldisc open routines.
+        * If we fail here just call release_mem to clean up.  No need
+        * to decrement the use counts, as release_mem doesn't care.
+        */
+       if (tty->ldisc.open) {
+               retval = (tty->ldisc.open)(tty);
+               if (retval)
+                       goto release_mem_out;
+       }
+       if (o_tty && o_tty->ldisc.open) {
+               retval = (o_tty->ldisc.open)(o_tty);
+               if (retval) {
+                       if (tty->ldisc.close)
+                               (tty->ldisc.close)(tty);
+                       goto release_mem_out;
+               }
+       }
+       goto success;
+
+       /*
+        * This fast open can be used if the tty is already open.
+        * No memory is allocated, and the only failures are from
+        * attempting to open a closing tty or attempting multiple
+        * opens on a pty master.
+        */
+fast_track:
+       if (test_bit(TTY_CLOSING, &tty->flags)) {
+               retval = -EIO;
+               goto end_init;
+       }
+       if (driver->type == TTY_DRIVER_TYPE_PTY &&
+           driver->subtype == PTY_TYPE_MASTER) {
+               /*
+                * special case for PTY masters: only one open permitted, 
+                * and the slave side open count is incremented as well.
+                */
+               if (tty->count) {
+                       retval = -EIO;
+                       goto end_init;
+               }
+               tty->link->count++;
+       }
+       tty->count++;
+       tty->driver = *driver; /* N.B. why do this every time?? */
+
+success:
+       *ret_tty = tty;
+       
+       /* All paths come through here to release the semaphore */
+end_init:
+       up_tty_sem(idx);
+       return retval;
+
+       /* Release locally allocated memory ... nothing placed in slots */
+free_mem_out:
+       if (o_tp)
+               kfree(o_tp);
+       if (o_tty)
+               free_tty_struct(o_tty);
+       if (ltp)
+               kfree(ltp);
+       if (tp)
+               kfree(tp);
+       free_tty_struct(tty);
+
+fail_no_mem:
+       retval = -ENOMEM;
+       goto end_init;
+
+       /* call the tty release_mem routine to clean out this slot */
+release_mem_out:
+       printk(KERN_INFO "init_dev: ldisc open failed, "
+                        "clearing slot %d\n", idx);
+       release_mem(tty, idx);
+       goto end_init;
+}
+
+/*
+ * Releases memory associated with a tty structure, and clears out the
+ * driver table slots.
+ */
+static void release_mem(struct tty_struct *tty, int idx)
+{
+       struct tty_struct *o_tty;
+       struct termios *tp;
+
+       if ((o_tty = tty->link) != NULL) {
+               o_tty->driver.table[idx] = NULL;
+               if (o_tty->driver.flags & TTY_DRIVER_RESET_TERMIOS) {
+                       tp = o_tty->driver.termios[idx];
+                       o_tty->driver.termios[idx] = NULL;
+                       kfree(tp);
+               }
+               o_tty->magic = 0;
+               (*o_tty->driver.refcount)--;
+               list_del(&o_tty->tty_files);
+               free_tty_struct(o_tty);
+       }
+
+       tty->driver.table[idx] = NULL;
+       if (tty->driver.flags & TTY_DRIVER_RESET_TERMIOS) {
+               tp = tty->driver.termios[idx];
+               tty->driver.termios[idx] = NULL;
+               kfree(tp);
+       }
+       tty->magic = 0;
+       (*tty->driver.refcount)--;
+       list_del(&tty->tty_files);
+       free_tty_struct(tty);
+}
+
+/*
+ * Even releasing the tty structures is a tricky business.. We have
+ * to be very careful that the structures are all released at the
+ * same time, as interrupts might otherwise get the wrong pointers.
+ *
+ * WSH 09/09/97: rewritten to avoid some nasty race conditions that could
+ * lead to double frees or releasing memory still in use.
+ */
+static void release_dev(struct file * filp)
+{
+       struct tty_struct *tty, *o_tty;
+       int     pty_master, tty_closing, o_tty_closing, do_sleep;
+       int     idx;
+       char    buf[64];
+       
+       tty = (struct tty_struct *)filp->private_data;
+       if (tty_paranoia_check(tty, filp->f_dentry->d_inode->i_rdev, "release_dev"))
+               return;
+
+       check_tty_count(tty, "release_dev");
+
+       tty_fasync(-1, filp, 0);
+
+       idx = MINOR(tty->device) - tty->driver.minor_start;
+       pty_master = (tty->driver.type == TTY_DRIVER_TYPE_PTY &&
+                     tty->driver.subtype == PTY_TYPE_MASTER);
+       o_tty = tty->link;
+
+#ifdef TTY_PARANOIA_CHECK
+       if (idx < 0 || idx >= tty->driver.num) {
+               printk(KERN_DEBUG "release_dev: bad idx when trying to "
+                                 "free (%s)\n", kdevname(tty->device));
+               return;
+       }
+       if (tty != tty->driver.table[idx]) {
+               printk(KERN_DEBUG "release_dev: driver.table[%d] not tty "
+                                 "for (%s)\n", idx, kdevname(tty->device));
+               return;
+       }
+       if (tty->termios != tty->driver.termios[idx]) {
+               printk(KERN_DEBUG "release_dev: driver.termios[%d] not termios "
+                      "for (%s)\n",
+                      idx, kdevname(tty->device));
+               return;
+       }
+       if (tty->termios_locked != tty->driver.termios_locked[idx]) {
+               printk(KERN_DEBUG "release_dev: driver.termios_locked[%d] not "
+                      "termios_locked for (%s)\n",
+                      idx, kdevname(tty->device));
+               return;
+       }
+#endif
+
+#ifdef TTY_DEBUG_HANGUP
+       printk(KERN_DEBUG "release_dev of %s (tty count=%d)...",
+              tty_name(tty, buf), tty->count);
+#endif
+
+#ifdef TTY_PARANOIA_CHECK
+       if (tty->driver.other) {
+               if (o_tty != tty->driver.other->table[idx]) {
+                       printk(KERN_DEBUG "release_dev: other->table[%d] "
+                                         "not o_tty for (%s)\n",
+                              idx, kdevname(tty->device));
+                       return;
+               }
+               if (o_tty->termios != tty->driver.other->termios[idx]) {
+                       printk(KERN_DEBUG "release_dev: other->termios[%d] "
+                                         "not o_termios for (%s)\n",
+                              idx, kdevname(tty->device));
+                       return;
+               }
+               if (o_tty->termios_locked != 
+                     tty->driver.other->termios_locked[idx]) {
+                       printk(KERN_DEBUG "release_dev: other->termios_locked["
+                                         "%d] not o_termios_locked for (%s)\n",
+                              idx, kdevname(tty->device));
+                       return;
+               }
+               if (o_tty->link != tty) {
+                       printk(KERN_DEBUG "release_dev: bad pty pointers\n");
+                       return;
+               }
+       }
+#endif
+
+       if (tty->driver.close)
+               tty->driver.close(tty, filp);
+
+       /*
+        * Sanity check: if tty->count is going to zero, there shouldn't be
+        * any waiters on tty->read_wait or tty->write_wait.  We test the
+        * wait queues and kick everyone out _before_ actually starting to
+        * close.  This ensures that we won't block while releasing the tty
+        * structure.
+        *
+        * The test for the o_tty closing is necessary, since the master and
+        * slave sides may close in any order.  If the slave side closes out
+        * first, its count will be one, since the master side holds an open.
+        * Thus this test wouldn't be triggered at the time the slave closes,
+        * so we do it now.
+        *
+        * Note that it's possible for the tty to be opened again while we're
+        * flushing out waiters.  By recalculating the closing flags before
+        * each iteration we avoid any problems.
+        */
+       while (1) {
+               tty_closing = tty->count <= 1;
+               o_tty_closing = o_tty &&
+                       (o_tty->count <= (pty_master ? 1 : 0));
+               do_sleep = 0;
+
+               if (tty_closing) {
+                       if (waitqueue_active(&tty->read_wait)) {
+                               wake_up(&tty->read_wait);
+                               do_sleep++;
+                       }
+                       if (waitqueue_active(&tty->write_wait)) {
+                               wake_up(&tty->write_wait);
+                               do_sleep++;
+                       }
+               }
+               if (o_tty_closing) {
+                       if (waitqueue_active(&o_tty->read_wait)) {
+                               wake_up(&o_tty->read_wait);
+                               do_sleep++;
+                       }
+                       if (waitqueue_active(&o_tty->write_wait)) {
+                               wake_up(&o_tty->write_wait);
+                               do_sleep++;
+                       }
+               }
+               if (!do_sleep)
+                       break;
+
+               printk(KERN_WARNING "release_dev: %s: read/write wait queue "
+                                   "active!\n", tty_name(tty, buf));
+               schedule();
+       }       
+
+       /*
+        * The closing flags are now consistent with the open counts on 
+        * both sides, and we've completed the last operation that could 
+        * block, so it's safe to proceed with closing.
+        */
+       if (pty_master) {
+               if (--o_tty->count < 0) {
+                       printk(KERN_WARNING "release_dev: bad pty slave count "
+                                           "(%d) for %s\n",
+                              o_tty->count, tty_name(o_tty, buf));
+                       o_tty->count = 0;
+               }
+       }
+       if (--tty->count < 0) {
+               printk(KERN_WARNING "release_dev: bad tty->count (%d) for %s\n",
+                      tty->count, tty_name(tty, buf));
+               tty->count = 0;
+       }
+
+       /*
+        * We've decremented tty->count, so we should zero out
+        * filp->private_data, to break the link between the tty and
+        * the file descriptor.  Otherwise if filp_close() blocks before
+        * the file descriptor is removed from the inuse_filp
+        * list, check_tty_count() could observe a discrepancy and
+        * printk a warning message to the user.
+        */
+       filp->private_data = 0;
+
+       /*
+        * Perform some housekeeping before deciding whether to return.
+        *
+        * Set the TTY_CLOSING flag if this was the last open.  In the
+        * case of a pty we may have to wait around for the other side
+        * to close, and TTY_CLOSING makes sure we can't be reopened.
+        */
+       if(tty_closing)
+               set_bit(TTY_CLOSING, &tty->flags);
+       if(o_tty_closing)
+               set_bit(TTY_CLOSING, &o_tty->flags);
+
+       /*
+        * If _either_ side is closing, make sure there aren't any
+        * processes that still think tty or o_tty is their controlling
+        * tty.
+        */
+       if (tty_closing || o_tty_closing) {
+               struct task_struct *p;
+
+               read_lock(&tasklist_lock);
+               for_each_task(p) {
+                       if (p->tty == tty || (o_tty && p->tty == o_tty))
+                               p->tty = NULL;
+               }
+               read_unlock(&tasklist_lock);
+       }
+
+       /* check whether both sides are closing ... */
+       if (!tty_closing || (o_tty && !o_tty_closing))
+               return;
+       
+#ifdef TTY_DEBUG_HANGUP
+       printk(KERN_DEBUG "freeing tty structure...");
+#endif
+
+       /*
+        * Shutdown the current line discipline, and reset it to N_TTY.
+        * N.B. why reset ldisc when we're releasing the memory??
+        */
+       if (tty->ldisc.close)
+               (tty->ldisc.close)(tty);
+       tty->ldisc = ldiscs[N_TTY];
+       tty->termios->c_line = N_TTY;
+       if (o_tty) {
+               if (o_tty->ldisc.close)
+                       (o_tty->ldisc.close)(o_tty);
+               o_tty->ldisc = ldiscs[N_TTY];
+       }
+       
+       /*
+        * Make sure that the tty's task queue isn't activated. 
+        */
+       run_task_queue(&tq_timer);
+       flush_scheduled_tasks();
+
+       /* 
+        * The release_mem function takes care of the details of clearing
+        * the slots and preserving the termios structure.
+        */
+       release_mem(tty, idx);
+}
+
+/*
+ * tty_open and tty_release keep up the tty count that contains the
+ * number of opens done on a tty. We cannot use the inode-count, as
+ * different inodes might point to the same tty.
+ *
+ * Open-counting is needed for pty masters, as well as for keeping
+ * track of serial lines: DTR is dropped when the last close happens.
+ * (This is not done solely through tty->count, now.  - Ted 1/27/92)
+ *
+ * The termios state of a pty is reset on first open so that
+ * settings don't persist across reuse.
+ */
+static int tty_open(struct inode * inode, struct file * filp)
+{
+       struct tty_struct *tty;
+       int noctty, retval;
+       kdev_t device;
+       unsigned short saved_flags;
+       char    buf[64];
+
+       saved_flags = filp->f_flags;
+retry_open:
+       noctty = filp->f_flags & O_NOCTTY;
+       device = inode->i_rdev;
+       if (device == TTY_DEV) {
+               if (!current->tty)
+                       return -ENXIO;
+               device = current->tty->device;
+               filp->f_flags |= O_NONBLOCK; /* Don't let /dev/tty block */
+               /* noctty = 1; */
+       }
+#ifdef CONFIG_VT
+       if (device == CONSOLE_DEV) {
+               extern int fg_console;
+               device = MKDEV(TTY_MAJOR, fg_console + 1);
+               noctty = 1;
+       }
+#endif
+       if (device == SYSCONS_DEV) {
+               struct console *c = console_drivers;
+               while(c && !c->device)
+                       c = c->next;
+               if (!c)
+                        return -ENODEV;
+                device = c->device(c);
+               filp->f_flags |= O_NONBLOCK; /* Don't let /dev/console block */
+               noctty = 1;
+       }
+
+       if (device == PTMX_DEV) {
+#ifdef CONFIG_UNIX98_PTYS
+
+               /* find a free pty. */
+               int major, minor;
+               struct tty_driver *driver;
+
+               /* find a device that is not in use. */
+               retval = -1;
+               for ( major = 0 ; major < UNIX98_NR_MAJORS ; major++ ) {
+                       driver = &ptm_driver[major];
+                       for (minor = driver->minor_start ;
+                            minor < driver->minor_start + driver->num ;
+                            minor++) {
+                               device = MKDEV(driver->major, minor);
+                               if (!init_dev(device, &tty)) goto ptmx_found; /* ok! */
+                       }
+               }
+               return -EIO; /* no free ptys */
+       ptmx_found:
+               set_bit(TTY_PTY_LOCK, &tty->flags); /* LOCK THE SLAVE */
+               minor -= driver->minor_start;
+               devpts_pty_new(driver->other->name_base + minor, MKDEV(driver->other->major, minor + driver->other->minor_start));
+               tty_register_devfs(&pts_driver[major], DEVFS_FL_DEFAULT,
+                                  pts_driver[major].minor_start + minor);
+               noctty = 1;
+               goto init_dev_done;
+
+#else   /* CONFIG_UNIX_98_PTYS */
+
+               return -ENODEV;
+
+#endif  /* CONFIG_UNIX_98_PTYS */
+       }
+
+       retval = init_dev(device, &tty);
+       if (retval)
+               return retval;
+
+#ifdef CONFIG_UNIX98_PTYS
+init_dev_done:
+#endif
+       filp->private_data = tty;
+       file_move(filp, &tty->tty_files);
+       check_tty_count(tty, "tty_open");
+       if (tty->driver.type == TTY_DRIVER_TYPE_PTY &&
+           tty->driver.subtype == PTY_TYPE_MASTER)
+               noctty = 1;
+#ifdef TTY_DEBUG_HANGUP
+       printk(KERN_DEBUG "opening %s...", tty_name(tty, buf));
+#endif
+       if (tty->driver.open)
+               retval = tty->driver.open(tty, filp);
+       else
+               retval = -ENODEV;
+       filp->f_flags = saved_flags;
+
+       if (!retval && test_bit(TTY_EXCLUSIVE, &tty->flags) && !suser())
+               retval = -EBUSY;
+
+       if (retval) {
+#ifdef TTY_DEBUG_HANGUP
+               printk(KERN_DEBUG "error %d in opening %s...", retval,
+                      tty_name(tty, buf));
+#endif
+
+               release_dev(filp);
+               if (retval != -ERESTARTSYS)
+                       return retval;
+               if (signal_pending(current))
+                       return retval;
+               schedule();
+               /*
+                * Need to reset f_op in case a hangup happened.
+                */
+               filp->f_op = &tty_fops;
+               goto retry_open;
+       }
+       if (!noctty &&
+           current->leader &&
+           !current->tty &&
+           tty->session == 0) {
+               task_lock(current);
+               current->tty = tty;
+               task_unlock(current);
+               current->tty_old_pgrp = 0;
+               tty->session = current->session;
+               tty->pgrp = current->pgrp;
+       }
+       if ((tty->driver.type == TTY_DRIVER_TYPE_SERIAL) &&
+           (tty->driver.subtype == SERIAL_TYPE_CALLOUT) &&
+           (tty->count == 1)) {
+               static int nr_warns;
+               if (nr_warns < 5) {
+                       printk(KERN_WARNING "tty_io.c: "
+                               "process %d (%s) used obsolete /dev/%s - "
+                               "update software to use /dev/ttyS%d\n",
+                               current->pid, current->comm,
+                               tty_name(tty, buf), TTY_NUMBER(tty));
+                       nr_warns++;
+               }
+       }
+       return 0;
+}
+
+static int tty_release(struct inode * inode, struct file * filp)
+{
+       lock_kernel();
+       release_dev(filp);
+       unlock_kernel();
+       return 0;
+}
+
+/* No kernel lock held - fine */
+static unsigned int tty_poll(struct file * filp, poll_table * wait)
+{
+       struct tty_struct * tty;
+
+       tty = (struct tty_struct *)filp->private_data;
+       if (tty_paranoia_check(tty, filp->f_dentry->d_inode->i_rdev, "tty_poll"))
+               return 0;
+
+       if (tty->ldisc.poll)
+               return (tty->ldisc.poll)(tty, filp, wait);
+       return 0;
+}
+
+static int tty_fasync(int fd, struct file * filp, int on)
+{
+       struct tty_struct * tty;
+       int retval;
+
+       tty = (struct tty_struct *)filp->private_data;
+       if (tty_paranoia_check(tty, filp->f_dentry->d_inode->i_rdev, "tty_fasync"))
+               return 0;
+       
+       retval = fasync_helper(fd, filp, on, &tty->fasync);
+       if (retval <= 0)
+               return retval;
+
+       if (on) {
+               if (!waitqueue_active(&tty->read_wait))
+                       tty->minimum_to_wake = 1;
+               if (filp->f_owner.pid == 0) {
+                       filp->f_owner.pid = (-tty->pgrp) ? : current->pid;
+                       filp->f_owner.uid = current->uid;
+                       filp->f_owner.euid = current->euid;
+               }
+       } else {
+               if (!tty->fasync && !waitqueue_active(&tty->read_wait))
+                       tty->minimum_to_wake = N_TTY_BUF_SIZE;
+       }
+       return 0;
+}
+
+static int tiocsti(struct tty_struct *tty, char * arg)
+{
+       char ch, mbz = 0;
+
+       if ((current->tty != tty) && !suser())
+               return -EPERM;
+       if (get_user(ch, arg))
+               return -EFAULT;
+       tty->ldisc.receive_buf(tty, &ch, &mbz, 1);
+       return 0;
+}
+
+static int tiocgwinsz(struct tty_struct *tty, struct winsize * arg)
+{
+       if (copy_to_user(arg, &tty->winsize, sizeof(*arg)))
+               return -EFAULT;
+       return 0;
+}
+
+static int tiocswinsz(struct tty_struct *tty, struct tty_struct *real_tty,
+       struct winsize * arg)
+{
+       struct winsize tmp_ws;
+
+       if (copy_from_user(&tmp_ws, arg, sizeof(*arg)))
+               return -EFAULT;
+       if (!memcmp(&tmp_ws, &tty->winsize, sizeof(*arg)))
+               return 0;
+       if (tty->pgrp > 0)
+               kill_pg(tty->pgrp, SIGWINCH, 1);
+       if ((real_tty->pgrp != tty->pgrp) && (real_tty->pgrp > 0))
+               kill_pg(real_tty->pgrp, SIGWINCH, 1);
+       tty->winsize = tmp_ws;
+       real_tty->winsize = tmp_ws;
+       return 0;
+}
+
+static int tioccons(struct inode *inode, struct file *file)
+{
+       if (inode->i_rdev == SYSCONS_DEV ||
+           inode->i_rdev == CONSOLE_DEV) {
+               struct file *f;
+               if (!suser())
+                       return -EPERM;
+               spin_lock(&redirect_lock);
+               f = redirect;
+               redirect = NULL;
+               spin_unlock(&redirect_lock);
+               if (f)
+                       fput(f);
+               return 0;
+       }
+       spin_lock(&redirect_lock);
+       if (redirect) {
+               spin_unlock(&redirect_lock);
+               return -EBUSY;
+       }
+       get_file(file);
+       redirect = file;
+       spin_unlock(&redirect_lock);
+       return 0;
+}
+
+
+static int fionbio(struct file *file, int *arg)
+{
+       int nonblock;
+
+       if (get_user(nonblock, arg))
+               return -EFAULT;
+
+       if (nonblock)
+               file->f_flags |= O_NONBLOCK;
+       else
+               file->f_flags &= ~O_NONBLOCK;
+       return 0;
+}
+
+static int tiocsctty(struct tty_struct *tty, int arg)
+{
+       if (current->leader &&
+           (current->session == tty->session))
+               return 0;
+       /*
+        * The process must be a session leader and
+        * not have a controlling tty already.
+        */
+       if (!current->leader || current->tty)
+               return -EPERM;
+       if (tty->session > 0) {
+               /*
+                * This tty is already the controlling
+                * tty for another session group!
+                */
+               if ((arg == 1) && suser()) {
+                       /*
+                        * Steal it away
+                        */
+                       struct task_struct *p;
+
+                       read_lock(&tasklist_lock);
+                       for_each_task(p)
+                               if (p->tty == tty)
+                                       p->tty = NULL;
+                       read_unlock(&tasklist_lock);
+               } else
+                       return -EPERM;
+       }
+       task_lock(current);
+       current->tty = tty;
+       task_unlock(current);
+       current->tty_old_pgrp = 0;
+       tty->session = current->session;
+       tty->pgrp = current->pgrp;
+       return 0;
+}
+
+static int tiocgpgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t *arg)
+{
+       /*
+        * (tty == real_tty) is a cheap way of
+        * testing if the tty is NOT a master pty.
+        */
+       if (tty == real_tty && current->tty != real_tty)
+               return -ENOTTY;
+       return put_user(real_tty->pgrp, arg);
+}
+
+static int tiocspgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t *arg)
+{
+       pid_t pgrp;
+       int retval = tty_check_change(real_tty);
+
+       if (retval == -EIO)
+               return -ENOTTY;
+       if (retval)
+               return retval;
+       if (!current->tty ||
+           (current->tty != real_tty) ||
+           (real_tty->session != current->session))
+               return -ENOTTY;
+       if (get_user(pgrp, (pid_t *) arg))
+               return -EFAULT;
+       if (pgrp < 0)
+               return -EINVAL;
+       if (session_of_pgrp(pgrp) != current->session)
+               return -EPERM;
+       real_tty->pgrp = pgrp;
+       return 0;
+}
+
+static int tiocgsid(struct tty_struct *tty, struct tty_struct *real_tty, pid_t *arg)
+{
+       /*
+        * (tty == real_tty) is a cheap way of
+        * testing if the tty is NOT a master pty.
+       */
+       if (tty == real_tty && current->tty != real_tty)
+               return -ENOTTY;
+       if (real_tty->session <= 0)
+               return -ENOTTY;
+       return put_user(real_tty->session, arg);
+}
+
+static int tiocttygstruct(struct tty_struct *tty, struct tty_struct *arg)
+{
+       if (copy_to_user(arg, tty, sizeof(*arg)))
+               return -EFAULT;
+       return 0;
+}
+
+static int tiocsetd(struct tty_struct *tty, int *arg)
+{
+       int ldisc;
+
+       if (get_user(ldisc, arg))
+               return -EFAULT;
+       return tty_set_ldisc(tty, ldisc);
+}
+
+static int send_break(struct tty_struct *tty, int duration)
+{
+       set_current_state(TASK_INTERRUPTIBLE);
+
+       tty->driver.break_ctl(tty, -1);
+       if (!signal_pending(current))
+               schedule_timeout(duration);
+       tty->driver.break_ctl(tty, 0);
+       if (signal_pending(current))
+               return -EINTR;
+       return 0;
+}
+
+static int tty_generic_brk(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg)
+{
+       if (cmd == TCSBRK && arg) 
+       {
+               /* tcdrain case */
+               int retval = tty_check_change(tty);
+               if (retval)
+                       return retval;
+               tty_wait_until_sent(tty, 0);
+               if (signal_pending(current))
+                       return -EINTR;
+       }
+       return 0;
+}
+
+/*
+ * Split this up, as gcc can choke on it otherwise..
+ */
+int tty_ioctl(struct inode * inode, struct file * file,
+             unsigned int cmd, unsigned long arg)
+{
+       struct tty_struct *tty, *real_tty;
+       int retval;
+       
+       tty = (struct tty_struct *)file->private_data;
+       if (tty_paranoia_check(tty, inode->i_rdev, "tty_ioctl"))
+               return -EINVAL;
+
+       real_tty = tty;
+       if (tty->driver.type == TTY_DRIVER_TYPE_PTY &&
+           tty->driver.subtype == PTY_TYPE_MASTER)
+               real_tty = tty->link;
+
+       /*
+        * Break handling by driver
+        */
+       if (!tty->driver.break_ctl) {
+               switch(cmd) {
+               case TIOCSBRK:
+               case TIOCCBRK:
+                       if (tty->driver.ioctl)
+                               return tty->driver.ioctl(tty, file, cmd, arg);
+                       return -EINVAL;
+                       
+               /* These two ioctl's always return success; even if */
+               /* the driver doesn't support them. */
+               case TCSBRK:
+               case TCSBRKP:
+                       retval = -ENOIOCTLCMD;
+                       if (tty->driver.ioctl)
+                               retval = tty->driver.ioctl(tty, file, cmd, arg);
+                       /* Not driver handled */
+                       if (retval == -ENOIOCTLCMD)
+                               retval = tty_generic_brk(tty, file, cmd, arg);
+                       return retval;
+               }
+       }
+
+       /*
+        * Factor out some common prep work
+        */
+       switch (cmd) {
+       case TIOCSETD:
+       case TIOCSBRK:
+       case TIOCCBRK:
+       case TCSBRK:
+       case TCSBRKP:                   
+               retval = tty_check_change(tty);
+               if (retval)
+                       return retval;
+               if (cmd != TIOCCBRK) {
+                       tty_wait_until_sent(tty, 0);
+                       if (signal_pending(current))
+                               return -EINTR;
+               }
+               break;
+       }
+
+       switch (cmd) {
+               case TIOCSTI:
+                       return tiocsti(tty, (char *)arg);
+               case TIOCGWINSZ:
+                       return tiocgwinsz(tty, (struct winsize *) arg);
+               case TIOCSWINSZ:
+                       return tiocswinsz(tty, real_tty, (struct winsize *) arg);
+               case TIOCCONS:
+                       return real_tty!=tty ? -EINVAL : tioccons(inode, file);
+               case FIONBIO:
+                       return fionbio(file, (int *) arg);
+               case TIOCEXCL:
+                       set_bit(TTY_EXCLUSIVE, &tty->flags);
+                       return 0;
+               case TIOCNXCL:
+                       clear_bit(TTY_EXCLUSIVE, &tty->flags);
+                       return 0;
+               case TIOCNOTTY:
+                       if (current->tty != tty)
+                               return -ENOTTY;
+                       if (current->leader)
+                               disassociate_ctty(0);
+                       task_lock(current);
+                       current->tty = NULL;
+                       task_unlock(current);
+                       return 0;
+               case TIOCSCTTY:
+                       return tiocsctty(tty, arg);
+               case TIOCGPGRP:
+                       return tiocgpgrp(tty, real_tty, (pid_t *) arg);
+               case TIOCSPGRP:
+                       return tiocspgrp(tty, real_tty, (pid_t *) arg);
+               case TIOCGSID:
+                       return tiocgsid(tty, real_tty, (pid_t *) arg);
+               case TIOCGETD:
+                       return put_user(tty->ldisc.num, (int *) arg);
+               case TIOCSETD:
+                       return tiocsetd(tty, (int *) arg);
+#ifdef CONFIG_VT
+               case TIOCLINUX:
+                       return tioclinux(tty, arg);
+#endif
+               case TIOCTTYGSTRUCT:
+                       return tiocttygstruct(tty, (struct tty_struct *) arg);
+
+               /*
+                * Break handling
+                */
+               case TIOCSBRK:  /* Turn break on, unconditionally */
+                       tty->driver.break_ctl(tty, -1);
+                       return 0;
+                       
+               case TIOCCBRK:  /* Turn break off, unconditionally */
+                       tty->driver.break_ctl(tty, 0);
+                       return 0;
+               case TCSBRK:   /* SVID version: non-zero arg --> no break */
+                       /*
+                        * XXX is the above comment correct, or the
+                        * code below correct?  Is this ioctl used at
+                        * all by anyone?
+                        */
+                       if (!arg)
+                               return send_break(tty, HZ/4);
+                       return 0;
+               case TCSBRKP:   /* support for POSIX tcsendbreak() */   
+                       return send_break(tty, arg ? arg*(HZ/10) : HZ/4);
+       }
+       if (tty->driver.ioctl) {
+               int retval = (tty->driver.ioctl)(tty, file, cmd, arg);
+               if (retval != -ENOIOCTLCMD)
+                       return retval;
+       }
+       if (tty->ldisc.ioctl) {
+               int retval = (tty->ldisc.ioctl)(tty, file, cmd, arg);
+               if (retval != -ENOIOCTLCMD)
+                       return retval;
+       }
+       return -EINVAL;
+}
+
+
+/*
+ * This implements the "Secure Attention Key" ---  the idea is to
+ * prevent trojan horses by killing all processes associated with this
+ * tty when the user hits the "Secure Attention Key".  Required for
+ * super-paranoid applications --- see the Orange Book for more details.
+ * 
+ * This code could be nicer; ideally it should send a HUP, wait a few
+ * seconds, then send a INT, and then a KILL signal.  But you then
+ * have to coordinate with the init process, since all processes associated
+ * with the current tty must be dead before the new getty is allowed
+ * to spawn.
+ *
+ * Now, if it would be correct ;-/ The current code has a nasty hole -
+ * it doesn't catch files in flight. We may send the descriptor to ourselves
+ * via AF_UNIX socket, close it and later fetch from socket. FIXME.
+ *
+ * Nasty bug: do_SAK is being called in interrupt context.  This can
+ * deadlock.  We punt it up to process context.  AKPM - 16Mar2001
+ */
+static void __do_SAK(void *arg)
+{
+#ifdef TTY_SOFT_SAK
+       tty_hangup(tty);
+#else
+       struct tty_struct *tty = arg;
+       struct task_struct *p;
+       int session;
+       int             i;
+       struct file     *filp;
+       
+       if (!tty)
+               return;
+       session  = tty->session;
+       if (tty->ldisc.flush_buffer)
+               tty->ldisc.flush_buffer(tty);
+       if (tty->driver.flush_buffer)
+               tty->driver.flush_buffer(tty);
+       read_lock(&tasklist_lock);
+       for_each_task(p) {
+               if ((p->tty == tty) ||
+                   ((session > 0) && (p->session == session))) {
+                       send_sig(SIGKILL, p, 1);
+                       continue;
+               }
+               task_lock(p);
+               if (p->files) {
+                       read_lock(&p->files->file_lock);
+                       for (i=0; i < p->files->max_fds; i++) {
+                               filp = fcheck_files(p->files, i);
+                               if (filp && (filp->f_op == &tty_fops) &&
+                                   (filp->private_data == tty)) {
+                                       send_sig(SIGKILL, p, 1);
+                                       break;
+                               }
+                       }
+                       read_unlock(&p->files->file_lock);
+               }
+               task_unlock(p);
+       }
+       read_unlock(&tasklist_lock);
+#endif
+}
+
+/*
+ * The tq handling here is a little racy - tty->SAK_tq may already be queued.
+ * But there's no mechanism to fix that without futzing with tqueue_lock.
+ * Fortunately we don't need to worry, because if ->SAK_tq is already queued,
+ * the values which we write to it will be identical to the values which it
+ * already has. --akpm
+ */
+void do_SAK(struct tty_struct *tty)
+{
+       if (!tty)
+               return;
+       PREPARE_TQUEUE(&tty->SAK_tq, __do_SAK, tty);
+       schedule_task(&tty->SAK_tq);
+}
+
+/*
+ * This routine is called out of the software interrupt to flush data
+ * from the flip buffer to the line discipline.
+ */
+static void flush_to_ldisc(void *private_)
+{
+       struct tty_struct *tty = (struct tty_struct *) private_;
+       unsigned char   *cp;
+       char            *fp;
+       int             count;
+       unsigned long flags;
+
+       if (test_bit(TTY_DONT_FLIP, &tty->flags)) {
+               queue_task(&tty->flip.tqueue, &tq_timer);
+               return;
+       }
+       if (tty->flip.buf_num) {
+               cp = tty->flip.char_buf + TTY_FLIPBUF_SIZE;
+               fp = tty->flip.flag_buf + TTY_FLIPBUF_SIZE;
+               tty->flip.buf_num = 0;
+
+               save_flags(flags); cli();
+               tty->flip.char_buf_ptr = tty->flip.char_buf;
+               tty->flip.flag_buf_ptr = tty->flip.flag_buf;
+       } else {
+               cp = tty->flip.char_buf;
+               fp = tty->flip.flag_buf;
+               tty->flip.buf_num = 1;
+
+               save_flags(flags); cli();
+               tty->flip.char_buf_ptr = tty->flip.char_buf + TTY_FLIPBUF_SIZE;
+               tty->flip.flag_buf_ptr = tty->flip.flag_buf + TTY_FLIPBUF_SIZE;
+       }
+       count = tty->flip.count;
+       tty->flip.count = 0;
+       restore_flags(flags);
+       
+       tty->ldisc.receive_buf(tty, cp, fp, count);
+}
+
+/*
+ * Routine which returns the baud rate of the tty
+ *
+ * Note that the baud_table needs to be kept in sync with the
+ * include/asm/termbits.h file.
+ */
+static int baud_table[] = {
+       0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
+       9600, 19200, 38400, 57600, 115200, 230400, 460800,
+#ifdef __sparc__
+       76800, 153600, 307200, 614400, 921600
+#else
+       500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000,
+       2500000, 3000000, 3500000, 4000000
+#endif
+};
+
+static int n_baud_table = sizeof(baud_table)/sizeof(int);
+
+int tty_get_baud_rate(struct tty_struct *tty)
+{
+       unsigned int cflag, i;
+
+       cflag = tty->termios->c_cflag;
+
+       i = cflag & CBAUD;
+       if (i & CBAUDEX) {
+               i &= ~CBAUDEX;
+               if (i < 1 || i+15 >= n_baud_table) 
+                       tty->termios->c_cflag &= ~CBAUDEX;
+               else
+                       i += 15;
+       }
+       if (i==15 && tty->alt_speed) {
+               if (!tty->warned) {
+                       printk(KERN_WARNING "Use of setserial/setrocket to "
+                                           "set SPD_* flags is deprecated\n");
+                       tty->warned = 1;
+               }
+               return(tty->alt_speed);
+       }
+       
+       return baud_table[i];
+}
+
+void tty_flip_buffer_push(struct tty_struct *tty)
+{
+       if (tty->low_latency)
+               flush_to_ldisc((void *) tty);
+       else
+               queue_task(&tty->flip.tqueue, &tq_timer);
+}
+
+/*
+ * This subroutine initializes a tty structure.
+ */
+static void initialize_tty_struct(struct tty_struct *tty)
+{
+       memset(tty, 0, sizeof(struct tty_struct));
+       tty->magic = TTY_MAGIC;
+       tty->ldisc = ldiscs[N_TTY];
+       tty->pgrp = -1;
+       tty->flip.char_buf_ptr = tty->flip.char_buf;
+       tty->flip.flag_buf_ptr = tty->flip.flag_buf;
+       tty->flip.tqueue.routine = flush_to_ldisc;
+       tty->flip.tqueue.data = tty;
+       init_MUTEX(&tty->flip.pty_sem);
+       init_waitqueue_head(&tty->write_wait);
+       init_waitqueue_head(&tty->read_wait);
+       tty->tq_hangup.routine = do_tty_hangup;
+       tty->tq_hangup.data = tty;
+       sema_init(&tty->atomic_read, 1);
+       sema_init(&tty->atomic_write, 1);
+       spin_lock_init(&tty->read_lock);
+       INIT_LIST_HEAD(&tty->tty_files);
+       INIT_TQUEUE(&tty->SAK_tq, 0, 0);
+}
+
+/*
+ * The default put_char routine if the driver did not define one.
+ */
+void tty_default_put_char(struct tty_struct *tty, unsigned char ch)
+{
+       tty->driver.write(tty, 0, &ch, 1);
+}
+
+/*
+ * Register a tty device described by <driver>, with minor number <minor>.
+ */
+void tty_register_devfs (struct tty_driver *driver, unsigned int flags, unsigned minor)
+{
+#ifdef CONFIG_DEVFS_FS
+       umode_t mode = S_IFCHR | S_IRUSR | S_IWUSR;
+       kdev_t device = MKDEV (driver->major, minor);
+       int idx = minor - driver->minor_start;
+       char buf[32];
+
+       switch (device) {
+               case TTY_DEV:
+               case PTMX_DEV:
+                       mode |= S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
+                       break;
+               default:
+                       if (driver->major == PTY_MASTER_MAJOR)
+                               mode |= S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
+                       break;
+       }
+       if ( (minor <  driver->minor_start) || 
+            (minor >= driver->minor_start + driver->num) ) {
+               printk(KERN_ERR "Attempt to register invalid minor number "
+                      "with devfs (%d:%d).\n", (int)driver->major,(int)minor);
+               return;
+       }
+#  ifdef CONFIG_UNIX98_PTYS
+       if ( (driver->major >= UNIX98_PTY_SLAVE_MAJOR) &&
+            (driver->major < UNIX98_PTY_SLAVE_MAJOR + UNIX98_NR_MAJORS) )
+               flags |= DEVFS_FL_CURRENT_OWNER;
+#  endif
+       sprintf(buf, driver->name, idx + driver->name_base);
+       devfs_register (NULL, buf, flags | DEVFS_FL_DEFAULT,
+                       driver->major, minor, mode, &tty_fops, NULL);
+#endif /* CONFIG_DEVFS_FS */
+}
+
+void tty_unregister_devfs (struct tty_driver *driver, unsigned minor)
+{
+#ifdef CONFIG_DEVFS_FS
+       void * handle;
+       int idx = minor - driver->minor_start;
+       char buf[32];
+
+       sprintf(buf, driver->name, idx + driver->name_base);
+       handle = devfs_find_handle (NULL, buf, driver->major, minor,
+                                   DEVFS_SPECIAL_CHR, 0);
+       devfs_unregister (handle);
+#endif /* CONFIG_DEVFS_FS */
+}
+
+EXPORT_SYMBOL(tty_register_devfs);
+EXPORT_SYMBOL(tty_unregister_devfs);
+
+/*
+ * Called by a tty driver to register itself.
+ */
+int tty_register_driver(struct tty_driver *driver)
+{
+       int error;
+        int i;
+
+       if (driver->flags & TTY_DRIVER_INSTALLED)
+               return 0;
+
+       error = devfs_register_chrdev(driver->major, driver->name, &tty_fops);
+       if (error < 0)
+               return error;
+       else if(driver->major == 0)
+               driver->major = error;
+
+       if (!driver->put_char)
+               driver->put_char = tty_default_put_char;
+       
+       driver->prev = 0;
+       driver->next = tty_drivers;
+       if (tty_drivers) tty_drivers->prev = driver;
+       tty_drivers = driver;
+       
+       if ( !(driver->flags & TTY_DRIVER_NO_DEVFS) ) {
+               for(i = 0; i < driver->num; i++)
+                   tty_register_devfs(driver, 0, driver->minor_start + i);
+       }
+       proc_tty_register_driver(driver);
+       return error;
+}
+
+/*
+ * Called by a tty driver to unregister itself.
+ */
+int tty_unregister_driver(struct tty_driver *driver)
+{
+       int     retval;
+       struct tty_driver *p;
+       int     i, found = 0;
+       struct termios *tp;
+       const char *othername = NULL;
+       
+       if (*driver->refcount)
+               return -EBUSY;
+
+       for (p = tty_drivers; p; p = p->next) {
+               if (p == driver)
+                       found++;
+               else if (p->major == driver->major)
+                       othername = p->name;
+       }
+       
+       if (!found)
+               return -ENOENT;
+
+       if (othername == NULL) {
+               retval = devfs_unregister_chrdev(driver->major, driver->name);
+               if (retval)
+                       return retval;
+       } else
+               devfs_register_chrdev(driver->major, othername, &tty_fops);
+
+       if (driver->prev)
+               driver->prev->next = driver->next;
+       else
+               tty_drivers = driver->next;
+       
+       if (driver->next)
+               driver->next->prev = driver->prev;
+
+       /*
+        * Free the termios and termios_locked structures because
+        * we don't want to get memory leaks when modular tty
+        * drivers are removed from the kernel.
+        */
+       for (i = 0; i < driver->num; i++) {
+               tp = driver->termios[i];
+               if (tp) {
+                       driver->termios[i] = NULL;
+                       kfree(tp);
+               }
+               tp = driver->termios_locked[i];
+               if (tp) {
+                       driver->termios_locked[i] = NULL;
+                       kfree(tp);
+               }
+               tty_unregister_devfs(driver, driver->minor_start + i);
+       }
+       proc_tty_unregister_driver(driver);
+       return 0;
+}
+
+
+/*
+ * Initialize the console device. This is called *early*, so
+ * we can't necessarily depend on lots of kernel help here.
+ * Just do some early initializations, and do the complex setup
+ * later.
+ */
+void __init console_init(void)
+{
+        /* Setup the default TTY line discipline. */
+       memset(ldiscs, 0, sizeof(ldiscs));
+       (void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);
+
+       /*
+        * Set up the standard termios.  Individual tty drivers may 
+        * deviate from this; this is used as a template.
+        */
+       memset(&tty_std_termios, 0, sizeof(struct termios));
+       memcpy(tty_std_termios.c_cc, INIT_C_CC, NCCS);
+       tty_std_termios.c_iflag = ICRNL | IXON;
+       tty_std_termios.c_oflag = OPOST | ONLCR;
+       tty_std_termios.c_cflag = B38400 | CS8 | CREAD | HUPCL;
+       tty_std_termios.c_lflag = ISIG | ICANON | ECHO | ECHOE | ECHOK |
+               ECHOCTL | ECHOKE | IEXTEN;
+
+       /*
+        * set up the console device so that later boot sequences can 
+        * inform about problems etc..
+        */
+#ifdef CONFIG_EARLY_PRINTK
+       disable_early_printk(); 
+#endif
+
+#ifdef CONFIG_XEN_CONSOLE
+        xen_console_init();
+#endif
+
+#ifdef CONFIG_VT
+       con_init();
+#endif
+
+#ifdef CONFIG_AU1X00_SERIAL_CONSOLE
+       au1x00_serial_console_init();
+#endif
+#ifdef CONFIG_SERIAL_CONSOLE
+#if (defined(CONFIG_8xx) || defined(CONFIG_8260))
+       console_8xx_init();
+#elif defined(CONFIG_MAC_SERIAL) && defined(CONFIG_SERIAL)
+       if (_machine == _MACH_Pmac)
+               mac_scc_console_init();
+       else
+               serial_console_init();
+#elif defined(CONFIG_MAC_SERIAL)
+       mac_scc_console_init();
+#elif defined(CONFIG_PARISC)
+       pdc_console_init();
+#elif defined(CONFIG_SERIAL)
+       serial_console_init();
+#endif /* CONFIG_8xx */
+#if defined(CONFIG_MVME162_SCC) || defined(CONFIG_BVME6000_SCC) || defined(CONFIG_MVME147_SCC)
+       vme_scc_console_init();
+#endif
+#if defined(CONFIG_SERIAL167)
+       serial167_console_init();
+#endif
+#if defined(CONFIG_SH_SCI)
+       sci_console_init();
+#endif
+#endif
+#ifdef CONFIG_SERIAL_DEC_CONSOLE
+       dec_serial_console_init();
+#endif
+#ifdef CONFIG_TN3270_CONSOLE
+       tub3270_con_init();
+#endif
+#ifdef CONFIG_TN3215
+       con3215_init();
+#endif
+#ifdef CONFIG_HWC
+        hwc_console_init();
+#endif
+#ifdef CONFIG_STDIO_CONSOLE
+       stdio_console_init();
+#endif
+#ifdef CONFIG_SERIAL_21285_CONSOLE
+       rs285_console_init();
+#endif
+#ifdef CONFIG_SERIAL_SA1100_CONSOLE
+       sa1100_rs_console_init();
+#endif
+#ifdef CONFIG_ARC_CONSOLE
+       arc_console_init();
+#endif
+#ifdef CONFIG_SERIAL_AMBA_CONSOLE
+       ambauart_console_init();
+#endif
+#ifdef CONFIG_SERIAL_TX3912_CONSOLE
+       tx3912_console_init();
+#endif
+#ifdef CONFIG_TXX927_SERIAL_CONSOLE
+       txx927_console_init();
+#endif
+#ifdef CONFIG_SERIAL_TXX9_CONSOLE
+       txx9_serial_console_init();
+#endif
+#ifdef CONFIG_SIBYTE_SB1250_DUART_CONSOLE
+       sb1250_serial_console_init();
+#endif
+#ifdef CONFIG_IP22_SERIAL
+       sgi_serial_console_init();
+#endif
+}
+
+static struct tty_driver dev_tty_driver, dev_syscons_driver;
+#ifdef CONFIG_UNIX98_PTYS
+static struct tty_driver dev_ptmx_driver;
+#endif
+#ifdef CONFIG_VT
+static struct tty_driver dev_console_driver;
+#endif
+
+/*
+ * Ok, now we can initialize the rest of the tty devices and can count
+ * on memory allocations, interrupts etc..
+ */
+void __init tty_init(void)
+{
+       /*
+        * dev_tty_driver and dev_console_driver are actually magic
+        * devices which get redirected at open time.  Nevertheless,
+        * we register them so that register_chrdev is called
+        * appropriately.
+        */
+       memset(&dev_tty_driver, 0, sizeof(struct tty_driver));
+       dev_tty_driver.magic = TTY_DRIVER_MAGIC;
+       dev_tty_driver.driver_name = "/dev/tty";
+       dev_tty_driver.name = dev_tty_driver.driver_name + 5;
+       dev_tty_driver.name_base = 0;
+       dev_tty_driver.major = TTYAUX_MAJOR;
+       dev_tty_driver.minor_start = 0;
+       dev_tty_driver.num = 1;
+       dev_tty_driver.type = TTY_DRIVER_TYPE_SYSTEM;
+       dev_tty_driver.subtype = SYSTEM_TYPE_TTY;
+       
+       if (tty_register_driver(&dev_tty_driver))
+               panic("Couldn't register /dev/tty driver\n");
+
+       dev_syscons_driver = dev_tty_driver;
+       dev_syscons_driver.driver_name = "/dev/console";
+       dev_syscons_driver.name = dev_syscons_driver.driver_name + 5;
+       dev_syscons_driver.major = TTYAUX_MAJOR;
+       dev_syscons_driver.minor_start = 1;
+       dev_syscons_driver.type = TTY_DRIVER_TYPE_SYSTEM;
+       dev_syscons_driver.subtype = SYSTEM_TYPE_SYSCONS;
+
+       if (tty_register_driver(&dev_syscons_driver))
+               panic("Couldn't register /dev/console driver\n");
+
+       /* console calls tty_register_driver() before kmalloc() works.
+        * Thus, we can't devfs_register() then.  Do so now, instead. 
+        */
+#ifdef CONFIG_VT
+       con_init_devfs();
+#endif
+
+#ifdef CONFIG_UNIX98_PTYS
+       dev_ptmx_driver = dev_tty_driver;
+       dev_ptmx_driver.driver_name = "/dev/ptmx";
+       dev_ptmx_driver.name = dev_ptmx_driver.driver_name + 5;
+       dev_ptmx_driver.major= MAJOR(PTMX_DEV);
+       dev_ptmx_driver.minor_start = MINOR(PTMX_DEV);
+       dev_ptmx_driver.type = TTY_DRIVER_TYPE_SYSTEM;
+       dev_ptmx_driver.subtype = SYSTEM_TYPE_SYSPTMX;
+
+       if (tty_register_driver(&dev_ptmx_driver))
+               panic("Couldn't register /dev/ptmx driver\n");
+#endif
+       
+#ifdef CONFIG_VT
+       dev_console_driver = dev_tty_driver;
+       dev_console_driver.driver_name = "/dev/vc/0";
+       dev_console_driver.name = dev_console_driver.driver_name + 5;
+       dev_console_driver.major = TTY_MAJOR;
+       dev_console_driver.type = TTY_DRIVER_TYPE_SYSTEM;
+       dev_console_driver.subtype = SYSTEM_TYPE_CONSOLE;
+
+       if (tty_register_driver(&dev_console_driver))
+               panic("Couldn't register /dev/tty0 driver\n");
+
+       kbd_init();
+#endif
+
+#ifdef CONFIG_ESPSERIAL  /* init ESP before rs, so rs doesn't see the port */
+       espserial_init();
+#endif
+#if defined(CONFIG_MVME162_SCC) || defined(CONFIG_BVME6000_SCC) || defined(CONFIG_MVME147_SCC)
+       vme_scc_init();
+#endif
+#ifdef CONFIG_SERIAL_TX3912
+       tx3912_rs_init();
+#endif
+#ifdef CONFIG_ROCKETPORT
+       rp_init();
+#endif
+#ifdef CONFIG_SERIAL167
+       serial167_init();
+#endif
+#ifdef CONFIG_CYCLADES
+       cy_init();
+#endif
+#ifdef CONFIG_STALLION
+       stl_init();
+#endif
+#ifdef CONFIG_ISTALLION
+       stli_init();
+#endif
+#ifdef CONFIG_DIGI
+       pcxe_init();
+#endif
+#ifdef CONFIG_DIGIEPCA
+       pc_init();
+#endif
+#ifdef CONFIG_SPECIALIX
+       specialix_init();
+#endif
+#if (defined(CONFIG_8xx) || defined(CONFIG_8260))
+       rs_8xx_init();
+#endif /* CONFIG_8xx */
+       pty_init();
+#ifdef CONFIG_MOXA_SMARTIO
+       mxser_init();
+#endif 
+#ifdef CONFIG_MOXA_INTELLIO
+       moxa_init();
+#endif 
+#ifdef CONFIG_VT
+       vcs_init();
+#endif
+#ifdef CONFIG_TN3270
+       tub3270_init();
+#endif
+#ifdef CONFIG_TN3215
+       tty3215_init();
+#endif
+#ifdef CONFIG_HWC
+       hwc_tty_init();
+#endif
+#ifdef CONFIG_A2232
+       a2232board_init();
+#endif
+}
diff --git a/xenolinux-2.4.22-sparse/fs/exec.c b/xenolinux-2.4.22-sparse/fs/exec.c
new file mode 100644 (file)
index 0000000..2201b47
--- /dev/null
@@ -0,0 +1,1145 @@
+/*
+ *  linux/fs/exec.c
+ *
+ *  Copyright (C) 1991, 1992  Linus Torvalds
+ */
+
+/*
+ * #!-checking implemented by tytso.
+ */
+/*
+ * Demand-loading implemented 01.12.91 - no need to read anything but
+ * the header into memory. The inode of the executable is put into
+ * "current->executable", and page faults do the actual loading. Clean.
+ *
+ * Once more I can proudly say that linux stood up to being changed: it
+ * was less than 2 hours work to get demand-loading completely implemented.
+ *
+ * Demand loading changed July 1993 by Eric Youngdale.   Use mmap instead,
+ * current->executable is only used by the procfs.  This allows a dispatch
+ * table to check for several different types  of binary formats.  We keep
+ * trying until we recognize the file or we run out of supported binary
+ * formats. 
+ */
+
+#include <linux/config.h>
+#include <linux/slab.h>
+#include <linux/file.h>
+#include <linux/mman.h>
+#include <linux/a.out.h>
+#include <linux/stat.h>
+#include <linux/fcntl.h>
+#include <linux/smp_lock.h>
+#include <linux/init.h>
+#include <linux/pagemap.h>
+#include <linux/highmem.h>
+#include <linux/spinlock.h>
+#include <linux/personality.h>
+#include <linux/swap.h>
+#include <linux/utsname.h>
+#define __NO_VERSION__
+#include <linux/module.h>
+
+#include <asm/uaccess.h>
+#include <asm/pgalloc.h>
+#include <asm/mmu_context.h>
+
+#ifdef CONFIG_KMOD
+#include <linux/kmod.h>
+#endif
+
+int core_uses_pid;
+char core_pattern[65] = "core";
+/* The maximal length of core_pattern is also specified in sysctl.c */ 
+
+static struct linux_binfmt *formats;
+static rwlock_t binfmt_lock = RW_LOCK_UNLOCKED;
+
+int register_binfmt(struct linux_binfmt * fmt)
+{
+       struct linux_binfmt ** tmp = &formats;
+
+       if (!fmt)
+               return -EINVAL;
+       if (fmt->next)
+               return -EBUSY;
+       write_lock(&binfmt_lock);
+       while (*tmp) {
+               if (fmt == *tmp) {
+                       write_unlock(&binfmt_lock);
+                       return -EBUSY;
+               }
+               tmp = &(*tmp)->next;
+       }
+       fmt->next = formats;
+       formats = fmt;
+       write_unlock(&binfmt_lock);
+       return 0;       
+}
+
+int unregister_binfmt(struct linux_binfmt * fmt)
+{
+       struct linux_binfmt ** tmp = &formats;
+
+       write_lock(&binfmt_lock);
+       while (*tmp) {
+               if (fmt == *tmp) {
+                       *tmp = fmt->next;
+                       write_unlock(&binfmt_lock);
+                       return 0;
+               }
+               tmp = &(*tmp)->next;
+       }
+       write_unlock(&binfmt_lock);
+       return -EINVAL;
+}
+
+static inline void put_binfmt(struct linux_binfmt * fmt)
+{
+       if (fmt->module)
+               __MOD_DEC_USE_COUNT(fmt->module);
+}
+
+/*
+ * Note that a shared library must be both readable and executable due to
+ * security reasons.
+ *
+ * Also note that we take the address to load from from the file itself.
+ */
+asmlinkage long sys_uselib(const char * library)
+{
+       struct file * file;
+       struct nameidata nd;
+       int error;
+
+       error = user_path_walk(library, &nd);
+       if (error)
+               goto out;
+
+       error = -EINVAL;
+       if (!S_ISREG(nd.dentry->d_inode->i_mode))
+               goto exit;
+
+       error = permission(nd.dentry->d_inode, MAY_READ | MAY_EXEC);
+       if (error)
+               goto exit;
+
+       file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
+       error = PTR_ERR(file);
+       if (IS_ERR(file))
+               goto out;
+
+       error = -ENOEXEC;
+       if(file->f_op && file->f_op->read) {
+               struct linux_binfmt * fmt;
+
+               read_lock(&binfmt_lock);
+               for (fmt = formats ; fmt ; fmt = fmt->next) {
+                       if (!fmt->load_shlib)
+                               continue;
+                       if (!try_inc_mod_count(fmt->module))
+                               continue;
+                       read_unlock(&binfmt_lock);
+                       error = fmt->load_shlib(file);
+                       read_lock(&binfmt_lock);
+                       put_binfmt(fmt);
+                       if (error != -ENOEXEC)
+                               break;
+               }
+               read_unlock(&binfmt_lock);
+       }
+       fput(file);
+out:
+       return error;
+exit:
+       path_release(&nd);
+       goto out;
+}
+
+/*
+ * count() counts the number of arguments/envelopes
+ */
+static int count(char ** argv, int max)
+{
+       int i = 0;
+
+       if (argv != NULL) {
+               for (;;) {
+                       char * p;
+
+                       if (get_user(p, argv))
+                               return -EFAULT;
+                       if (!p)
+                               break;
+                       argv++;
+                       if(++i > max)
+                               return -E2BIG;
+               }
+       }
+       return i;
+}
+
+/*
+ * 'copy_strings()' copies argument/envelope strings from user
+ * memory to free pages in kernel mem. These are in a format ready
+ * to be put directly into the top of new user memory.
+ */
+int copy_strings(int argc,char ** argv, struct linux_binprm *bprm) 
+{
+       struct page *kmapped_page = NULL;
+       char *kaddr = NULL;
+       int ret;
+
+       while (argc-- > 0) {
+               char *str;
+               int len;
+               unsigned long pos;
+
+               if (get_user(str, argv+argc) ||
+                               !(len = strnlen_user(str, bprm->p))) {
+                       ret = -EFAULT;
+                       goto out;
+               }
+
+               if (bprm->p < len)  {
+                       ret = -E2BIG;
+                       goto out;
+               }
+
+               bprm->p -= len;
+               /* XXX: add architecture specific overflow check here. */ 
+               pos = bprm->p;
+
+               while (len > 0) {
+                       int i, new, err;
+                       int offset, bytes_to_copy;
+                       struct page *page;
+
+                       offset = pos % PAGE_SIZE;
+                       i = pos/PAGE_SIZE;
+                       page = bprm->page[i];
+                       new = 0;
+                       if (!page) {
+                               page = alloc_page(GFP_HIGHUSER);
+                               bprm->page[i] = page;
+                               if (!page) {
+                                       ret = -ENOMEM;
+                                       goto out;
+                               }
+                               new = 1;
+                       }
+
+                       if (page != kmapped_page) {
+                               if (kmapped_page)
+                                       kunmap(kmapped_page);
+                               kmapped_page = page;
+                               kaddr = kmap(kmapped_page);
+                       }
+                       if (new && offset)
+                               memset(kaddr, 0, offset);
+                       bytes_to_copy = PAGE_SIZE - offset;
+                       if (bytes_to_copy > len) {
+                               bytes_to_copy = len;
+                               if (new)
+                                       memset(kaddr+offset+len, 0,
+                                               PAGE_SIZE-offset-len);
+                       }
+                       err = copy_from_user(kaddr+offset, str, bytes_to_copy);
+                       if (err) {
+                               ret = -EFAULT;
+                               goto out;
+                       }
+
+                       pos += bytes_to_copy;
+                       str += bytes_to_copy;
+                       len -= bytes_to_copy;
+               }
+       }
+       ret = 0;
+out:
+       if (kmapped_page)
+               kunmap(kmapped_page);
+       return ret;
+}
+
+/*
+ * Like copy_strings, but get argv and its values from kernel memory.
+ */
+int copy_strings_kernel(int argc,char ** argv, struct linux_binprm *bprm)
+{
+       int r;
+       mm_segment_t oldfs = get_fs();
+       set_fs(KERNEL_DS); 
+       r = copy_strings(argc, argv, bprm);
+       set_fs(oldfs);
+       return r; 
+}
+
+/*
+ * This routine is used to map in a page into an address space: needed by
+ * execve() for the initial stack and environment pages.
+ *
+ * tsk->mmap_sem is held for writing.
+ */
+void put_dirty_page(struct task_struct * tsk, struct page *page, unsigned long address)
+{
+       pgd_t * pgd;
+       pmd_t * pmd;
+       pte_t * pte;
+       struct vm_area_struct *vma; 
+       pgprot_t prot = PAGE_COPY; 
+
+       if (page_count(page) != 1)
+               printk(KERN_ERR "mem_map disagrees with %p at %08lx\n", page, address);
+       pgd = pgd_offset(tsk->mm, address);
+
+       spin_lock(&tsk->mm->page_table_lock);
+       pmd = pmd_alloc(tsk->mm, pgd, address);
+       if (!pmd)
+               goto out;
+       pte = pte_alloc(tsk->mm, pmd, address);
+       if (!pte)
+               goto out;
+       if (!pte_none(*pte))
+               goto out;
+       lru_cache_add(page);
+       flush_dcache_page(page);
+       flush_page_to_ram(page);
+       /* lookup is cheap because there is only a single entry in the list */
+       vma = find_vma(tsk->mm, address);
+       if (vma)
+               prot = vma->vm_page_prot;
+       set_pte(pte, pte_mkdirty(pte_mkwrite(mk_pte(page, prot))));
+       XENO_flush_page_update_queue();
+       tsk->mm->rss++;
+       spin_unlock(&tsk->mm->page_table_lock);
+
+       /* no need for flush_tlb */
+       return;
+out:
+       spin_unlock(&tsk->mm->page_table_lock);
+       __free_page(page);
+       force_sig(SIGKILL, tsk);
+       return;
+}
+
+int setup_arg_pages(struct linux_binprm *bprm)
+{
+       unsigned long stack_base;
+       struct vm_area_struct *mpnt;
+       int i;
+
+       stack_base = STACK_TOP - MAX_ARG_PAGES*PAGE_SIZE;
+
+       bprm->p += stack_base;
+       if (bprm->loader)
+               bprm->loader += stack_base;
+       bprm->exec += stack_base;
+
+       mpnt = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
+       if (!mpnt) 
+               return -ENOMEM; 
+       
+       down_write(&current->mm->mmap_sem);
+       {
+               mpnt->vm_mm = current->mm;
+               mpnt->vm_start = PAGE_MASK & (unsigned long) bprm->p;
+               mpnt->vm_end = STACK_TOP;
+               mpnt->vm_flags = VM_STACK_FLAGS;
+               mpnt->vm_page_prot = protection_map[VM_STACK_FLAGS & 0x7];
+               mpnt->vm_ops = NULL;
+               mpnt->vm_pgoff = 0;
+               mpnt->vm_file = NULL;
+               mpnt->vm_private_data = (void *) 0;
+               insert_vm_struct(current->mm, mpnt);
+               current->mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT;
+       } 
+
+       for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
+               struct page *page = bprm->page[i];
+               if (page) {
+                       bprm->page[i] = NULL;
+                       put_dirty_page(current,page,stack_base);
+               }
+               stack_base += PAGE_SIZE;
+       }
+       up_write(&current->mm->mmap_sem);
+       
+       return 0;
+}
+
+struct file *open_exec(const char *name)
+{
+       struct nameidata nd;
+       struct inode *inode;
+       struct file *file;
+       int err = 0;
+
+       err = path_lookup(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd);
+       file = ERR_PTR(err);
+       if (!err) {
+               inode = nd.dentry->d_inode;
+               file = ERR_PTR(-EACCES);
+               if (!(nd.mnt->mnt_flags & MNT_NOEXEC) &&
+                   S_ISREG(inode->i_mode)) {
+                       int err = permission(inode, MAY_EXEC);
+                       if (!err && !(inode->i_mode & 0111))
+                               err = -EACCES;
+                       file = ERR_PTR(err);
+                       if (!err) {
+                               file = dentry_open(nd.dentry, nd.mnt, O_RDONLY);
+                               if (!IS_ERR(file)) {
+                                       err = deny_write_access(file);
+                                       if (err) {
+                                               fput(file);
+                                               file = ERR_PTR(err);
+                                       }
+                               }
+out:
+                               return file;
+                       }
+               }
+               path_release(&nd);
+       }
+       goto out;
+}
+
+int kernel_read(struct file *file, unsigned long offset,
+       char * addr, unsigned long count)
+{
+       mm_segment_t old_fs;
+       loff_t pos = offset;
+       int result = -ENOSYS;
+
+       if (!file->f_op->read)
+               goto fail;
+       old_fs = get_fs();
+       set_fs(get_ds());
+       result = file->f_op->read(file, addr, count, &pos);
+       set_fs(old_fs);
+fail:
+       return result;
+}
+
+static int exec_mmap(void)
+{
+       struct mm_struct * mm, * old_mm;
+
+       old_mm = current->mm;
+       if (old_mm && atomic_read(&old_mm->mm_users) == 1) {
+               mm_release();
+               exit_mmap(old_mm);
+               return 0;
+       }
+
+       mm = mm_alloc();
+       if (mm) {
+               struct mm_struct *active_mm;
+
+               if (init_new_context(current, mm)) {
+                       mmdrop(mm);
+                       return -ENOMEM;
+               }
+
+               /* Add it to the list of mm's */
+               spin_lock(&mmlist_lock);
+               list_add(&mm->mmlist, &init_mm.mmlist);
+               mmlist_nr++;
+               spin_unlock(&mmlist_lock);
+
+               task_lock(current);
+               active_mm = current->active_mm;
+               current->mm = mm;
+               current->active_mm = mm;
+               task_unlock(current);
+               activate_mm(active_mm, mm);
+               mm_release();
+               if (old_mm) {
+                       if (active_mm != old_mm) BUG();
+                       mmput(old_mm);
+                       return 0;
+               }
+               mmdrop(active_mm);
+               return 0;
+       }
+       return -ENOMEM;
+}
+
+/*
+ * This function makes sure the current process has its own signal table,
+ * so that flush_signal_handlers can later reset the handlers without
+ * disturbing other processes.  (Other processes might share the signal
+ * table via the CLONE_SIGNAL option to clone().)
+ */
+static inline int make_private_signals(void)
+{
+       struct signal_struct * newsig;
+
+       if (atomic_read(&current->sig->count) <= 1)
+               return 0;
+       newsig = kmem_cache_alloc(sigact_cachep, GFP_KERNEL);
+       if (newsig == NULL)
+               return -ENOMEM;
+       spin_lock_init(&newsig->siglock);
+       atomic_set(&newsig->count, 1);
+       memcpy(newsig->action, current->sig->action, sizeof(newsig->action));
+       spin_lock_irq(&current->sigmask_lock);
+       current->sig = newsig;
+       spin_unlock_irq(&current->sigmask_lock);
+       return 0;
+}
+       
+/*
+ * If make_private_signals() made a copy of the signal table, decrement the
+ * refcount of the original table, and free it if necessary.
+ * We don't do that in make_private_signals() so that we can back off
+ * in flush_old_exec() if an error occurs after calling make_private_signals().
+ */
+
+static inline void release_old_signals(struct signal_struct * oldsig)
+{
+       if (current->sig == oldsig)
+               return;
+       if (atomic_dec_and_test(&oldsig->count))
+               kmem_cache_free(sigact_cachep, oldsig);
+}
+
+/*
+ * These functions flushes out all traces of the currently running executable
+ * so that a new one can be started
+ */
+
+static inline void flush_old_files(struct files_struct * files)
+{
+       long j = -1;
+
+       write_lock(&files->file_lock);
+       for (;;) {
+               unsigned long set, i;
+
+               j++;
+               i = j * __NFDBITS;
+               if (i >= files->max_fds || i >= files->max_fdset)
+                       break;
+               set = files->close_on_exec->fds_bits[j];
+               if (!set)
+                       continue;
+               files->close_on_exec->fds_bits[j] = 0;
+               write_unlock(&files->file_lock);
+               for ( ; set ; i++,set >>= 1) {
+                       if (set & 1) {
+                               sys_close(i);
+                       }
+               }
+               write_lock(&files->file_lock);
+
+       }
+       write_unlock(&files->file_lock);
+}
+
+/*
+ * An execve() will automatically "de-thread" the process.
+ * Note: we don't have to hold the tasklist_lock to test
+ * whether we migth need to do this. If we're not part of
+ * a thread group, there is no way we can become one
+ * dynamically. And if we are, we only need to protect the
+ * unlink - even if we race with the last other thread exit,
+ * at worst the list_del_init() might end up being a no-op.
+ */
+static inline void de_thread(struct task_struct *tsk)
+{
+       if (!list_empty(&tsk->thread_group)) {
+               write_lock_irq(&tasklist_lock);
+               list_del_init(&tsk->thread_group);
+               write_unlock_irq(&tasklist_lock);
+       }
+
+       /* Minor oddity: this might stay the same. */
+       tsk->tgid = tsk->pid;
+}
+
+int flush_old_exec(struct linux_binprm * bprm)
+{
+       char * name;
+       int i, ch, retval;
+       struct signal_struct * oldsig;
+       struct files_struct * files;
+
+       /*
+        * Make sure we have a private signal table
+        */
+       oldsig = current->sig;
+       retval = make_private_signals();
+       if (retval) goto flush_failed;
+
+       /*
+        * Make sure we have private file handles. Ask the
+        * fork helper to do the work for us and the exit
+        * helper to do the cleanup of the old one.
+        */
+        
+       files = current->files;         /* refcounted so safe to hold */
+       retval = unshare_files();
+       if(retval)
+               goto flush_failed;
+       
+       /* 
+        * Release all of the old mmap stuff
+        */
+       retval = exec_mmap();
+       if (retval) goto mmap_failed;
+
+       /* This is the point of no return */
+       steal_locks(files);
+       put_files_struct(files);
+       release_old_signals(oldsig);
+
+       current->sas_ss_sp = current->sas_ss_size = 0;
+
+       if (current->euid == current->uid && current->egid == current->gid) {
+               current->mm->dumpable = 1;
+               current->task_dumpable = 1;
+       }
+       name = bprm->filename;
+       for (i=0; (ch = *(name++)) != '\0';) {
+               if (ch == '/')
+                       i = 0;
+               else
+                       if (i < 15)
+                               current->comm[i++] = ch;
+       }
+       current->comm[i] = '\0';
+
+       flush_thread();
+
+       de_thread(current);
+
+       if (bprm->e_uid != current->euid || bprm->e_gid != current->egid || 
+           permission(bprm->file->f_dentry->d_inode,MAY_READ))
+               current->mm->dumpable = 0;
+
+       /* An exec changes our domain. We are no longer part of the thread
+          group */
+          
+       current->self_exec_id++;
+                       
+       flush_signal_handlers(current);
+       flush_old_files(current->files);
+
+       return 0;
+
+mmap_failed:
+       put_files_struct(current->files);
+       current->files = files;
+flush_failed:
+       spin_lock_irq(&current->sigmask_lock);
+       if (current->sig != oldsig) {
+               kmem_cache_free(sigact_cachep, current->sig);
+               current->sig = oldsig;
+       }
+       spin_unlock_irq(&current->sigmask_lock);
+       return retval;
+}
+
+/*
+ * We mustn't allow tracing of suid binaries, unless
+ * the tracer has the capability to trace anything..
+ */
+static inline int must_not_trace_exec(struct task_struct * p)
+{
+       return (p->ptrace & PT_PTRACED) && !(p->ptrace & PT_PTRACE_CAP);
+}
+
+/* 
+ * Fill the binprm structure from the inode. 
+ * Check permissions, then read the first 128 (BINPRM_BUF_SIZE) bytes
+ */
+int prepare_binprm(struct linux_binprm *bprm)
+{
+       int mode;
+       struct inode * inode = bprm->file->f_dentry->d_inode;
+
+       mode = inode->i_mode;
+       /*
+        * Check execute perms again - if the caller has CAP_DAC_OVERRIDE,
+        * vfs_permission lets a non-executable through
+        */
+       if (!(mode & 0111))     /* with at least _one_ execute bit set */
+               return -EACCES;
+       if (bprm->file->f_op == NULL)
+               return -EACCES;
+
+       bprm->e_uid = current->euid;
+       bprm->e_gid = current->egid;
+
+       if(!(bprm->file->f_vfsmnt->mnt_flags & MNT_NOSUID)) {
+               /* Set-uid? */
+               if (mode & S_ISUID)
+                       bprm->e_uid = inode->i_uid;
+
+               /* Set-gid? */
+               /*
+                * If setgid is set but no group execute bit then this
+                * is a candidate for mandatory locking, not a setgid
+                * executable.
+                */
+               if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP))
+                       bprm->e_gid = inode->i_gid;
+       }
+
+       /* We don't have VFS support for capabilities yet */
+       cap_clear(bprm->cap_inheritable);
+       cap_clear(bprm->cap_permitted);
+       cap_clear(bprm->cap_effective);
+
+       /*  To support inheritance of root-permissions and suid-root
+         *  executables under compatibility mode, we raise all three
+         *  capability sets for the file.
+         *
+         *  If only the real uid is 0, we only raise the inheritable
+         *  and permitted sets of the executable file.
+         */
+
+       if (!issecure(SECURE_NOROOT)) {
+               if (bprm->e_uid == 0 || current->uid == 0) {
+                       cap_set_full(bprm->cap_inheritable);
+                       cap_set_full(bprm->cap_permitted);
+               }
+               if (bprm->e_uid == 0) 
+                       cap_set_full(bprm->cap_effective);
+       }
+
+       memset(bprm->buf,0,BINPRM_BUF_SIZE);
+       return kernel_read(bprm->file,0,bprm->buf,BINPRM_BUF_SIZE);
+}
+
+/*
+ * This function is used to produce the new IDs and capabilities
+ * from the old ones and the file's capabilities.
+ *
+ * The formula used for evolving capabilities is:
+ *
+ *       pI' = pI
+ * (***) pP' = (fP & X) | (fI & pI)
+ *       pE' = pP' & fE          [NB. fE is 0 or ~0]
+ *
+ * I=Inheritable, P=Permitted, E=Effective // p=process, f=file
+ * ' indicates post-exec(), and X is the global 'cap_bset'.
+ *
+ */
+
+void compute_creds(struct linux_binprm *bprm) 
+{
+       kernel_cap_t new_permitted, working;
+       int do_unlock = 0;
+
+       new_permitted = cap_intersect(bprm->cap_permitted, cap_bset);
+       working = cap_intersect(bprm->cap_inheritable,
+                               current->cap_inheritable);
+       new_permitted = cap_combine(new_permitted, working);
+
+       if (bprm->e_uid != current->uid || bprm->e_gid != current->gid ||
+           !cap_issubset(new_permitted, current->cap_permitted)) {
+                current->mm->dumpable = 0;
+               
+               lock_kernel();
+               if (must_not_trace_exec(current)
+                   || atomic_read(&current->fs->count) > 1
+                   || atomic_read(&current->files->count) > 1
+                   || atomic_read(&current->sig->count) > 1) {
+                       if(!capable(CAP_SETUID)) {
+                               bprm->e_uid = current->uid;
+                               bprm->e_gid = current->gid;
+                       }
+                       if(!capable(CAP_SETPCAP)) {
+                               new_permitted = cap_intersect(new_permitted,
+                                                       current->cap_permitted);
+                       }
+               }
+               do_unlock = 1;
+       }
+
+
+       /* For init, we want to retain the capabilities set
+         * in the init_task struct. Thus we skip the usual
+         * capability rules */
+       if (current->pid != 1) {
+               current->cap_permitted = new_permitted;
+               current->cap_effective =
+                       cap_intersect(new_permitted, bprm->cap_effective);
+       }
+       
+        /* AUD: Audit candidate if current->cap_effective is set */
+
+        current->suid = current->euid = current->fsuid = bprm->e_uid;
+        current->sgid = current->egid = current->fsgid = bprm->e_gid;
+
+       if(do_unlock)
+               unlock_kernel();
+       current->keep_capabilities = 0;
+}
+
+
+void remove_arg_zero(struct linux_binprm *bprm)
+{
+       if (bprm->argc) {
+               unsigned long offset;
+               char * kaddr;
+               struct page *page;
+
+               offset = bprm->p % PAGE_SIZE;
+               goto inside;
+
+               while (bprm->p++, *(kaddr+offset++)) {
+                       if (offset != PAGE_SIZE)
+                               continue;
+                       offset = 0;
+                       kunmap(page);
+inside:
+                       page = bprm->page[bprm->p/PAGE_SIZE];
+                       kaddr = kmap(page);
+               }
+               kunmap(page);
+               bprm->argc--;
+       }
+}
+
+/*
+ * cycle the list of binary formats handler, until one recognizes the image
+ */
+int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)
+{
+       int try,retval=0;
+       struct linux_binfmt *fmt;
+#ifdef __alpha__
+       /* handle /sbin/loader.. */
+       {
+           struct exec * eh = (struct exec *) bprm->buf;
+
+           if (!bprm->loader && eh->fh.f_magic == 0x183 &&
+               (eh->fh.f_flags & 0x3000) == 0x3000)
+           {
+               struct file * file;
+               unsigned long loader;
+
+               allow_write_access(bprm->file);
+               fput(bprm->file);
+               bprm->file = NULL;
+
+               loader = PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *);
+
+               file = open_exec("/sbin/loader");
+               retval = PTR_ERR(file);
+               if (IS_ERR(file))
+                       return retval;
+
+               /* Remember if the application is TASO.  */
+               bprm->sh_bang = eh->ah.entry < 0x100000000;
+
+               bprm->file = file;
+               bprm->loader = loader;
+               retval = prepare_binprm(bprm);
+               if (retval<0)
+                       return retval;
+               /* should call search_binary_handler recursively here,
+                  but it does not matter */
+           }
+       }
+#endif
+       /* kernel module loader fixup */
+       /* so we don't try to load run modprobe in kernel space. */
+       set_fs(USER_DS);
+       for (try=0; try<2; try++) {
+               read_lock(&binfmt_lock);
+               for (fmt = formats ; fmt ; fmt = fmt->next) {
+                       int (*fn)(struct linux_binprm *, struct pt_regs *) = fmt->load_binary;
+                       if (!fn)
+                               continue;
+                       if (!try_inc_mod_count(fmt->module))
+                               continue;
+                       read_unlock(&binfmt_lock);
+                       retval = fn(bprm, regs);
+                       if (retval >= 0) {
+                               put_binfmt(fmt);
+                               allow_write_access(bprm->file);
+                               if (bprm->file)
+                                       fput(bprm->file);
+                               bprm->file = NULL;
+                               current->did_exec = 1;
+                               return retval;
+                       }
+                       read_lock(&binfmt_lock);
+                       put_binfmt(fmt);
+                       if (retval != -ENOEXEC)
+                               break;
+                       if (!bprm->file) {
+                               read_unlock(&binfmt_lock);
+                               return retval;
+                       }
+               }
+               read_unlock(&binfmt_lock);
+               if (retval != -ENOEXEC) {
+                       break;
+#ifdef CONFIG_KMOD
+               }else{
+#define printable(c) (((c)=='\t') || ((c)=='\n') || (0x20<=(c) && (c)<=0x7e))
+                       char modname[20];
+                       if (printable(bprm->buf[0]) &&
+                           printable(bprm->buf[1]) &&
+                           printable(bprm->buf[2]) &&
+                           printable(bprm->buf[3]))
+                               break; /* -ENOEXEC */
+                       sprintf(modname, "binfmt-%04x", *(unsigned short *)(&bprm->buf[2]));
+                       request_module(modname);
+#endif
+               }
+       }
+       return retval;
+}
+
+
+/*
+ * sys_execve() executes a new program.
+ */
+int do_execve(char * filename, char ** argv, char ** envp, struct pt_regs * regs)
+{
+       struct linux_binprm bprm;
+       struct file *file;
+       int retval;
+       int i;
+
+       file = open_exec(filename);
+
+       retval = PTR_ERR(file);
+       if (IS_ERR(file))
+               return retval;
+
+       bprm.p = PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *);
+       memset(bprm.page, 0, MAX_ARG_PAGES*sizeof(bprm.page[0])); 
+
+       bprm.file = file;
+       bprm.filename = filename;
+       bprm.sh_bang = 0;
+       bprm.loader = 0;
+       bprm.exec = 0;
+       if ((bprm.argc = count(argv, bprm.p / sizeof(void *))) < 0) {
+               allow_write_access(file);
+               fput(file);
+               return bprm.argc;
+       }
+
+       if ((bprm.envc = count(envp, bprm.p / sizeof(void *))) < 0) {
+               allow_write_access(file);
+               fput(file);
+               return bprm.envc;
+       }
+
+       retval = prepare_binprm(&bprm);
+       if (retval < 0) 
+               goto out; 
+
+       retval = copy_strings_kernel(1, &bprm.filename, &bprm);
+       if (retval < 0) 
+               goto out; 
+
+       bprm.exec = bprm.p;
+       retval = copy_strings(bprm.envc, envp, &bprm);
+       if (retval < 0) 
+               goto out; 
+
+       retval = copy_strings(bprm.argc, argv, &bprm);
+       if (retval < 0) 
+               goto out; 
+
+       retval = search_binary_handler(&bprm,regs);
+       if (retval >= 0)
+               /* execve success */
+               return retval;
+
+out:
+       /* Something went wrong, return the inode and free the argument pages*/
+       allow_write_access(bprm.file);
+       if (bprm.file)
+               fput(bprm.file);
+
+       for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
+               struct page * page = bprm.page[i];
+               if (page)
+                       __free_page(page);
+       }
+
+       return retval;
+}
+
+void set_binfmt(struct linux_binfmt *new)
+{
+       struct linux_binfmt *old = current->binfmt;
+       if (new && new->module)
+               __MOD_INC_USE_COUNT(new->module);
+       current->binfmt = new;
+       if (old && old->module)
+               __MOD_DEC_USE_COUNT(old->module);
+}
+
+#define CORENAME_MAX_SIZE 64
+
+/* format_corename will inspect the pattern parameter, and output a
+ * name into corename, which must have space for at least
+ * CORENAME_MAX_SIZE bytes plus one byte for the zero terminator.
+ */
+void format_corename(char *corename, const char *pattern, long signr)
+{
+       const char *pat_ptr = pattern;
+       char *out_ptr = corename;
+       char *const out_end = corename + CORENAME_MAX_SIZE;
+       int rc;
+       int pid_in_pattern = 0;
+
+       /* Repeat as long as we have more pattern to process and more output
+          space */
+       while (*pat_ptr) {
+               if (*pat_ptr != '%') {
+                       if (out_ptr == out_end)
+                               goto out;
+                       *out_ptr++ = *pat_ptr++;
+               } else {
+                       switch (*++pat_ptr) {
+                       case 0:
+                               goto out;
+                       /* Double percent, output one percent */
+                       case '%':
+                               if (out_ptr == out_end)
+                                       goto out;
+                               *out_ptr++ = '%';
+                               break;
+                       /* pid */
+                       case 'p':
+                               pid_in_pattern = 1;
+                               rc = snprintf(out_ptr, out_end - out_ptr,
+                                             "%d", current->pid);
+                               if (rc > out_end - out_ptr)
+                                       goto out;
+                               out_ptr += rc;
+                               break;
+                       /* uid */
+                       case 'u':
+                               rc = snprintf(out_ptr, out_end - out_ptr,
+                                             "%d", current->uid);
+                               if (rc > out_end - out_ptr)
+                                       goto out;
+                               out_ptr += rc;
+                               break;
+                       /* gid */
+                       case 'g':
+                               rc = snprintf(out_ptr, out_end - out_ptr,
+                                             "%d", current->gid);
+                               if (rc > out_end - out_ptr)
+                                       goto out;
+                               out_ptr += rc;
+                               break;
+                       /* signal that caused the coredump */
+                       case 's':
+                               rc = snprintf(out_ptr, out_end - out_ptr,
+                                             "%ld", signr);
+                               if (rc > out_end - out_ptr)
+                                       goto out;
+                               out_ptr += rc;
+                               break;
+                       /* UNIX time of coredump */
+                       case 't': {
+                               struct timeval tv;
+                               do_gettimeofday(&tv);
+                               rc = snprintf(out_ptr, out_end - out_ptr,
+                                             "%ld", tv.tv_sec);
+                               if (rc > out_end - out_ptr)
+                                       goto out;
+                               out_ptr += rc;
+                               break;
+                       }
+                       /* hostname */
+                       case 'h':
+                               down_read(&uts_sem);
+                               rc = snprintf(out_ptr, out_end - out_ptr,
+                                             "%s", system_utsname.nodename);
+                               up_read(&uts_sem);
+                               if (rc > out_end - out_ptr)
+                                       goto out;
+                               out_ptr += rc;
+                               break;
+                       /* executable */
+                       case 'e':
+                               rc = snprintf(out_ptr, out_end - out_ptr,
+                                             "%s", current->comm);
+                               if (rc > out_end - out_ptr)
+                                       goto out;
+                               out_ptr += rc;
+                               break;
+                       default:
+                               break;
+                       }
+                       ++pat_ptr;
+               }
+       }
+       /* Backward compatibility with core_uses_pid:
+        *
+        * If core_pattern does not include a %p (as is the default)
+        * and core_uses_pid is set, then .%pid will be appended to
+        * the filename */
+       if (!pid_in_pattern
+            && (core_uses_pid || atomic_read(&current->mm->mm_users) != 1)) {
+               rc = snprintf(out_ptr, out_end - out_ptr,
+                             ".%d", current->pid);
+               if (rc > out_end - out_ptr)
+                       goto out;
+               out_ptr += rc;
+       }
+      out:
+       *out_ptr = 0;
+}
+
+int do_coredump(long signr, struct pt_regs * regs)
+{
+       struct linux_binfmt * binfmt;
+       char corename[CORENAME_MAX_SIZE + 1];
+       struct file * file;
+       struct inode * inode;
+       int retval = 0;
+
+       lock_kernel();
+       binfmt = current->binfmt;
+       if (!binfmt || !binfmt->core_dump)
+               goto fail;
+       if (!is_dumpable(current))
+               goto fail;
+       current->mm->dumpable = 0;
+       if (current->rlim[RLIMIT_CORE].rlim_cur < binfmt->min_coredump)
+               goto fail;
+
+       format_corename(corename, core_pattern, signr);
+       file = filp_open(corename, O_CREAT | 2 | O_NOFOLLOW, 0600);
+       if (IS_ERR(file))
+               goto fail;
+       inode = file->f_dentry->d_inode;
+       if (inode->i_nlink > 1)
+               goto close_fail;        /* multiple links - don't dump */
+       if (d_unhashed(file->f_dentry))
+               goto close_fail;
+
+       if (!S_ISREG(inode->i_mode))
+               goto close_fail;
+       if (!file->f_op)
+               goto close_fail;
+       if (!file->f_op->write)
+               goto close_fail;
+       if (do_truncate(file->f_dentry, 0) != 0)
+               goto close_fail;
+
+       retval = binfmt->core_dump(signr, regs, file);
+
+close_fail:
+       filp_close(file, NULL);
+fail:
+       unlock_kernel();
+       return retval;
+}
diff --git a/xenolinux-2.4.22-sparse/fs/partitions/Config.in b/xenolinux-2.4.22-sparse/fs/partitions/Config.in
new file mode 100644 (file)
index 0000000..b9650de
--- /dev/null
@@ -0,0 +1,72 @@
+#
+# Partition configuration
+#
+bool 'Advanced partition selection' CONFIG_PARTITION_ADVANCED
+if [ "$CONFIG_PARTITION_ADVANCED" = "y" ]; then
+   bool '  Acorn partition support' CONFIG_ACORN_PARTITION
+   if [ "$CONFIG_ACORN_PARTITION" != "n" ]; then
+#      bool '    Cumana partition support' CONFIG_ACORN_PARTITION_CUMANA
+      bool '    ICS partition support' CONFIG_ACORN_PARTITION_ICS
+      bool '    Native filecore partition support' CONFIG_ACORN_PARTITION_ADFS
+      bool '    PowerTec partition support' CONFIG_ACORN_PARTITION_POWERTEC
+      bool '    RISCiX partition support' CONFIG_ACORN_PARTITION_RISCIX
+   fi
+   bool '  Alpha OSF partition support' CONFIG_OSF_PARTITION
+   bool '  Amiga partition table support' CONFIG_AMIGA_PARTITION
+   bool '  Atari partition table support' CONFIG_ATARI_PARTITION
+   if [ "$CONFIG_ARCH_S390" = "y" ]; then
+      bool '  IBM disk label and partition support' CONFIG_IBM_PARTITION
+   fi
+   bool '  Macintosh partition map support' CONFIG_MAC_PARTITION
+   bool '  Xeno partition support' CONFIG_XENO_PARTITION
+   bool '  PC BIOS (MSDOS partition tables) support' CONFIG_MSDOS_PARTITION
+   if [ "$CONFIG_MSDOS_PARTITION" = "y" ]; then
+      bool '    BSD disklabel (FreeBSD partition tables) support' CONFIG_BSD_DISKLABEL
+      bool '    Minix subpartition support' CONFIG_MINIX_SUBPARTITION
+      bool '    Solaris (x86) partition table support' CONFIG_SOLARIS_X86_PARTITION
+      bool '    Unixware slices support' CONFIG_UNIXWARE_DISKLABEL
+   fi
+   dep_bool '  Windows Logical Disk Manager (Dynamic Disk) support (EXPERIMENTAL)' CONFIG_LDM_PARTITION $CONFIG_EXPERIMENTAL
+   if [ "$CONFIG_LDM_PARTITION" = "y" ]; then
+      bool '    Windows LDM extra logging' CONFIG_LDM_DEBUG
+   fi
+   bool '  SGI partition support' CONFIG_SGI_PARTITION
+   bool '  Ultrix partition table support' CONFIG_ULTRIX_PARTITION
+   bool '  Sun partition tables support' CONFIG_SUN_PARTITION
+   bool '  EFI GUID Partition support' CONFIG_EFI_PARTITION
+else
+   if [ "$CONFIG_ALPHA" = "y" ]; then
+      define_bool CONFIG_OSF_PARTITION y
+   fi
+   if [ "$CONFIG_AMIGA" != "y" -a "$CONFIG_ATARI" != "y" -a \
+        "$CONFIG_MAC" != "y" -a "$CONFIG_SGI_IP22" != "y" -a \
+       "$CONFIG_SGI_IP27" != "y" ]; then
+      define_bool CONFIG_MSDOS_PARTITION y
+   fi
+   if [ "$CONFIG_AMIGA" = "y" -o "$CONFIG_AFFS_FS" = "y" ]; then
+      define_bool CONFIG_AMIGA_PARTITION y
+   fi
+   if [ "$CONFIG_MAC" = "y" ]; then
+      define_bool CONFIG_MAC_PARTITION y
+   fi
+   if [ "$CONFIG_ARCH_ACORN" = "y" ]; then
+      define_bool CONFIG_ACORN_PARTITION y
+      define_bool CONFIG_ACORN_PARTITION_ADFS y
+#      define_bool CONFIG_ACORN_PARTITION_CUMANA y
+      define_bool CONFIG_ACORN_PARTITION_ICS y
+      define_bool CONFIG_ACORN_PARTITION_POWERTEC y
+      define_bool CONFIG_ACORN_PARTITION_RISCIX y
+   fi
+   if [ "$CONFIG_ATARI" = "y" ]; then
+      define_bool CONFIG_ATARI_PARTITION y
+   fi
+   if [ "$CONFIG_SGI_IP22" = "y" -o "$CONFIG_SGI_IP27" = "y" ]; then
+      define_bool CONFIG_SGI_PARTITION y
+   fi
+   if [ "$CONFIG_DECSTATION" = "y" ]; then
+      define_bool CONFIG_ULTRIX_PARTITION y
+   fi
+   if [ "$CONFIG_SPARC32" = "y" -o "$CONFIG_SPARC64" = "y" ]; then
+      define_bool CONFIG_SUN_PARTITION y
+   fi
+fi
diff --git a/xenolinux-2.4.22-sparse/fs/partitions/Makefile b/xenolinux-2.4.22-sparse/fs/partitions/Makefile
new file mode 100644 (file)
index 0000000..097e5ca
--- /dev/null
@@ -0,0 +1,30 @@
+#
+# Makefile for the linux kernel.
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definitions are now in the main makefile...
+
+O_TARGET := partitions.o
+
+export-objs := check.o msdos.o
+
+obj-y := check.o
+
+obj-$(CONFIG_ACORN_PARTITION) += acorn.o
+obj-$(CONFIG_XENO_PARTITION) += xeno.o
+obj-$(CONFIG_AMIGA_PARTITION) += amiga.o
+obj-$(CONFIG_ATARI_PARTITION) += atari.o
+obj-$(CONFIG_MAC_PARTITION) += mac.o
+obj-$(CONFIG_LDM_PARTITION) += ldm.o
+obj-$(CONFIG_MSDOS_PARTITION) += msdos.o
+obj-$(CONFIG_OSF_PARTITION) += osf.o
+obj-$(CONFIG_SGI_PARTITION) += sgi.o
+obj-$(CONFIG_SUN_PARTITION) += sun.o
+obj-$(CONFIG_ULTRIX_PARTITION) += ultrix.o
+obj-$(CONFIG_IBM_PARTITION) += ibm.o
+obj-$(CONFIG_EFI_PARTITION) += efi.o
+
+include $(TOPDIR)/Rules.make
diff --git a/xenolinux-2.4.22-sparse/fs/partitions/check.c b/xenolinux-2.4.22-sparse/fs/partitions/check.c
new file mode 100644 (file)
index 0000000..e279aa8
--- /dev/null
@@ -0,0 +1,443 @@
+/*
+ *  Code extracted from drivers/block/genhd.c
+ *  Copyright (C) 1991-1998  Linus Torvalds
+ *  Re-organised Feb 1998 Russell King
+ *
+ *  We now have independent partition support from the
+ *  block drivers, which allows all the partition code to
+ *  be grouped in one location, and it to be mostly self
+ *  contained.
+ *
+ *  Added needed MAJORS for new pairs, {hdi,hdj}, {hdk,hdl}
+ */
+
+#include <linux/config.h>
+#include <linux/fs.h>
+#include <linux/genhd.h>
+#include <linux/kernel.h>
+#include <linux/major.h>
+#include <linux/blk.h>
+#include <linux/init.h>
+#include <linux/raid/md.h>
+
+#include "check.h"
+
+#include "acorn.h"
+#include "amiga.h"
+#include "atari.h"
+#include "ldm.h"
+#include "mac.h"
+#include "msdos.h"
+#include "osf.h"
+#include "sgi.h"
+#include "sun.h"
+#include "ibm.h"
+#include "ultrix.h"
+#include "efi.h"
+#include "xeno.h"
+
+extern int *blk_size[];
+
+int warn_no_part = 1; /*This is ugly: should make genhd removable media aware*/
+
+static int (*check_part[])(struct gendisk *hd, struct block_device *bdev, unsigned long first_sect, int first_minor) = {
+#ifdef CONFIG_XENO_PARTITION
+        xeno_partition,         /* this must come first */
+#endif
+#ifdef CONFIG_ACORN_PARTITION
+       acorn_partition,
+#endif
+#ifdef CONFIG_EFI_PARTITION
+       efi_partition,          /* this must come before msdos */
+#endif
+#ifdef CONFIG_LDM_PARTITION
+       ldm_partition,          /* this must come before msdos */
+#endif
+#ifdef CONFIG_MSDOS_PARTITION
+       msdos_partition,
+#endif
+#ifdef CONFIG_OSF_PARTITION
+       osf_partition,
+#endif
+#ifdef CONFIG_SUN_PARTITION
+       sun_partition,
+#endif
+#ifdef CONFIG_AMIGA_PARTITION
+       amiga_partition,
+#endif
+#ifdef CONFIG_ATARI_PARTITION
+       atari_partition,
+#endif
+#ifdef CONFIG_MAC_PARTITION
+       mac_partition,
+#endif
+#ifdef CONFIG_SGI_PARTITION
+       sgi_partition,
+#endif
+#ifdef CONFIG_ULTRIX_PARTITION
+       ultrix_partition,
+#endif
+#ifdef CONFIG_IBM_PARTITION
+       ibm_partition,
+#endif
+       NULL
+};
+
+/*
+ *     This is ucking fugly but its probably the best thing for 2.4.x
+ *     Take it as a clear reminder that: 1) we should put the device name
+ *     generation in the object kdev_t points to in 2.5.
+ *     and 2) ioctls better work on half-opened devices.
+ */
+#ifdef CONFIG_ARCH_S390
+int (*genhd_dasd_name)(char*,int,int,struct gendisk*) = NULL;
+int (*genhd_dasd_ioctl)(struct inode *inp, struct file *filp,
+                           unsigned int no, unsigned long data);
+EXPORT_SYMBOL(genhd_dasd_name);
+EXPORT_SYMBOL(genhd_dasd_ioctl);
+#endif
+
+/*
+ * disk_name() is used by partition check code and the md driver.
+ * It formats the devicename of the indicated disk into
+ * the supplied buffer (of size at least 32), and returns
+ * a pointer to that same buffer (for convenience).
+ */
+
+char *disk_name (struct gendisk *hd, int minor, char *buf)
+{
+       const char *maj = hd->major_name;
+       unsigned int unit = (minor >> hd->minor_shift);
+       unsigned int part = (minor & ((1 << hd->minor_shift) -1 ));
+
+       if ((unit < hd->nr_real) && hd->part[minor].de) {
+               int pos;
+
+               pos = devfs_generate_path (hd->part[minor].de, buf, 64);
+               if (pos >= 0)
+                       return buf + pos;
+       }
+
+#ifdef CONFIG_ARCH_S390
+       if (genhd_dasd_name
+           && genhd_dasd_name (buf, unit, part, hd) == 0)
+               return buf;
+#endif
+       /*
+        * IDE devices use multiple major numbers, but the drives
+        * are named as:  {hda,hdb}, {hdc,hdd}, {hde,hdf}, {hdg,hdh}..
+        * This requires special handling here.
+        */
+       switch (hd->major) {
+               case IDE9_MAJOR:
+                       unit += 2;
+               case IDE8_MAJOR:
+                       unit += 2;
+               case IDE7_MAJOR:
+                       unit += 2;
+               case IDE6_MAJOR:
+                       unit += 2;
+               case IDE5_MAJOR:
+                       unit += 2;
+               case IDE4_MAJOR:
+                       unit += 2;
+               case IDE3_MAJOR:
+                       unit += 2;
+               case IDE2_MAJOR:
+                       unit += 2;
+               case IDE1_MAJOR:
+                       unit += 2;
+               case IDE0_MAJOR:
+                       maj = "hd";
+                       break;
+               case MD_MAJOR:
+                       sprintf(buf, "%s%d", maj, unit);
+                       return buf;
+       }
+       if (hd->major >= SCSI_DISK1_MAJOR && hd->major <= SCSI_DISK7_MAJOR) {
+               unit = unit + (hd->major - SCSI_DISK1_MAJOR + 1) * 16;
+               if (unit+'a' > 'z') {
+                       unit -= 26;
+                       sprintf(buf, "sd%c%c", 'a' + unit / 26, 'a' + unit % 26);
+                       if (part)
+                               sprintf(buf + 4, "%d", part);
+                       return buf;
+               }
+       }
+       if (hd->major >= COMPAQ_SMART2_MAJOR && hd->major <= COMPAQ_SMART2_MAJOR+7) {
+               int ctlr = hd->major - COMPAQ_SMART2_MAJOR;
+               if (part == 0)
+                       sprintf(buf, "%s/c%dd%d", maj, ctlr, unit);
+               else
+                       sprintf(buf, "%s/c%dd%dp%d", maj, ctlr, unit, part);
+               return buf;
+       }
+       if (hd->major >= COMPAQ_CISS_MAJOR && hd->major <= COMPAQ_CISS_MAJOR+7) {
+                int ctlr = hd->major - COMPAQ_CISS_MAJOR;
+                if (part == 0)
+                        sprintf(buf, "%s/c%dd%d", maj, ctlr, unit);
+                else
+                        sprintf(buf, "%s/c%dd%dp%d", maj, ctlr, unit, part);
+                return buf;
+       }
+       if (hd->major >= DAC960_MAJOR && hd->major <= DAC960_MAJOR+7) {
+               int ctlr = hd->major - DAC960_MAJOR;
+               if (part == 0)
+                       sprintf(buf, "%s/c%dd%d", maj, ctlr, unit);
+               else
+                       sprintf(buf, "%s/c%dd%dp%d", maj, ctlr, unit, part);
+               return buf;
+       }
+       if (hd->major == ATARAID_MAJOR) {
+               int disk = minor >> hd->minor_shift;
+               int part = minor & (( 1 << hd->minor_shift) - 1);
+               if (part == 0)
+                       sprintf(buf, "%s/d%d", maj, disk);
+               else
+                       sprintf(buf, "%s/d%dp%d", maj, disk, part);
+               return buf;
+       }
+       if (part)
+               sprintf(buf, "%s%c%d", maj, unit+'a', part);
+       else
+               sprintf(buf, "%s%c", maj, unit+'a');
+       return buf;
+}
+
+/*
+ * Add a partitions details to the devices partition description.
+ */
+void add_gd_partition(struct gendisk *hd, int minor, int start, int size)
+{
+#ifndef CONFIG_DEVFS_FS
+       char buf[40];
+#endif
+
+       hd->part[minor].start_sect = start;
+       hd->part[minor].nr_sects   = size;
+#ifdef CONFIG_DEVFS_FS
+       printk(" p%d", (minor & ((1 << hd->minor_shift) - 1)));
+#else
+       if ((hd->major >= COMPAQ_SMART2_MAJOR+0 && hd->major <= COMPAQ_SMART2_MAJOR+7) ||
+           (hd->major >= COMPAQ_CISS_MAJOR+0 && hd->major <= COMPAQ_CISS_MAJOR+7))
+               printk(" p%d", (minor & ((1 << hd->minor_shift) - 1)));
+       else
+               printk(" %s", disk_name(hd, minor, buf));
+#endif
+}
+
+static void check_partition(struct gendisk *hd, kdev_t dev, int first_part_minor)
+{
+       devfs_handle_t de = NULL;
+       static int first_time = 1;
+       unsigned long first_sector;
+       struct block_device *bdev;
+       char buf[64];
+       int i;
+
+       if (first_time)
+               printk(KERN_INFO "Partition check:\n");
+       first_time = 0;
+       first_sector = hd->part[MINOR(dev)].start_sect;
+
+       /*
+        * This is a kludge to allow the partition check to be
+        * skipped for specific drives (e.g. IDE CD-ROM drives)
+        */
+       if ((int)first_sector == -1) {
+               hd->part[MINOR(dev)].start_sect = 0;
+               return;
+       }
+
+       if (hd->de_arr)
+               de = hd->de_arr[MINOR(dev) >> hd->minor_shift];
+       i = devfs_generate_path (de, buf, sizeof buf);
+       if (i >= 0)
+               printk(KERN_INFO " /dev/%s:", buf + i);
+       else
+               printk(KERN_INFO " %s:", disk_name(hd, MINOR(dev), buf));
+       bdev = bdget(kdev_t_to_nr(dev));
+       bdev->bd_inode->i_size = (loff_t)hd->part[MINOR(dev)].nr_sects << 9;
+       bdev->bd_inode->i_blkbits = blksize_bits(block_size(dev));
+       for (i = 0; check_part[i]; i++) {
+               int res;
+               res = check_part[i](hd, bdev, first_sector, first_part_minor);
+               if (res) {
+                       if (res < 0 &&  warn_no_part)
+                               printk(" unable to read partition table\n");
+                       goto setup_devfs;
+               }
+       }
+
+       printk(" unknown partition table\n");
+setup_devfs:
+       invalidate_bdev(bdev, 1);
+       truncate_inode_pages(bdev->bd_inode->i_mapping, 0);
+       bdput(bdev);
+       i = first_part_minor - 1;
+       devfs_register_partitions (hd, i, hd->sizes ? 0 : 1);
+}
+
+#ifdef CONFIG_DEVFS_FS
+static void devfs_register_partition (struct gendisk *dev, int minor, int part)
+{
+       int devnum = minor >> dev->minor_shift;
+       devfs_handle_t dir;
+       unsigned int devfs_flags = DEVFS_FL_DEFAULT;
+       char devname[16];
+
+       if (dev->part[minor + part].de) return;
+       dir = devfs_get_parent (dev->part[minor].de);
+       if (!dir) return;
+       if ( dev->flags && (dev->flags[devnum] & GENHD_FL_REMOVABLE) )
+               devfs_flags |= DEVFS_FL_REMOVABLE;
+       sprintf (devname, "part%d", part);
+       dev->part[minor + part].de =
+           devfs_register (dir, devname, devfs_flags,
+                           dev->major, minor + part,
+                           S_IFBLK | S_IRUSR | S_IWUSR,
+                           dev->fops, NULL);
+}
+
+static struct unique_numspace disc_numspace = UNIQUE_NUMBERSPACE_INITIALISER;
+
+static void devfs_register_disc (struct gendisk *dev, int minor)
+{
+       int pos = 0;
+       int devnum = minor >> dev->minor_shift;
+       devfs_handle_t dir, slave;
+       unsigned int devfs_flags = DEVFS_FL_DEFAULT;
+       char dirname[64], symlink[16];
+       static devfs_handle_t devfs_handle;
+
+       if (dev->part[minor].de) return;
+       if ( dev->flags && (dev->flags[devnum] & GENHD_FL_REMOVABLE) )
+               devfs_flags |= DEVFS_FL_REMOVABLE;
+       if (dev->de_arr) {
+               dir = dev->de_arr[devnum];
+               if (!dir)  /*  Aware driver wants to block disc management  */
+                       return;
+               pos = devfs_generate_path (dir, dirname + 3, sizeof dirname-3);
+               if (pos < 0) return;
+               strncpy (dirname + pos, "../", 3);
+       }
+       else {
+               /*  Unaware driver: construct "real" directory  */
+               sprintf (dirname, "../%s/disc%d", dev->major_name, devnum);
+               dir = devfs_mk_dir (NULL, dirname + 3, NULL);
+       }
+       if (!devfs_handle)
+               devfs_handle = devfs_mk_dir (NULL, "discs", NULL);
+       dev->part[minor].number = devfs_alloc_unique_number (&disc_numspace);
+       sprintf (symlink, "disc%d", dev->part[minor].number);
+       devfs_mk_symlink (devfs_handle, symlink, DEVFS_FL_DEFAULT,
+                         dirname + pos, &slave, NULL);
+       dev->part[minor].de =
+           devfs_register (dir, "disc", devfs_flags, dev->major, minor,
+                           S_IFBLK | S_IRUSR | S_IWUSR, dev->fops, NULL);
+       devfs_auto_unregister (dev->part[minor].de, slave);
+       if (!dev->de_arr)
+               devfs_auto_unregister (slave, dir);
+}
+#endif  /*  CONFIG_DEVFS_FS  */
+
+void devfs_register_partitions (struct gendisk *dev, int minor, int unregister)
+{
+#ifdef CONFIG_DEVFS_FS
+       int part;
+
+       if (!unregister)
+               devfs_register_disc (dev, minor);
+       for (part = 1; part < dev->max_p; part++) {
+               if ( unregister || (dev->part[minor].nr_sects < 1) ||
+                    (dev->part[part + minor].nr_sects < 1) ) {
+                       devfs_unregister (dev->part[part + minor].de);
+                       dev->part[part + minor].de = NULL;
+                       continue;
+               }
+               devfs_register_partition (dev, minor, part);
+       }
+       if (unregister) {
+               devfs_unregister (dev->part[minor].de);
+               dev->part[minor].de = NULL;
+               devfs_dealloc_unique_number (&disc_numspace,
+                                            dev->part[minor].number);
+       }
+#endif  /*  CONFIG_DEVFS_FS  */
+}
+
+/*
+ * This function will re-read the partition tables for a given device,
+ * and set things back up again.  There are some important caveats,
+ * however.  You must ensure that no one is using the device, and no one
+ * can start using the device while this function is being executed.
+ *
+ * Much of the cleanup from the old partition tables should have already been
+ * done
+ */
+
+void register_disk(struct gendisk *gdev, kdev_t dev, unsigned minors,
+       struct block_device_operations *ops, long size)
+{
+       if (!gdev)
+               return;
+       grok_partitions(gdev, MINOR(dev)>>gdev->minor_shift, minors, size);
+}
+
+void grok_partitions(struct gendisk *dev, int drive, unsigned minors, long size)
+{
+       int i;
+       int first_minor = drive << dev->minor_shift;
+       int end_minor   = first_minor + dev->max_p;
+
+       if(!dev->sizes)
+               blk_size[dev->major] = NULL;
+
+       dev->part[first_minor].nr_sects = size;
+       /* No such device or no minors to use for partitions */
+       if ( !size && dev->flags && (dev->flags[drive] & GENHD_FL_REMOVABLE) )
+               devfs_register_partitions (dev, first_minor, 0);
+       if (!size || minors == 1)
+               return;
+
+       if (dev->sizes) {
+               dev->sizes[first_minor] = size >> (BLOCK_SIZE_BITS - 9);
+               for (i = first_minor + 1; i < end_minor; i++)
+                       dev->sizes[i] = 0;
+       }
+       blk_size[dev->major] = dev->sizes;
+       check_partition(dev, MKDEV(dev->major, first_minor), 1 + first_minor);
+
+       /*
+        * We need to set the sizes array before we will be able to access
+        * any of the partitions on this device.
+        */
+       if (dev->sizes != NULL) {       /* optional safeguard in ll_rw_blk.c */
+               for (i = first_minor; i < end_minor; i++)
+                       dev->sizes[i] = dev->part[i].nr_sects >> (BLOCK_SIZE_BITS - 9);
+       }
+}
+
+unsigned char *read_dev_sector(struct block_device *bdev, unsigned long n, Sector *p)
+{
+       struct address_space *mapping = bdev->bd_inode->i_mapping;
+       int sect = PAGE_CACHE_SIZE / 512;
+       struct page *page;
+
+       page = read_cache_page(mapping, n/sect,
+                       (filler_t *)mapping->a_ops->readpage, NULL);
+       if (!IS_ERR(page)) {
+               wait_on_page(page);
+               if (!Page_Uptodate(page))
+                       goto fail;
+               if (PageError(page))
+                       goto fail;
+               p->v = page;
+               return (unsigned char *)page_address(page) + 512 * (n % sect);
+fail:
+               page_cache_release(page);
+       }
+       p->v = NULL;
+       return NULL;
+}
diff --git a/xenolinux-2.4.22-sparse/fs/partitions/xeno.c b/xenolinux-2.4.22-sparse/fs/partitions/xeno.c
new file mode 100644 (file)
index 0000000..ef48583
--- /dev/null
@@ -0,0 +1,78 @@
+/* Simple hack so that client XenoLinux's can sort-of see parts of the
+   host partition table. */
+#include <linux/kernel.h>
+#include <asm/hypervisor.h>
+#include <linux/fs.h>
+#include <linux/blk.h>
+#include <linux/slab.h>
+#include <linux/genhd.h>
+#include <asm/hypervisor-ifs/block.h>
+#include <linux/pagemap.h>
+
+#include "check.h"
+#include "xeno.h"
+
+extern int xenolinux_control_msg(int operration, char *buffer, int size);
+extern unsigned short xldev_to_physdev(kdev_t xldev);
+
+/* Grab the physdisk partitions list from the hypervisor. */
+int xeno_partition(struct gendisk *hd,
+                  struct block_device *bdev,
+                  unsigned long first_sec,
+                  int first_part_minor)
+{
+    physdisk_probebuf_t *buf;
+    int i, minor;
+    
+    /* Privileged domains can read partition info themselves. */
+    if (start_info.flags & SIF_PRIVILEGED)
+        return 0;
+
+    /* This only deals with raw/direct devices (IDE & SCSI). */
+    switch ( xldev_to_physdev(bdev->bd_dev) & XENDEV_TYPE_MASK )
+    {
+    case XENDEV_IDE:
+    case XENDEV_SCSI:
+        break;
+    default:
+        return 0;
+    }
+
+    if ( (buf = kmalloc(sizeof(*buf), GFP_KERNEL)) == NULL )
+        return -ENOMEM;
+
+    buf->domain = start_info.dom_id;
+    buf->start_ind = 0;
+    buf->n_aces = PHYSDISK_MAX_ACES_PER_REQUEST;
+
+    xenolinux_control_msg(XEN_BLOCK_PHYSDEV_PROBE, (char *)buf,
+                         sizeof(*buf));
+
+    if ( buf->n_aces == PHYSDISK_MAX_ACES_PER_REQUEST )
+        printk(KERN_ALERT "Too many returns for xeno partition parser\n");
+
+    for ( i = 0; i < buf->n_aces; i++ )
+    {
+        if (buf->entries[i].partition == 0)
+           continue;
+       if (buf->entries[i].device != xldev_to_physdev(bdev->bd_dev))
+           continue;
+        if (!(buf->entries[i].mode & PHYSDISK_MODE_W))
+        {
+            if (!(buf->entries[i].mode & PHYSDISK_MODE_R))
+                continue;
+            set_device_ro(bdev->bd_dev, 1);
+        }
+       minor = buf->entries[i].partition + first_part_minor - 1;
+       add_gd_partition(hd,
+                        minor,
+                        buf->entries[i].start_sect,
+                        buf->entries[i].n_sectors);
+    }  
+
+    kfree(buf);
+
+    printk("\n");
+
+    return 1;
+}
diff --git a/xenolinux-2.4.22-sparse/fs/partitions/xeno.h b/xenolinux-2.4.22-sparse/fs/partitions/xeno.h
new file mode 100644 (file)
index 0000000..52cecb3
--- /dev/null
@@ -0,0 +1,2 @@
+int xeno_partition(struct gendisk *hd, struct block_device *bdev,
+                  unsigned long fsec, int first_part_minor);
diff --git a/xenolinux-2.4.22-sparse/include/asm-xeno/bugs.h b/xenolinux-2.4.22-sparse/include/asm-xeno/bugs.h
new file mode 100644 (file)
index 0000000..c46b6a0
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ *  include/asm-i386/bugs.h
+ *
+ *  Copyright (C) 1994  Linus Torvalds
+ *
+ *  Cyrix stuff, June 1998 by:
+ *     - Rafael R. Reilova (moved everything from head.S),
+ *        <rreilova@ececs.uc.edu>
+ *     - Channing Corn (tests & fixes),
+ *     - Andrew D. Balsa (code cleanup).
+ *
+ *  Pentium III FXSR, SSE support
+ *     Gareth Hughes <gareth@valinux.com>, May 2000
+ */
+
+/*
+ * This is included by init/main.c to check for architecture-dependent bugs.
+ *
+ * Needs:
+ *     void check_bugs(void);
+ */
+
+#include <linux/config.h>
+#include <asm/processor.h>
+#include <asm/i387.h>
+#include <asm/msr.h>
+
+
+static void __init check_fpu(void)
+{
+    boot_cpu_data.fdiv_bug = 0;
+}
+
+static void __init check_hlt(void)
+{
+    boot_cpu_data.hlt_works_ok = 1;
+}
+
+static void __init check_bugs(void)
+{
+       extern void __init boot_init_fpu(void);
+
+       identify_cpu(&boot_cpu_data);
+       boot_init_fpu();
+#ifndef CONFIG_SMP
+       printk("CPU: ");
+       print_cpu_info(&boot_cpu_data);
+#endif
+       check_fpu();
+       check_hlt();
+    system_utsname.machine[1] = '0' + 
+        (boot_cpu_data.x86 > 6 ? 6 : boot_cpu_data.x86);
+}
diff --git a/xenolinux-2.4.22-sparse/include/asm-xeno/desc.h b/xenolinux-2.4.22-sparse/include/asm-xeno/desc.h
new file mode 100644 (file)
index 0000000..c417cbe
--- /dev/null
@@ -0,0 +1,39 @@
+#ifndef __ARCH_DESC_H
+#define __ARCH_DESC_H
+
+#include <asm/ldt.h>
+
+#ifndef __ASSEMBLY__
+
+struct desc_struct {
+       unsigned long a,b;
+};
+
+struct Xgt_desc_struct {
+       unsigned short size;
+       unsigned long address __attribute__((packed));
+};
+
+extern struct desc_struct default_ldt[];
+
+static inline void clear_LDT(void)
+{
+    queue_set_ldt((unsigned long)&default_ldt[0], 5);
+}
+
+static inline void load_LDT(struct mm_struct *mm)
+{
+    void *segments = mm->context.segments;
+    int count = LDT_ENTRIES;
+
+    if (!segments) {
+        segments = &default_ldt[0];
+        count = 5;
+    }
+         
+    queue_set_ldt((unsigned long)segments, count);
+}
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* __ARCH_DESC_H__ */
diff --git a/xenolinux-2.4.22-sparse/include/asm-xeno/fixmap.h b/xenolinux-2.4.22-sparse/include/asm-xeno/fixmap.h
new file mode 100644 (file)
index 0000000..590ecf9
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * fixmap.h: compile-time virtual memory allocation
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ *
+ * Copyright (C) 1998 Ingo Molnar
+ *
+ * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
+ */
+
+#ifndef _ASM_FIXMAP_H
+#define _ASM_FIXMAP_H
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <asm/apicdef.h>
+#include <asm/page.h>
+
+/*
+ * Here we define all the compile-time 'special' virtual
+ * addresses. The point is to have a constant address at
+ * compile time, but to set the physical address only
+ * in the boot process. We allocate these special  addresses
+ * from the end of virtual memory (0xfffff000) backwards.
+ * Also this lets us do fail-safe vmalloc(), we
+ * can guarantee that these special addresses and
+ * vmalloc()-ed addresses never overlap.
+ *
+ * these 'compile-time allocated' memory buffers are
+ * fixed-size 4k pages. (or larger if used with an increment
+ * highger than 1) use fixmap_set(idx,phys) to associate
+ * physical memory with fixmap indices.
+ *
+ * TLB entries of such buffers will not be flushed across
+ * task switches.
+ */
+
+enum fixed_addresses {
+#ifdef CONFIG_HIGHMEM_XXX
+       FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */
+       FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
+#endif
+       FIX_BLKRING_BASE,
+       FIX_NETRING0_BASE,
+       FIX_NETRING1_BASE,
+       FIX_NETRING2_BASE,
+       FIX_NETRING3_BASE,
+
+#ifdef CONFIG_VGA_CONSOLE
+#define NR_FIX_BTMAPS   32  /* 128KB For the Dom0 VGA Console A0000-C0000 */
+#else
+#define NR_FIX_BTMAPS   1   /* have on page incase anyone wants it in future */
+#endif
+        FIX_BTMAP_END,
+        FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS - 1,
+       /* our bt_ioremap is permenant unlike other architectures */
+       
+       __end_of_permanent_fixed_addresses,
+       __end_of_fixed_addresses = __end_of_permanent_fixed_addresses
+};
+
+extern void __set_fixmap (enum fixed_addresses idx,
+                                       unsigned long phys, pgprot_t flags);
+
+#define set_fixmap(idx, phys) \
+               __set_fixmap(idx, phys, PAGE_KERNEL)
+/*
+ * Some hardware wants to get fixmapped without caching.
+ */
+#define set_fixmap_nocache(idx, phys) \
+               __set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
+/*
+ * used by vmalloc.c.
+ *
+ * Leave one empty page between vmalloc'ed areas and
+ * the start of the fixmap, and leave one page empty
+ * at the top of mem..
+ */
+#define FIXADDR_TOP   (HYPERVISOR_VIRT_START - 2*PAGE_SIZE)
+#define __FIXADDR_SIZE        (__end_of_fixed_addresses << PAGE_SHIFT)
+#define FIXADDR_START (FIXADDR_TOP - __FIXADDR_SIZE)
+
+#define __fix_to_virt(x)       (FIXADDR_TOP - ((x) << PAGE_SHIFT))
+
+/*
+ * 'index to address' translation. If anyone tries to use the idx
+ * directly without tranlation, we catch the bug with a NULL-deference
+ * kernel oops. Illegal ranges of incoming indices are caught too.
+ */
+static inline unsigned long fix_to_virt(unsigned int idx)
+{
+        return __fix_to_virt(idx);
+}
+
+#endif
diff --git a/xenolinux-2.4.22-sparse/include/asm-xeno/highmem.h b/xenolinux-2.4.22-sparse/include/asm-xeno/highmem.h
new file mode 100644 (file)
index 0000000..7e56b1b
--- /dev/null
@@ -0,0 +1,2 @@
+#error "Highmem unsupported!"
+
diff --git a/xenolinux-2.4.22-sparse/include/asm-xeno/hw_irq.h b/xenolinux-2.4.22-sparse/include/asm-xeno/hw_irq.h
new file mode 100644 (file)
index 0000000..d99d15b
--- /dev/null
@@ -0,0 +1,61 @@
+#ifndef _ASM_HW_IRQ_H
+#define _ASM_HW_IRQ_H
+
+/*
+ *     linux/include/asm/hw_irq.h
+ *
+ *     (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar
+ */
+
+#include <linux/config.h>
+#include <linux/smp.h>
+#include <asm/atomic.h>
+#include <asm/irq.h>
+
+#define SYSCALL_VECTOR         0x80
+
+extern int irq_vector[NR_IRQS];
+
+extern atomic_t irq_err_count;
+extern atomic_t irq_mis_count;
+
+extern char _stext, _etext;
+
+extern unsigned long prof_cpu_mask;
+extern unsigned int * prof_buffer;
+extern unsigned long prof_len;
+extern unsigned long prof_shift;
+
+/*
+ * x86 profiling function, SMP safe. We might want to do this in
+ * assembly totally?
+ */
+static inline void x86_do_profile (unsigned long eip)
+{
+        if (!prof_buffer)
+                return;
+
+        /*
+         * Only measure the CPUs specified by /proc/irq/prof_cpu_mask.
+         * (default is all CPUs.)
+         */
+        if (!((1<<smp_processor_id()) & prof_cpu_mask))
+                return;
+
+        eip -= (unsigned long) &_stext;
+        eip >>= prof_shift;
+        /*
+         * Don't ignore out-of-bounds EIP values silently,
+         * put them into the last histogram slot, so if
+         * present, they will show up as a sharp peak.
+         */
+        if (eip > prof_len-1)
+                eip = prof_len-1;
+        atomic_inc((atomic_t *)&prof_buffer[eip]);
+}
+
+static inline void hw_resend_irq(struct hw_interrupt_type *h,
+                                 unsigned int i)
+{}
+
+#endif /* _ASM_HW_IRQ_H */
diff --git a/xenolinux-2.4.22-sparse/include/asm-xeno/hypervisor.h b/xenolinux-2.4.22-sparse/include/asm-xeno/hypervisor.h
new file mode 100644 (file)
index 0000000..751bdc7
--- /dev/null
@@ -0,0 +1,367 @@
+/******************************************************************************
+ * hypervisor.h
+ * 
+ * Linux-specific hypervisor handling.
+ * 
+ * Copyright (c) 2002, K A Fraser
+ */
+
+#ifndef __HYPERVISOR_H__
+#define __HYPERVISOR_H__
+
+#include <linux/types.h>
+#include <asm/hypervisor-ifs/hypervisor-if.h>
+#include <asm/ptrace.h>
+
+/* arch/xeno/kernel/setup.c */
+union start_info_union
+{
+    start_info_t start_info;
+    char padding[512];
+};
+extern union start_info_union start_info_union;
+#define start_info (start_info_union.start_info)
+
+/* arch/xeno/kernel/hypervisor.c */
+void do_hypervisor_callback(struct pt_regs *regs);
+
+
+/* arch/xeno/mm/hypervisor.c */
+/*
+ * NB. ptr values should be PHYSICAL, not MACHINE. 'vals' should be already
+ * be MACHINE addresses.
+ */
+
+extern unsigned int pt_update_queue_idx;
+
+void queue_l1_entry_update(unsigned long ptr, unsigned long val);
+void queue_l2_entry_update(unsigned long ptr, unsigned long val);
+void queue_pt_switch(unsigned long ptr);
+void queue_tlb_flush(void);
+void queue_invlpg(unsigned long ptr);
+void queue_pgd_pin(unsigned long ptr);
+void queue_pgd_unpin(unsigned long ptr);
+void queue_pte_pin(unsigned long ptr);
+void queue_pte_unpin(unsigned long ptr);
+void queue_set_ldt(unsigned long ptr, unsigned long bytes);
+#define PT_UPDATE_DEBUG 0
+
+#if PT_UPDATE_DEBUG > 0
+typedef struct {
+    unsigned long ptr, val, pteval;
+    void *ptep;
+    int line; char *file;
+} page_update_debug_t;
+extern page_update_debug_t update_debug_queue[];
+#define queue_l1_entry_update(_p,_v) ({                           \
+ update_debug_queue[pt_update_queue_idx].ptr  = (_p);             \
+ update_debug_queue[pt_update_queue_idx].val  = (_v);             \
+ update_debug_queue[pt_update_queue_idx].line = __LINE__;         \
+ update_debug_queue[pt_update_queue_idx].file = __FILE__;         \
+ queue_l1_entry_update((_p),(_v));                                \
+})
+#define queue_l2_entry_update(_p,_v) ({                           \
+ update_debug_queue[pt_update_queue_idx].ptr  = (_p);             \
+ update_debug_queue[pt_update_queue_idx].val  = (_v);             \
+ update_debug_queue[pt_update_queue_idx].line = __LINE__;         \
+ update_debug_queue[pt_update_queue_idx].file = __FILE__;         \
+ queue_l2_entry_update((_p),(_v));                                \
+})
+#endif
+
+#if PT_UPDATE_DEBUG > 1
+#undef queue_l1_entry_update
+#undef queue_l2_entry_update
+#define queue_l1_entry_update(_p,_v) ({                           \
+ update_debug_queue[pt_update_queue_idx].ptr  = (_p);             \
+ update_debug_queue[pt_update_queue_idx].val  = (_v);             \
+ update_debug_queue[pt_update_queue_idx].line = __LINE__;         \
+ update_debug_queue[pt_update_queue_idx].file = __FILE__;         \
+ printk("L1 %s %d: %08lx (%08lx -> %08lx)\n", __FILE__, __LINE__, \
+        phys_to_machine(_p), *(unsigned long *)__va(_p),          \
+        (unsigned long)(_v));                                     \
+ queue_l1_entry_update((_p),(_v));                                \
+})
+#define queue_l2_entry_update(_p,_v) ({                           \
+ update_debug_queue[pt_update_queue_idx].ptr  = (_p);             \
+ update_debug_queue[pt_update_queue_idx].val  = (_v);             \
+ update_debug_queue[pt_update_queue_idx].line = __LINE__;         \
+ update_debug_queue[pt_update_queue_idx].file = __FILE__;         \
+ printk("L2 %s %d: %08lx (%08lx -> %08lx)\n", __FILE__, __LINE__, \
+        phys_to_machine(_p), *(unsigned long *)__va(_p),          \
+        (unsigned long)(_v));                                     \
+ queue_l2_entry_update((_p),(_v));                                \
+})
+#define queue_pt_switch(_p) ({                                    \
+ printk("PTSWITCH %s %d: %08lx\n", __FILE__, __LINE__, (_p));     \
+ queue_pt_switch(_p);                                             \
+})   
+#define queue_tlb_flush() ({                                      \
+ printk("TLB FLUSH %s %d\n", __FILE__, __LINE__);                 \
+ queue_tlb_flush();                                               \
+})   
+#define queue_invlpg(_p) ({                                       \
+ printk("INVLPG %s %d: %08lx\n", __FILE__, __LINE__, (_p));       \
+ queue_invlpg(_p);                                                \
+})   
+#define queue_pgd_pin(_p) ({                                      \
+ printk("PGD PIN %s %d: %08lx\n", __FILE__, __LINE__, (_p));      \
+ queue_pgd_pin(_p);                                               \
+})   
+#define queue_pgd_unpin(_p) ({                                    \
+ printk("PGD UNPIN %s %d: %08lx\n", __FILE__, __LINE__, (_p));    \
+ queue_pgd_unpin(_p);                                             \
+})   
+#define queue_pte_pin(_p) ({                                      \
+ printk("PTE PIN %s %d: %08lx\n", __FILE__, __LINE__, (_p));      \
+ queue_pte_pin(_p);                                               \
+})   
+#define queue_pte_unpin(_p) ({                                    \
+ printk("PTE UNPIN %s %d: %08lx\n", __FILE__, __LINE__, (_p));    \
+ queue_pte_unpin(_p);                                             \
+})   
+#define queue_set_ldt(_p,_l) ({                                        \
+ printk("SETL LDT %s %d: %08lx %d\n", __FILE__, __LINE__, (_p), (_l)); \
+ queue_set_ldt((_p), (_l));                                            \
+})   
+#endif
+
+void _flush_page_update_queue(void);
+static inline int flush_page_update_queue(void)
+{
+    unsigned int idx = pt_update_queue_idx;
+    if ( idx != 0 ) _flush_page_update_queue();
+    return idx;
+}
+#define XENO_flush_page_update_queue() (_flush_page_update_queue())
+void MULTICALL_flush_page_update_queue(void);
+
+
+/*
+ * Assembler stubs for hyper-calls.
+ */
+
+static inline int HYPERVISOR_set_trap_table(trap_info_t *table)
+{
+    int ret;
+    __asm__ __volatile__ (
+        TRAP_INSTR
+        : "=a" (ret) : "0" (__HYPERVISOR_set_trap_table),
+        "b" (table) );
+
+    return ret;
+}
+
+
+static inline int HYPERVISOR_pt_update(page_update_request_t *req, int count)
+{
+    int ret;
+    __asm__ __volatile__ (
+        TRAP_INSTR
+        : "=a" (ret) : "0" (__HYPERVISOR_pt_update), 
+        "b" (req), "c" (count) );
+
+    return ret;
+}
+
+
+static inline int HYPERVISOR_console_write(const char *str, int count)
+{
+    int ret;
+    __asm__ __volatile__ (
+        TRAP_INSTR
+        : "=a" (ret) : "0" (__HYPERVISOR_console_write), 
+        "b" (str), "c" (count) );
+
+
+    return ret;
+}
+
+static inline int HYPERVISOR_set_gdt(unsigned long *frame_list, int entries)
+{
+    int ret;
+    __asm__ __volatile__ (
+        TRAP_INSTR
+        : "=a" (ret) : "0" (__HYPERVISOR_set_gdt), 
+        "b" (frame_list), "c" (entries) );
+
+
+    return ret;
+}
+
+static inline int HYPERVISOR_stack_switch(unsigned long ss, unsigned long esp)
+{
+    int ret;
+    __asm__ __volatile__ (
+        TRAP_INSTR
+        : "=a" (ret) : "0" (__HYPERVISOR_stack_switch),
+        "b" (ss), "c" (esp) : "memory" );
+
+    return ret;
+}
+
+static inline int HYPERVISOR_set_callbacks(
+    unsigned long event_selector, unsigned long event_address,
+    unsigned long failsafe_selector, unsigned long failsafe_address)
+{
+    int ret;
+    __asm__ __volatile__ (
+        TRAP_INSTR
+        : "=a" (ret) : "0" (__HYPERVISOR_set_callbacks),
+        "b" (event_selector), "c" (event_address), 
+        "d" (failsafe_selector), "S" (failsafe_address) : "memory" );
+
+    return ret;
+}
+
+static inline int HYPERVISOR_net_update(void)
+{
+    int ret;
+    __asm__ __volatile__ (
+        TRAP_INSTR
+        : "=a" (ret) : "0" (__HYPERVISOR_net_update) );
+
+    return ret;
+}
+
+static inline int HYPERVISOR_fpu_taskswitch(void)
+{
+    int ret;
+    __asm__ __volatile__ (
+        TRAP_INSTR
+        : "=a" (ret) : "0" (__HYPERVISOR_fpu_taskswitch) );
+
+    return ret;
+}
+
+static inline int HYPERVISOR_yield(void)
+{
+    int ret;
+    __asm__ __volatile__ (
+        TRAP_INSTR
+        : "=a" (ret) : "0" (__HYPERVISOR_yield) );
+
+    return ret;
+}
+
+static inline int HYPERVISOR_exit(void)
+{
+    int ret;
+    __asm__ __volatile__ (
+        TRAP_INSTR
+        : "=a" (ret) : "0" (__HYPERVISOR_exit) );
+
+    return ret;
+}
+
+static inline int HYPERVISOR_dom0_op(void *dom0_op)
+{
+    int ret;
+    __asm__ __volatile__ (
+        TRAP_INSTR
+        : "=a" (ret) : "0" (__HYPERVISOR_dom0_op),
+        "b" (dom0_op) : "memory" );
+
+    return ret;
+}
+
+static inline int HYPERVISOR_network_op(void *network_op)
+{
+    int ret;
+    __asm__ __volatile__ (
+        TRAP_INSTR
+        : "=a" (ret) : "0" (__HYPERVISOR_network_op),
+        "b" (network_op) );
+
+    return ret;
+}
+
+static inline int HYPERVISOR_block_io_op(void)
+{
+    int ret;
+    __asm__ __volatile__ (
+        TRAP_INSTR
+        : "=a" (ret) : "0" (__HYPERVISOR_block_io_op) ); 
+
+    return ret;
+}
+
+static inline int HYPERVISOR_set_debugreg(int reg, unsigned long value)
+{
+    int ret;
+    __asm__ __volatile__ (
+        TRAP_INSTR
+        : "=a" (ret) : "0" (__HYPERVISOR_set_debugreg),
+        "b" (reg), "c" (value) );
+
+    return ret;
+}
+
+static inline unsigned long HYPERVISOR_get_debugreg(int reg)
+{
+    unsigned long ret;
+    __asm__ __volatile__ (
+        TRAP_INSTR
+        : "=a" (ret) : "0" (__HYPERVISOR_get_debugreg),
+        "b" (reg) );
+
+    return ret;
+}
+
+static inline int HYPERVISOR_update_descriptor(
+    unsigned long pa, unsigned long word1, unsigned long word2)
+{
+    int ret;
+    __asm__ __volatile__ (
+        TRAP_INSTR
+        : "=a" (ret) : "0" (__HYPERVISOR_update_descriptor), 
+        "b" (pa), "c" (word1), "d" (word2) );
+
+    return ret;
+}
+
+static inline int HYPERVISOR_set_fast_trap(int idx)
+{
+    int ret;
+    __asm__ __volatile__ (
+        TRAP_INSTR
+        : "=a" (ret) : "0" (__HYPERVISOR_set_fast_trap), 
+        "b" (idx) );
+
+    return ret;
+}
+
+static inline int HYPERVISOR_dom_mem_op(void *dom_mem_op)
+{
+    int ret;
+    __asm__ __volatile__ (
+        TRAP_INSTR
+        : "=a" (ret) : "0" (__HYPERVISOR_dom_mem_op),
+        "b" (dom_mem_op) : "memory" );
+
+    return ret;
+}
+
+static inline int HYPERVISOR_multicall(void *call_list, int nr_calls)
+{
+    int ret;
+    __asm__ __volatile__ (
+        TRAP_INSTR
+        : "=a" (ret) : "0" (__HYPERVISOR_multicall),
+        "b" (call_list), "c" (nr_calls) : "memory" );
+
+    return ret;
+}
+
+static inline long HYPERVISOR_kbd_op(unsigned char op, unsigned char val)
+{
+    int ret;
+    __asm__ __volatile__ (
+        TRAP_INSTR
+        : "=a" (ret) : "0" (__HYPERVISOR_kbd_op),
+        "b" (op), "c" (val) );
+
+    return ret;
+}
+
+#endif /* __HYPERVISOR_H__ */
diff --git a/xenolinux-2.4.22-sparse/include/asm-xeno/irq.h b/xenolinux-2.4.22-sparse/include/asm-xeno/irq.h
new file mode 100644 (file)
index 0000000..3a4a3e3
--- /dev/null
@@ -0,0 +1,31 @@
+#ifndef _ASM_IRQ_H
+#define _ASM_IRQ_H
+
+/*
+ *     linux/include/asm/irq.h
+ *
+ *     (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar
+ *
+ *     IRQ/IPI changes taken from work by Thomas Radke
+ *     <tomsoft@informatik.tu-chemnitz.de>
+ */
+
+#include <linux/config.h>
+#include <asm/hypervisor.h>
+#include <asm/ptrace.h>
+
+#define TIMER_IRQ _EVENT_TIMER
+
+#define NR_IRQS (sizeof(HYPERVISOR_shared_info->events) * 8)
+
+#define irq_cannonicalize(_irq) (_irq)
+
+extern void disable_irq(unsigned int);
+extern void disable_irq_nosync(unsigned int);
+extern void enable_irq(unsigned int);
+
+#ifdef CONFIG_X86_LOCAL_APIC
+#define ARCH_HAS_NMI_WATCHDOG          /* See include/linux/nmi.h */
+#endif
+
+#endif /* _ASM_IRQ_H */
diff --git a/xenolinux-2.4.22-sparse/include/asm-xeno/keyboard.h b/xenolinux-2.4.22-sparse/include/asm-xeno/keyboard.h
new file mode 100644 (file)
index 0000000..6d6461d
--- /dev/null
@@ -0,0 +1,95 @@
+/* xenolinux/include/asm-xeno/keyboard.h */
+/* Portions copyright (c) 2003 James Scott, Intel Research Cambridge */
+/* Talks to hypervisor to get PS/2 keyboard and mouse events, and send keyboard and mouse commands */
+
+/*  Based on:
+ *  linux/include/asm-i386/keyboard.h
+ *
+ *  Created 3 Nov 1996 by Geert Uytterhoeven
+ */
+
+#ifndef _XENO_KEYBOARD_H
+#define _XENO_KEYBOARD_H
+
+#ifdef __KERNEL__
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/kd.h>
+#include <linux/pm.h>
+#include <asm/io.h>
+
+extern int pckbd_setkeycode(unsigned int scancode, unsigned int keycode);
+extern int pckbd_getkeycode(unsigned int scancode);
+extern int pckbd_translate(unsigned char scancode, unsigned char *keycode,
+                          char raw_mode);
+extern char pckbd_unexpected_up(unsigned char keycode);
+extern void pckbd_leds(unsigned char leds);
+extern void pckbd_init_hw(void);
+extern int pckbd_pm_resume(struct pm_dev *, pm_request_t, void *);
+
+extern pm_callback pm_kbd_request_override;
+extern unsigned char pckbd_sysrq_xlate[128];
+
+#define kbd_setkeycode         pckbd_setkeycode
+#define kbd_getkeycode         pckbd_getkeycode
+#define kbd_translate          pckbd_translate
+#define kbd_unexpected_up      pckbd_unexpected_up
+#define kbd_leds               pckbd_leds
+#define kbd_init_hw            pckbd_init_hw
+#define kbd_sysrq_xlate                pckbd_sysrq_xlate
+
+#define SYSRQ_KEY 0x54
+
+
+/* THIS SECTION TALKS TO XEN TO DO PS2 SUPPORT */
+#include <asm/hypervisor-ifs/kbd.h>
+#include <asm/hypervisor-ifs/hypervisor-if.h>
+
+#define kbd_controller_present xen_kbd_controller_present
+
+static inline int xen_kbd_controller_present ()
+{
+    return start_info.flags & SIF_CONSOLE;
+}
+
+/* resource allocation */
+#define kbd_request_region()     \
+    do { } while (0)
+#define kbd_request_irq(handler) \
+    request_irq(_EVENT_PS2, handler, 0, "ps/2", NULL)
+
+/* could implement these with command to xen to filter mouse stuff... */
+#define aux_request_irq(hand, dev_id) 0
+#define aux_free_irq(dev_id) do { } while(0)
+
+/* Some stoneage hardware needs delays after some operations.  */
+#define kbd_pause() do { } while(0)
+
+static unsigned char kbd_current_scancode = 0;
+
+static unsigned char kbd_read_input(void) 
+{
+  return kbd_current_scancode;
+}
+
+static unsigned char kbd_read_status(void) 
+{
+  long res;
+  res = HYPERVISOR_kbd_op(KBD_OP_READ,0);
+  if ( res<0 ) 
+  {
+    kbd_current_scancode = 0;
+    return 0; /* error with our request - wrong domain? */
+  }
+  kbd_current_scancode = KBD_CODE_SCANCODE(res);
+  return KBD_CODE_STATUS(res);
+}
+
+
+#define kbd_write_output(val)  HYPERVISOR_kbd_op(KBD_OP_WRITEOUTPUT, val);
+#define kbd_write_command(val) HYPERVISOR_kbd_op(KBD_OP_WRITECOMMAND, val);
+
+
+#endif /* __KERNEL__ */
+#endif /* _XENO_KEYBOARD_H */
diff --git a/xenolinux-2.4.22-sparse/include/asm-xeno/mmu_context.h b/xenolinux-2.4.22-sparse/include/asm-xeno/mmu_context.h
new file mode 100644 (file)
index 0000000..1eab441
--- /dev/null
@@ -0,0 +1,73 @@
+#ifndef __I386_MMU_CONTEXT_H
+#define __I386_MMU_CONTEXT_H
+
+#include <linux/config.h>
+#include <asm/desc.h>
+#include <asm/atomic.h>
+#include <asm/pgalloc.h>
+
+/*
+ * possibly do the LDT unload here?
+ */
+#define destroy_context(mm)            do { } while(0)
+#define init_new_context(tsk,mm)       0
+
+#ifdef CONFIG_SMP
+
+static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk, unsigned cpu)
+{
+       if(cpu_tlbstate[cpu].state == TLBSTATE_OK)
+               cpu_tlbstate[cpu].state = TLBSTATE_LAZY;        
+}
+#else
+static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk, unsigned cpu)
+{
+}
+#endif
+
+extern pgd_t *cur_pgd;
+
+static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, struct task_struct *tsk, unsigned cpu)
+{
+       if (prev != next) {
+               /* stop flush ipis for the previous mm */
+               clear_bit(cpu, &prev->cpu_vm_mask);
+               /*
+                * Re-load LDT if necessary
+                */
+               if (prev->context.segments != next->context.segments)
+                       load_LDT(next);
+#ifdef CONFIG_SMP
+               cpu_tlbstate[cpu].state = TLBSTATE_OK;
+               cpu_tlbstate[cpu].active_mm = next;
+#endif
+               set_bit(cpu, &next->cpu_vm_mask);
+               set_bit(cpu, &next->context.cpuvalid);
+               /* Re-load page tables */
+               cur_pgd = next->pgd;
+               queue_pt_switch(__pa(cur_pgd));
+       }
+#ifdef CONFIG_SMP
+       else {
+               cpu_tlbstate[cpu].state = TLBSTATE_OK;
+               if(cpu_tlbstate[cpu].active_mm != next)
+                       out_of_line_bug();
+               if(!test_and_set_bit(cpu, &next->cpu_vm_mask)) {
+                       /* We were in lazy tlb mode and leave_mm disabled 
+                        * tlb flush IPI delivery. We must reload %cr3.
+                        */
+                       load_cr3(next->pgd);
+               }
+               if (!test_and_set_bit(cpu, &next->context.cpuvalid))
+                       load_LDT(next);
+       }
+#endif
+}
+
+#define activate_mm(prev, next) \
+do { \
+       switch_mm((prev),(next),NULL,smp_processor_id()); \
+       flush_page_update_queue(); \
+} while ( 0 )
+
+#endif
diff --git a/xenolinux-2.4.22-sparse/include/asm-xeno/multicall.h b/xenolinux-2.4.22-sparse/include/asm-xeno/multicall.h
new file mode 100644 (file)
index 0000000..f0ea5c3
--- /dev/null
@@ -0,0 +1,84 @@
+/******************************************************************************
+ * multicall.h
+ */
+
+#ifndef __MULTICALL_H__
+#define __MULTICALL_H__
+
+#include <asm/hypervisor.h>
+
+extern multicall_entry_t multicall_list[];
+extern int nr_multicall_ents;
+
+static inline void queue_multicall0(unsigned long op)
+{
+    int i = nr_multicall_ents;
+    multicall_list[i].op      = op;
+    nr_multicall_ents = i+1;
+}
+
+static inline void queue_multicall1(unsigned long op, unsigned long arg1)
+{
+    int i = nr_multicall_ents;
+    multicall_list[i].op      = op;
+    multicall_list[i].args[0] = arg1;
+    nr_multicall_ents = i+1;
+}
+
+static inline void queue_multicall2(
+    unsigned long op, unsigned long arg1, unsigned long arg2)
+{
+    int i = nr_multicall_ents;
+    multicall_list[i].op      = op;
+    multicall_list[i].args[0] = arg1;
+    multicall_list[i].args[1] = arg2;
+    nr_multicall_ents = i+1;
+}
+
+static inline void queue_multicall3(
+    unsigned long op, unsigned long arg1, unsigned long arg2,
+    unsigned long arg3)
+{
+    int i = nr_multicall_ents;
+    multicall_list[i].op      = op;
+    multicall_list[i].args[0] = arg1;
+    multicall_list[i].args[1] = arg2;
+    multicall_list[i].args[2] = arg3;
+    nr_multicall_ents = i+1;
+}
+
+static inline void queue_multicall4(
+    unsigned long op, unsigned long arg1, unsigned long arg2,
+    unsigned long arg3, unsigned long arg4)
+{
+    int i = nr_multicall_ents;
+    multicall_list[i].op      = op;
+    multicall_list[i].args[0] = arg1;
+    multicall_list[i].args[1] = arg2;
+    multicall_list[i].args[2] = arg3;
+    multicall_list[i].args[3] = arg4;
+    nr_multicall_ents = i+1;
+}
+
+static inline void queue_multicall5(
+    unsigned long op, unsigned long arg1, unsigned long arg2,
+    unsigned long arg3, unsigned long arg4, unsigned long arg5)
+{
+    int i = nr_multicall_ents;
+    multicall_list[i].op      = op;
+    multicall_list[i].args[0] = arg1;
+    multicall_list[i].args[1] = arg2;
+    multicall_list[i].args[2] = arg3;
+    multicall_list[i].args[3] = arg4;
+    multicall_list[i].args[4] = arg5;
+    nr_multicall_ents = i+1;
+}
+
+static inline void execute_multicall_list(void)
+{
+    if ( unlikely(nr_multicall_ents == 0) ) return;
+    (void)HYPERVISOR_multicall(multicall_list, nr_multicall_ents);
+    nr_multicall_ents = 0;
+}
+
+#endif /* __MULTICALL_H__ */
diff --git a/xenolinux-2.4.22-sparse/include/asm-xeno/page.h b/xenolinux-2.4.22-sparse/include/asm-xeno/page.h
new file mode 100644 (file)
index 0000000..d15646f
--- /dev/null
@@ -0,0 +1,173 @@
+#ifndef _I386_PAGE_H
+#define _I386_PAGE_H
+
+/* PAGE_SHIFT determines the page size */
+#define PAGE_SHIFT     12
+#define PAGE_SIZE      (1UL << PAGE_SHIFT)
+#define PAGE_MASK      (~(PAGE_SIZE-1))
+
+#ifdef __KERNEL__
+#ifndef __ASSEMBLY__
+
+#include <linux/config.h>
+#include <asm/hypervisor.h>
+
+#ifdef CONFIG_X86_USE_3DNOW
+
+#include <asm/mmx.h>
+
+#define clear_page(page)       mmx_clear_page((void *)(page))
+#define copy_page(to,from)     mmx_copy_page(to,from)
+
+#else
+
+/*
+ *     On older X86 processors its not a win to use MMX here it seems.
+ *     Maybe the K6-III ?
+ */
+#define clear_page(page)       memset((void *)(page), 0, PAGE_SIZE)
+#define copy_page(to,from)     memcpy((void *)(to), (void *)(from), PAGE_SIZE)
+
+#endif
+
+#define clear_user_page(page, vaddr)   clear_page(page)
+#define copy_user_page(to, from, vaddr)        copy_page(to, from)
+
+/**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/
+extern unsigned long *phys_to_machine_mapping;
+#define pfn_to_mfn(_pfn) (phys_to_machine_mapping[(_pfn)])
+#define mfn_to_pfn(_mfn) (machine_to_phys_mapping[(_mfn)])
+static inline unsigned long phys_to_machine(unsigned long phys)
+{
+    unsigned long machine = pfn_to_mfn(phys >> PAGE_SHIFT);
+    machine = (machine << PAGE_SHIFT) | (phys & ~PAGE_MASK);
+    return machine;
+}
+static inline unsigned long machine_to_phys(unsigned long machine)
+{
+    unsigned long phys = mfn_to_pfn(machine >> PAGE_SHIFT);
+    phys = (phys << PAGE_SHIFT) | (machine & ~PAGE_MASK);
+    return phys;
+}
+
+/*
+ * These are used to make use of C type-checking..
+ */
+#if CONFIG_X86_PAE
+typedef struct { unsigned long pte_low, pte_high; } pte_t;
+typedef struct { unsigned long long pmd; } pmd_t;
+typedef struct { unsigned long long pgd; } pgd_t;
+#define pte_val(x)     ((x).pte_low | ((unsigned long long)(x).pte_high << 32))
+#else
+typedef struct { unsigned long pte_low; } pte_t;
+typedef struct { unsigned long pmd; } pmd_t;
+typedef struct { unsigned long pgd; } pgd_t;
+static inline unsigned long pte_val(pte_t x)
+{
+    unsigned long ret = x.pte_low;
+    if ( (ret & 1) ) ret = machine_to_phys(ret);
+    return ret;
+}
+#endif
+#define PTE_MASK       PAGE_MASK
+
+typedef struct { unsigned long pgprot; } pgprot_t;
+
+static inline unsigned long pmd_val(pmd_t x)
+{
+    unsigned long ret = x.pmd;
+    if ( (ret & 1) ) ret = machine_to_phys(ret);
+    return ret;
+}
+#define pgd_val(x)     ({ BUG(); (unsigned long)0; })
+#define pgprot_val(x)  ((x).pgprot)
+
+static inline pte_t __pte(unsigned long x)
+{
+    if ( (x & 1) ) x = phys_to_machine(x);
+    return ((pte_t) { (x) });
+}
+static inline pmd_t __pmd(unsigned long x)
+{
+    if ( (x & 1) ) x = phys_to_machine(x);
+    return ((pmd_t) { (x) });
+}
+#define __pgd(x) ({ BUG(); (pgprot_t) { 0 }; })
+#define __pgprot(x)    ((pgprot_t) { (x) } )
+
+#endif /* !__ASSEMBLY__ */
+
+/* to align the pointer to the (next) page boundary */
+#define PAGE_ALIGN(addr)       (((addr)+PAGE_SIZE-1)&PAGE_MASK)
+
+/*
+ * This handles the memory map.. We could make this a config
+ * option, but too many people screw it up, and too few need
+ * it.
+ *
+ * A __PAGE_OFFSET of 0xC0000000 means that the kernel has
+ * a virtual address space of one gigabyte, which limits the
+ * amount of physical memory you can use to about 950MB. 
+ *
+ * If you want more physical memory than this then see the CONFIG_HIGHMEM4G
+ * and CONFIG_HIGHMEM64G options in the kernel configuration.
+ */
+
+#define __PAGE_OFFSET          (0xC0000000)
+
+#ifndef __ASSEMBLY__
+
+/*
+ * Tell the user there is some problem. Beep too, so we can
+ * see^H^H^Hhear bugs in early bootup as well!
+ * The offending file and line are encoded after the "officially
+ * undefined" opcode for parsing in the trap handler.
+ */
+
+#if 1  /* Set to zero for a slightly smaller kernel */
+#define BUG()                          \
+ __asm__ __volatile__( "ud2\n"         \
+                       "\t.word %c0\n" \
+                       "\t.long %c1\n" \
+                        : : "i" (__LINE__), "i" (__FILE__))
+#else
+#define BUG() __asm__ __volatile__("ud2\n")
+#endif
+
+#define PAGE_BUG(page) do { \
+       BUG(); \
+} while (0)
+
+/* Pure 2^n version of get_order */
+static __inline__ int get_order(unsigned long size)
+{
+       int order;
+
+       size = (size-1) >> (PAGE_SHIFT-1);
+       order = -1;
+       do {
+               size >>= 1;
+               order++;
+       } while (size);
+       return order;
+}
+
+#endif /* __ASSEMBLY__ */
+
+#define PAGE_OFFSET            ((unsigned long)__PAGE_OFFSET)
+#define __pa(x)                        ((unsigned long)(x)-PAGE_OFFSET)
+#define __va(x)                        ((void *)((unsigned long)(x)+PAGE_OFFSET))
+#define virt_to_page(kaddr)    (mem_map + (__pa(kaddr) >> PAGE_SHIFT))
+#define VALID_PAGE(page)       ((page - mem_map) < max_mapnr)
+
+#define VM_DATA_DEFAULT_FLAGS  (VM_READ | VM_WRITE | VM_EXEC | \
+                                VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
+
+/* VIRT <-> MACHINE conversion */
+#define virt_to_machine(_a) (phys_to_machine(__pa(_a)))
+#define machine_to_virt(_m) (__va(machine_to_phys(_m)))
+
+#endif /* __KERNEL__ */
+
+#endif /* _I386_PAGE_H */
diff --git a/xenolinux-2.4.22-sparse/include/asm-xeno/pgalloc.h b/xenolinux-2.4.22-sparse/include/asm-xeno/pgalloc.h
new file mode 100644 (file)
index 0000000..9a90cb1
--- /dev/null
@@ -0,0 +1,274 @@
+#ifndef _I386_PGALLOC_H
+#define _I386_PGALLOC_H
+
+#include <linux/config.h>
+#include <asm/processor.h>
+#include <asm/fixmap.h>
+#include <asm/hypervisor.h>
+#include <linux/threads.h>
+
+/*
+ * Quick lists are aligned so that least significant bits of array pointer
+ * are all zero when list is empty, and all one when list is full.
+ */
+#define QUICKLIST_ENTRIES 256
+#define QUICKLIST_EMPTY(_l) !((unsigned long)(_l) & ((QUICKLIST_ENTRIES*4)-1))
+#define QUICKLIST_FULL(_l)  QUICKLIST_EMPTY((_l)+1)
+#define pgd_quicklist (current_cpu_data.pgd_quick)
+#define pmd_quicklist (current_cpu_data.pmd_quick)
+#define pte_quicklist (current_cpu_data.pte_quick)
+#define pgtable_cache_size (current_cpu_data.pgtable_cache_sz)
+
+#define pmd_populate(mm, pmd, pte)               \
+ do {                                             \
+  set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(pte)));   \
+  XENO_flush_page_update_queue();                 \
+ } while ( 0 )
+
+/*
+ * Allocate and free page tables.
+ */
+
+#if defined (CONFIG_X86_PAE)
+
+#error "no PAE support as yet"
+
+/*
+ * We can't include <linux/slab.h> here, thus these uglinesses.
+ */
+struct kmem_cache_s;
+
+extern struct kmem_cache_s *pae_pgd_cachep;
+extern void *kmem_cache_alloc(struct kmem_cache_s *, int);
+extern void kmem_cache_free(struct kmem_cache_s *, void *);
+
+
+static inline pgd_t *get_pgd_slow(void)
+{
+       int i;
+       pgd_t *pgd = kmem_cache_alloc(pae_pgd_cachep, GFP_KERNEL);
+
+       if (pgd) {
+               for (i = 0; i < USER_PTRS_PER_PGD; i++) {
+                       unsigned long pmd = __get_free_page(GFP_KERNEL);
+                       if (!pmd)
+                               goto out_oom;
+                       clear_page(pmd);
+                       set_pgd(pgd + i, __pgd(1 + __pa(pmd)));
+               }
+               memcpy(pgd + USER_PTRS_PER_PGD,
+                       swapper_pg_dir + USER_PTRS_PER_PGD,
+                       (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
+       }
+       return pgd;
+out_oom:
+       for (i--; i >= 0; i--)
+               free_page((unsigned long)__va(pgd_val(pgd[i])-1));
+       kmem_cache_free(pae_pgd_cachep, pgd);
+       return NULL;
+}
+
+#else
+
+static inline pgd_t *get_pgd_slow(void)
+{
+       pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL);
+
+       if (pgd) {
+               memset(pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
+               memcpy(pgd + USER_PTRS_PER_PGD,
+                       init_mm.pgd + USER_PTRS_PER_PGD,
+                       (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
+                __make_page_readonly(pgd);
+               queue_pgd_pin(__pa(pgd));
+
+       }
+       return pgd;
+}
+
+#endif /* CONFIG_X86_PAE */
+
+static inline pgd_t *get_pgd_fast(void)
+{
+       unsigned long ret;
+
+       if ( !QUICKLIST_EMPTY(pgd_quicklist) ) {
+               ret = *(--pgd_quicklist);
+               pgtable_cache_size--;
+
+       } else
+               ret = (unsigned long)get_pgd_slow();
+       return (pgd_t *)ret;
+}
+
+static inline void free_pgd_slow(pgd_t *pgd)
+{
+#if defined(CONFIG_X86_PAE)
+#error
+       int i;
+
+       for (i = 0; i < USER_PTRS_PER_PGD; i++)
+               free_page((unsigned long)__va(pgd_val(pgd[i])-1));
+       kmem_cache_free(pae_pgd_cachep, pgd);
+#else
+       queue_pgd_unpin(__pa(pgd));
+        __make_page_writeable(pgd);
+       free_page((unsigned long)pgd);
+#endif
+}
+
+static inline void free_pgd_fast(pgd_t *pgd)
+{
+        if ( !QUICKLIST_FULL(pgd_quicklist) ) {
+                *(pgd_quicklist++) = (unsigned long)pgd;
+                pgtable_cache_size++;
+        } else
+                free_pgd_slow(pgd);
+}
+
+static inline pte_t *pte_alloc_one(struct mm_struct *mm, unsigned long address)
+{
+    pte_t *pte;
+
+    pte = (pte_t *) __get_free_page(GFP_KERNEL);
+    if (pte)
+    {
+        clear_page(pte);
+        __make_page_readonly(pte);
+        queue_pte_pin(__pa(pte));
+    }
+    return pte;
+
+}
+
+static inline pte_t *pte_alloc_one_fast(struct mm_struct *mm,
+                                       unsigned long address)
+{
+    unsigned long ret = 0;
+    if ( !QUICKLIST_EMPTY(pte_quicklist) ) {
+        ret = *(--pte_quicklist);
+        pgtable_cache_size--;
+    }
+    return (pte_t *)ret;
+}
+
+static __inline__ void pte_free_slow(pte_t *pte)
+{
+    queue_pte_unpin(__pa(pte));
+    __make_page_writeable(pte);
+    free_page((unsigned long)pte);
+}
+
+static inline void pte_free_fast(pte_t *pte)
+{
+    if ( !QUICKLIST_FULL(pte_quicklist) ) {
+        *(pte_quicklist++) = (unsigned long)pte;
+        pgtable_cache_size++;
+    } else
+        pte_free_slow(pte);
+}
+
+#define pte_free(pte)          pte_free_fast(pte)
+#define pgd_free(pgd)          free_pgd_fast(pgd)
+#define pgd_alloc(mm)          get_pgd_fast()
+
+/*
+ * allocating and freeing a pmd is trivial: the 1-entry pmd is
+ * inside the pgd, so has no extra memory associated with it.
+ * (In the PAE case we free the pmds as part of the pgd.)
+ */
+
+#define pmd_alloc_one_fast(mm, addr)   ({ BUG(); ((pmd_t *)1); })
+#define pmd_alloc_one(mm, addr)                ({ BUG(); ((pmd_t *)2); })
+#define pmd_free_slow(x)               do { } while (0)
+#define pmd_free_fast(x)               do { } while (0)
+#define pmd_free(x)                    do { } while (0)
+#define pgd_populate(mm, pmd, pte)     BUG()
+
+extern int do_check_pgt_cache(int, int);
+
+/*
+ * TLB flushing:
+ *
+ *  - flush_tlb() flushes the current mm struct TLBs
+ *  - flush_tlb_all() flushes all processes TLBs
+ *  - flush_tlb_mm(mm) flushes the specified mm context TLB's
+ *  - flush_tlb_page(vma, vmaddr) flushes one page
+ *  - flush_tlb_range(mm, start, end) flushes a range of pages
+ *  - flush_tlb_pgtables(mm, start, end) flushes a range of page tables
+ *
+ * ..but the i386 has somewhat limited tlb flushing capabilities,
+ * and page-granular flushes are available only on i486 and up.
+ */
+
+#ifndef CONFIG_SMP
+
+#define flush_tlb() __flush_tlb()
+#define flush_tlb_all() __flush_tlb_all()
+#define local_flush_tlb() __flush_tlb()
+
+static inline void flush_tlb_mm(struct mm_struct *mm)
+{
+       if (mm == current->active_mm) queue_tlb_flush();
+       XENO_flush_page_update_queue();
+}
+
+static inline void flush_tlb_page(struct vm_area_struct *vma,
+       unsigned long addr)
+{
+       if (vma->vm_mm == current->active_mm) queue_invlpg(addr);
+       XENO_flush_page_update_queue();
+}
+
+static inline void flush_tlb_range(struct mm_struct *mm,
+       unsigned long start, unsigned long end)
+{
+       if (mm == current->active_mm) queue_tlb_flush();
+       XENO_flush_page_update_queue();
+}
+
+#else
+#error no guestos SMP support yet...
+#include <asm/smp.h>
+
+#define local_flush_tlb() \
+       __flush_tlb()
+
+extern void flush_tlb_all(void);
+extern void flush_tlb_current_task(void);
+extern void flush_tlb_mm(struct mm_struct *);
+extern void flush_tlb_page(struct vm_area_struct *, unsigned long);
+
+#define flush_tlb()    flush_tlb_current_task()
+
+static inline void flush_tlb_range(struct mm_struct * mm, unsigned long start, unsigned long end)
+{
+       flush_tlb_mm(mm);
+}
+
+#define TLBSTATE_OK    1
+#define TLBSTATE_LAZY  2
+
+struct tlb_state
+{
+       struct mm_struct *active_mm;
+       int state;
+} ____cacheline_aligned;
+extern struct tlb_state cpu_tlbstate[NR_CPUS];
+
+#endif /* CONFIG_SMP */
+
+static inline void flush_tlb_pgtables(struct mm_struct *mm,
+                                     unsigned long start, unsigned long end)
+{
+    /* i386 does not keep any page table caches in TLB */
+    XENO_flush_page_update_queue();
+}
+
+extern int direct_remap_area_pages(struct mm_struct *mm,
+                                   unsigned long address, 
+                                   unsigned long machine_addr,
+                                   unsigned long size, 
+                                   pgprot_t prot);
+
+#endif /* _I386_PGALLOC_H */
diff --git a/xenolinux-2.4.22-sparse/include/asm-xeno/pgtable-2level.h b/xenolinux-2.4.22-sparse/include/asm-xeno/pgtable-2level.h
new file mode 100644 (file)
index 0000000..71ef37a
--- /dev/null
@@ -0,0 +1,71 @@
+#ifndef _I386_PGTABLE_2LEVEL_H
+#define _I386_PGTABLE_2LEVEL_H
+
+/*
+ * traditional i386 two-level paging structure:
+ */
+
+#define PGDIR_SHIFT    22
+#define PTRS_PER_PGD   1024
+
+/*
+ * the i386 is two-level, so we don't really have any
+ * PMD directory physically.
+ */
+#define PMD_SHIFT      22
+#define PTRS_PER_PMD   1
+
+#define PTRS_PER_PTE   1024
+
+#define pte_ERROR(e) \
+       printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, (e).pte_low)
+#define pmd_ERROR(e) \
+       printk("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pmd_val(e))
+#define pgd_ERROR(e) \
+       printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e))
+
+/*
+ * The "pgd_xxx()" functions here are trivial for a folded two-level
+ * setup: the pgd is never bad, and a pmd always exists (as it's folded
+ * into the pgd entry)
+ */
+static inline int pgd_none(pgd_t pgd)          { return 0; }
+static inline int pgd_bad(pgd_t pgd)           { return 0; }
+static inline int pgd_present(pgd_t pgd)       { return 1; }
+#define pgd_clear(xp)                          do { } while (0)
+
+#define set_pte(pteptr, pteval) queue_l1_entry_update(__pa(pteptr), (pteval).pte_low)
+#define set_pte_atomic(pteptr, pteval) queue_l1_entry_update(__pa(pteptr), (pteval).pte_low)
+#define set_pmd(pmdptr, pmdval) queue_l2_entry_update(__pa(pmdptr), (pmdval).pmd)
+#define set_pgd(pgdptr, pgdval) ((void)0)
+
+#define pgd_page(pgd) \
+((unsigned long) __va(pgd_val(pgd) & PAGE_MASK))
+
+static inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address)
+{
+       return (pmd_t *) dir;
+}
+
+/*
+ * A note on implementation of this atomic 'get-and-clear' operation.
+ * This is actually very simple because XenoLinux can only run on a single
+ * processor. Therefore, we cannot race other processors setting the 'accessed'
+ * or 'dirty' bits on a page-table entry.
+ * Even if pages are shared between domains, that is not a problem because
+ * each domain will have separate page tables, with their own versions of
+ * accessed & dirty state.
+ */
+static inline pte_t ptep_get_and_clear(pte_t *xp)
+{
+    pte_t pte = *xp;
+    queue_l1_entry_update(__pa(xp), 0);
+    return pte;
+}
+
+#define pte_same(a, b)         ((a).pte_low == (b).pte_low)
+#define pte_page(x)            (mem_map+((unsigned long)((pte_val(x) >> PAGE_SHIFT))))
+#define pte_none(x)            (!(x).pte_low)
+#define __mk_pte(page_nr,pgprot) __pte(((page_nr) << PAGE_SHIFT) | pgprot_val(pgprot))
+
+#endif /* _I386_PGTABLE_2LEVEL_H */
diff --git a/xenolinux-2.4.22-sparse/include/asm-xeno/pgtable.h b/xenolinux-2.4.22-sparse/include/asm-xeno/pgtable.h
new file mode 100644 (file)
index 0000000..0a2482f
--- /dev/null
@@ -0,0 +1,370 @@
+#ifndef _I386_PGTABLE_H
+#define _I386_PGTABLE_H
+
+#include <linux/config.h>
+
+/*
+ * The Linux memory management assumes a three-level page table setup. On
+ * the i386, we use that, but "fold" the mid level into the top-level page
+ * table, so that we physically have the same two-level page table as the
+ * i386 mmu expects.
+ *
+ * This file contains the functions and defines necessary to modify and use
+ * the i386 page table tree.
+ */
+#ifndef __ASSEMBLY__
+#include <asm/processor.h>
+#include <asm/hypervisor.h>
+#include <linux/threads.h>
+#include <asm/fixmap.h>
+
+#ifndef _I386_BITOPS_H
+#include <asm/bitops.h>
+#endif
+
+#define swapper_pg_dir 0
+extern void paging_init(void);
+
+/* Caches aren't brain-dead on the intel. */
+#define flush_cache_all()                      do { } while (0)
+#define flush_cache_mm(mm)                     do { } while (0)
+#define flush_cache_range(mm, start, end)      do { } while (0)
+#define flush_cache_page(vma, vmaddr)          do { } while (0)
+#define flush_page_to_ram(page)                        do { } while (0)
+#define flush_dcache_page(page)                        do { } while (0)
+#define flush_icache_range(start, end)         do { } while (0)
+#define flush_icache_page(vma,pg)              do { } while (0)
+#define flush_icache_user_range(vma,pg,adr,len)        do { } while (0)
+
+extern unsigned long pgkern_mask;
+
+#define __flush_tlb() ({ queue_tlb_flush(); XENO_flush_page_update_queue(); })
+#define __flush_tlb_global() __flush_tlb()
+#define __flush_tlb_all() __flush_tlb_global()
+#define __flush_tlb_one(addr) ({ queue_invlpg(addr); XENO_flush_page_update_queue(); })
+#define __flush_tlb_single(addr) ({ queue_invlpg(addr); XENO_flush_page_update_queue(); })
+
+/*
+ * ZERO_PAGE is a global shared page that is always zero: used
+ * for zero-mapped memory areas etc..
+ */
+extern unsigned long empty_zero_page[1024];
+#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
+
+#endif /* !__ASSEMBLY__ */
+
+/*
+ * The Linux x86 paging architecture is 'compile-time dual-mode', it
+ * implements both the traditional 2-level x86 page tables and the
+ * newer 3-level PAE-mode page tables.
+ */
+#ifndef __ASSEMBLY__
+#if CONFIG_X86_PAE
+# include <asm/pgtable-3level.h>
+
+/*
+ * Need to initialise the X86 PAE caches
+ */
+extern void pgtable_cache_init(void);
+
+#else
+# include <asm/pgtable-2level.h>
+
+/*
+ * No page table caches to initialise
+ */
+#define pgtable_cache_init()   do { } while (0)
+
+#endif
+#endif
+
+#define PMD_SIZE       (1UL << PMD_SHIFT)
+#define PMD_MASK       (~(PMD_SIZE-1))
+#define PGDIR_SIZE     (1UL << PGDIR_SHIFT)
+#define PGDIR_MASK     (~(PGDIR_SIZE-1))
+
+#define USER_PTRS_PER_PGD      (TASK_SIZE/PGDIR_SIZE)
+#define FIRST_USER_PGD_NR      0
+
+#define USER_PGD_PTRS (PAGE_OFFSET >> PGDIR_SHIFT)
+#define KERNEL_PGD_PTRS (PTRS_PER_PGD-USER_PGD_PTRS)
+
+#define TWOLEVEL_PGDIR_SHIFT   22
+#define BOOT_USER_PGD_PTRS (__PAGE_OFFSET >> TWOLEVEL_PGDIR_SHIFT)
+#define BOOT_KERNEL_PGD_PTRS (1024-BOOT_USER_PGD_PTRS)
+
+
+#ifndef __ASSEMBLY__
+/* 4MB is just a nice "safety zone". Also, we align to a fresh pde. */
+#define VMALLOC_OFFSET (4*1024*1024)
+extern void * high_memory;
+#define VMALLOC_START  (((unsigned long) high_memory + 2*VMALLOC_OFFSET-1) & \
+                                               ~(VMALLOC_OFFSET-1))
+#define VMALLOC_VMADDR(x) ((unsigned long)(x))
+#define VMALLOC_END    (FIXADDR_START - 2*PAGE_SIZE)
+
+#define _PAGE_BIT_PRESENT      0
+#define _PAGE_BIT_RW           1
+#define _PAGE_BIT_USER         2
+#define _PAGE_BIT_PWT          3
+#define _PAGE_BIT_PCD          4
+#define _PAGE_BIT_ACCESSED     5
+#define _PAGE_BIT_DIRTY                6
+#define _PAGE_BIT_PSE          7       /* 4 MB (or 2MB) page, Pentium+, if present.. */
+#define _PAGE_BIT_GLOBAL       8       /* Global TLB entry PPro+ */
+#define _PAGE_BIT_IO            9
+
+#define _PAGE_PRESENT  0x001
+#define _PAGE_RW       0x002
+#define _PAGE_USER     0x004
+#define _PAGE_PWT      0x008
+#define _PAGE_PCD      0x010
+#define _PAGE_ACCESSED 0x020
+#define _PAGE_DIRTY    0x040
+#define _PAGE_PSE      0x080   /* 4 MB (or 2MB) page, Pentium+, if present.. */
+#define _PAGE_GLOBAL   0x100   /* Global TLB entry PPro+ */
+#define _PAGE_IO        0x200
+
+#define _PAGE_PROTNONE 0x080   /* If not present */
+
+#define _PAGE_TABLE    (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY)
+#define _KERNPG_TABLE  (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
+#define _PAGE_CHG_MASK (PTE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY)
+
+#define PAGE_NONE      __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED)
+#define PAGE_SHARED    __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED)
+#define PAGE_COPY      __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
+#define PAGE_READONLY  __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
+
+#define __PAGE_KERNEL \
+       (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)
+#define __PAGE_KERNEL_NOCACHE \
+       (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_PCD | _PAGE_ACCESSED)
+#define __PAGE_KERNEL_RO \
+       (_PAGE_PRESENT | _PAGE_DIRTY | _PAGE_ACCESSED)
+
+#if 0
+#define MAKE_GLOBAL(x) __pgprot((x) | _PAGE_GLOBAL)
+#else
+#define MAKE_GLOBAL(x) __pgprot(x)
+#endif
+
+#define PAGE_KERNEL MAKE_GLOBAL(__PAGE_KERNEL)
+#define PAGE_KERNEL_RO MAKE_GLOBAL(__PAGE_KERNEL_RO)
+#define PAGE_KERNEL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_NOCACHE)
+
+/*
+ * The i386 can't do page protection for execute, and considers that
+ * the same are read. Also, write permissions imply read permissions.
+ * This is the closest we can get..
+ */
+#define __P000 PAGE_NONE
+#define __P001 PAGE_READONLY
+#define __P010 PAGE_COPY
+#define __P011 PAGE_COPY
+#define __P100 PAGE_READONLY
+#define __P101 PAGE_READONLY
+#define __P110 PAGE_COPY
+#define __P111 PAGE_COPY
+
+#define __S000 PAGE_NONE
+#define __S001 PAGE_READONLY
+#define __S010 PAGE_SHARED
+#define __S011 PAGE_SHARED
+#define __S100 PAGE_READONLY
+#define __S101 PAGE_READONLY
+#define __S110 PAGE_SHARED
+#define __S111 PAGE_SHARED
+
+#define pte_present(x) ((x).pte_low & (_PAGE_PRESENT | _PAGE_PROTNONE))
+#define pte_clear(xp)  queue_l1_entry_update(__pa(xp), 0)
+
+#define pmd_none(x)    (!(x).pmd)
+#define pmd_present(x) ((x).pmd & _PAGE_PRESENT)
+#define pmd_clear(xp)  do { set_pmd(xp, __pmd(0)); } while (0)
+#define        pmd_bad(x)      (((x).pmd & (~PAGE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE)
+
+
+#define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT))
+
+/*
+ * The following only work if pte_present() is true.
+ * Undefined behaviour if not..
+ */
+static inline int pte_read(pte_t pte)          { return (pte).pte_low & _PAGE_USER; }
+static inline int pte_exec(pte_t pte)          { return (pte).pte_low & _PAGE_USER; }
+static inline int pte_dirty(pte_t pte)         { return (pte).pte_low & _PAGE_DIRTY; }
+static inline int pte_young(pte_t pte)         { return (pte).pte_low & _PAGE_ACCESSED; }
+static inline int pte_write(pte_t pte)         { return (pte).pte_low & _PAGE_RW; }
+static inline int pte_io(pte_t pte)            { return (pte).pte_low & _PAGE_IO; }
+
+static inline pte_t pte_rdprotect(pte_t pte)   { (pte).pte_low &= ~_PAGE_USER; return pte; }
+static inline pte_t pte_exprotect(pte_t pte)   { (pte).pte_low &= ~_PAGE_USER; return pte; }
+static inline pte_t pte_mkclean(pte_t pte)     { (pte).pte_low &= ~_PAGE_DIRTY; return pte; }
+static inline pte_t pte_mkold(pte_t pte)       { (pte).pte_low &= ~_PAGE_ACCESSED; return pte; }
+static inline pte_t pte_wrprotect(pte_t pte)   { (pte).pte_low &= ~_PAGE_RW; return pte; }
+static inline pte_t pte_mkread(pte_t pte)      { (pte).pte_low |= _PAGE_USER; return pte; }
+static inline pte_t pte_mkexec(pte_t pte)      { (pte).pte_low |= _PAGE_USER; return pte; }
+static inline pte_t pte_mkdirty(pte_t pte)     { (pte).pte_low |= _PAGE_DIRTY; return pte; }
+static inline pte_t pte_mkyoung(pte_t pte)     { (pte).pte_low |= _PAGE_ACCESSED; return pte; }
+static inline pte_t pte_mkwrite(pte_t pte)     { (pte).pte_low |= _PAGE_RW; return pte; }
+static inline pte_t pte_mkio(pte_t pte)                { (pte).pte_low |= _PAGE_IO; return pte; }
+
+static inline int ptep_test_and_clear_dirty(pte_t *ptep)
+{
+    unsigned long pteval = *(unsigned long *)ptep;
+    int ret = pteval & _PAGE_DIRTY;
+    if ( ret ) queue_l1_entry_update(__pa(ptep), pteval & ~_PAGE_DIRTY);
+    return ret;
+}
+static inline  int ptep_test_and_clear_young(pte_t *ptep)
+{
+    unsigned long pteval = *(unsigned long *)ptep;
+    int ret = pteval & _PAGE_ACCESSED;
+    if ( ret ) queue_l1_entry_update(__pa(ptep), pteval & ~_PAGE_ACCESSED);
+    return ret;
+}
+static inline void ptep_set_wrprotect(pte_t *ptep)
+{
+    unsigned long pteval = *(unsigned long *)ptep;
+    if ( (pteval & _PAGE_RW) )
+        queue_l1_entry_update(__pa(ptep), pteval & ~_PAGE_RW);
+}
+static inline void ptep_mkdirty(pte_t *ptep)
+{
+    unsigned long pteval = *(unsigned long *)ptep;
+    if ( !(pteval & _PAGE_DIRTY) )
+        queue_l1_entry_update(__pa(ptep), pteval | _PAGE_DIRTY);
+}
+
+/*
+ * Conversion functions: convert a page and protection to a page entry,
+ * and a page entry and page directory to the page they refer to.
+ */
+
+#define mk_pte(page, pgprot)   __mk_pte((page) - mem_map, (pgprot))
+
+/* This takes a physical page address that is used by the remapping functions */
+#define mk_pte_phys(physpage, pgprot)  __mk_pte((physpage) >> PAGE_SHIFT, pgprot)
+
+static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
+{
+       pte.pte_low &= _PAGE_CHG_MASK;
+       pte.pte_low |= pgprot_val(newprot);
+       return pte;
+}
+
+#define page_pte(page) page_pte_prot(page, __pgprot(0))
+
+#define pmd_page(pmd) \
+((unsigned long) __va(pmd_val(pmd) & PAGE_MASK))
+
+/* to find an entry in a page-table-directory. */
+#define pgd_index(address) ((address >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))
+
+#define __pgd_offset(address) pgd_index(address)
+
+#define pgd_offset(mm, address) ((mm)->pgd+pgd_index(address))
+
+/* to find an entry in a kernel page-table-directory */
+#define pgd_offset_k(address) pgd_offset(&init_mm, address)
+
+#define __pmd_offset(address) \
+               (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
+
+/* Find an entry in the third-level page table.. */
+#define __pte_offset(address) \
+               ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
+#define pte_offset(dir, address) ((pte_t *) pmd_page(*(dir)) + \
+                       __pte_offset(address))
+
+/*
+ * The i386 doesn't have any external MMU info: the kernel page
+ * tables contain all the necessary information.
+ */
+#define update_mmu_cache(vma,address,pte) do { } while (0)
+
+/* Encode and de-code a swap entry */
+#define SWP_TYPE(x)                    (((x).val >> 1) & 0x3f)
+#define SWP_OFFSET(x)                  ((x).val >> 8)
+#define SWP_ENTRY(type, offset)                ((swp_entry_t) { ((type) << 1) | ((offset) << 8) })
+#define pte_to_swp_entry(pte)          ((swp_entry_t) { (pte).pte_low })
+#define swp_entry_to_pte(x)            ((pte_t) { (x).val })
+
+struct page;
+int change_page_attr(struct page *, int, pgprot_t prot);
+
+static inline void __make_page_readonly(void *va)
+{
+    pgd_t *pgd = pgd_offset_k((unsigned long)va);
+    pmd_t *pmd = pmd_offset(pgd, (unsigned long)va);
+    pte_t *pte = pte_offset(pmd, (unsigned long)va);
+    queue_l1_entry_update(__pa(pte), (*(unsigned long *)pte)&~_PAGE_RW);
+}
+
+static inline void __make_page_writeable(void *va)
+{
+    pgd_t *pgd = pgd_offset_k((unsigned long)va);
+    pmd_t *pmd = pmd_offset(pgd, (unsigned long)va);
+    pte_t *pte = pte_offset(pmd, (unsigned long)va);
+    queue_l1_entry_update(__pa(pte), (*(unsigned long *)pte)|_PAGE_RW);
+}
+
+static inline void make_page_readonly(void *va)
+{
+    pgd_t *pgd = pgd_offset_k((unsigned long)va);
+    pmd_t *pmd = pmd_offset(pgd, (unsigned long)va);
+    pte_t *pte = pte_offset(pmd, (unsigned long)va);
+    queue_l1_entry_update(__pa(pte), (*(unsigned long *)pte)&~_PAGE_RW);
+    if ( (unsigned long)va >= VMALLOC_START )
+        __make_page_readonly(machine_to_virt(
+            *(unsigned long *)pte&PAGE_MASK));
+}
+
+static inline void make_page_writeable(void *va)
+{
+    pgd_t *pgd = pgd_offset_k((unsigned long)va);
+    pmd_t *pmd = pmd_offset(pgd, (unsigned long)va);
+    pte_t *pte = pte_offset(pmd, (unsigned long)va);
+    queue_l1_entry_update(__pa(pte), (*(unsigned long *)pte)|_PAGE_RW);
+    if ( (unsigned long)va >= VMALLOC_START )
+        __make_page_writeable(machine_to_virt(
+            *(unsigned long *)pte&PAGE_MASK));
+}
+
+static inline void make_pages_readonly(void *va, unsigned int nr)
+{
+    while ( nr-- != 0 )
+    {
+        make_page_readonly(va);
+        va = (void *)((unsigned long)va + PAGE_SIZE);
+    }
+}
+
+static inline void make_pages_writeable(void *va, unsigned int nr)
+{
+    while ( nr-- != 0 )
+    {
+        make_page_writeable(va);
+        va = (void *)((unsigned long)va + PAGE_SIZE);
+    }
+}
+
+static inline unsigned long arbitrary_virt_to_phys(void *va)
+{
+    pgd_t *pgd = pgd_offset_k((unsigned long)va);
+    pmd_t *pmd = pmd_offset(pgd, (unsigned long)va);
+    pte_t *pte = pte_offset(pmd, (unsigned long)va);
+    unsigned long pa = (*(unsigned long *)pte) & PAGE_MASK;
+    return pa | ((unsigned long)va & (PAGE_SIZE-1));
+}
+
+#endif /* !__ASSEMBLY__ */
+
+/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */
+#define PageSkip(page)         (0)
+#define kern_addr_valid(addr)  (1)
+
+#define io_remap_page_range remap_page_range
+
+#endif /* _I386_PGTABLE_H */
diff --git a/xenolinux-2.4.22-sparse/include/asm-xeno/proc_cmd.h b/xenolinux-2.4.22-sparse/include/asm-xeno/proc_cmd.h
new file mode 100644 (file)
index 0000000..6630839
--- /dev/null
@@ -0,0 +1,32 @@
+/******************************************************************************
+ * proc_cmd.h
+ * 
+ * Interface to /proc/cmd and /proc/xeno/privcmd.
+ */
+
+#ifndef __PROC_CMD_H__
+#define __PROC_CMD_H__
+
+typedef struct privcmd_hypercall
+{
+    unsigned long op;
+    unsigned long arg[5];
+} privcmd_hypercall_t;
+
+typedef struct privcmd_blkmsg
+{
+    unsigned long op;
+    void         *buf;
+    int           buf_size;
+} privcmd_blkmsg_t;
+
+#define IOCTL_PRIVCMD_HYPERCALL        \
+    _IOC(_IOC_NONE, 'P', 0, sizeof(privcmd_hypercall_t))
+#define IOCTL_PRIVCMD_BLKMSG           \
+    _IOC(_IOC_NONE, 'P', 1, sizeof(privcmd_blkmsg_t))
+#define IOCTL_PRIVCMD_LINDEV_TO_XENDEV \
+    _IOC(_IOC_NONE, 'P', 2, sizeof(unsigned short))
+#define IOCTL_PRIVCMD_XENDEV_TO_LINDEV \
+    _IOC(_IOC_NONE, 'P', 3, sizeof(unsigned short))
+
+#endif /* __PROC_CMD_H__ */
diff --git a/xenolinux-2.4.22-sparse/include/asm-xeno/processor.h b/xenolinux-2.4.22-sparse/include/asm-xeno/processor.h
new file mode 100644 (file)
index 0000000..0b4571a
--- /dev/null
@@ -0,0 +1,481 @@
+/*
+ * include/asm-i386/processor.h
+ *
+ * Copyright (C) 1994 Linus Torvalds
+ */
+
+#ifndef __ASM_I386_PROCESSOR_H
+#define __ASM_I386_PROCESSOR_H
+
+#include <asm/math_emu.h>
+#include <asm/segment.h>
+#include <asm/page.h>
+#include <asm/types.h>
+#include <asm/sigcontext.h>
+#include <asm/cpufeature.h>
+#include <linux/cache.h>
+#include <linux/config.h>
+#include <linux/threads.h>
+
+/*
+ * Default implementation of macro that returns current
+ * instruction pointer ("program counter").
+ */
+#define current_text_addr() ({ void *pc; __asm__("movl $1f,%0\n1:":"=g" (pc)); pc; })
+
+/*
+ *  CPU type and hardware bug flags. Kept separately for each CPU.
+ *  Members of this structure are referenced in head.S, so think twice
+ *  before touching them. [mj]
+ */
+
+struct cpuinfo_x86 {
+       __u8    x86;            /* CPU family */
+       __u8    x86_vendor;     /* CPU vendor */
+       __u8    x86_model;
+       __u8    x86_mask;
+       char    wp_works_ok;    /* It doesn't on 386's */
+       char    hlt_works_ok;   /* Problems on some 486Dx4's and old 386's */
+       char    hard_math;
+       char    rfu;
+               int     cpuid_level;    /* Maximum supported CPUID level, -1=no CPUID */
+       __u32   x86_capability[NCAPINTS];
+       char    x86_vendor_id[16];
+       char    x86_model_id[64];
+       int     x86_cache_size;  /* in KB - valid for CPUS which support this
+                                   call  */
+       int     fdiv_bug;
+       int     f00f_bug;
+       int     coma_bug;
+       unsigned long loops_per_jiffy;
+       unsigned long *pgd_quick;
+       unsigned long *pmd_quick;
+       unsigned long *pte_quick;
+       unsigned long pgtable_cache_sz;
+} __attribute__((__aligned__(SMP_CACHE_BYTES)));
+
+#define X86_VENDOR_INTEL 0
+#define X86_VENDOR_CYRIX 1
+#define X86_VENDOR_AMD 2
+#define X86_VENDOR_UMC 3
+#define X86_VENDOR_NEXGEN 4
+#define X86_VENDOR_CENTAUR 5
+#define X86_VENDOR_RISE 6
+#define X86_VENDOR_TRANSMETA 7
+#define X86_VENDOR_NSC 8
+#define X86_VENDOR_SIS 9
+#define X86_VENDOR_UNKNOWN 0xff
+
+/*
+ * capabilities of CPUs
+ */
+
+extern struct cpuinfo_x86 boot_cpu_data;
+extern struct tss_struct init_tss[NR_CPUS];
+
+#ifdef CONFIG_SMP
+extern struct cpuinfo_x86 cpu_data[];
+#define current_cpu_data cpu_data[smp_processor_id()]
+#else
+#define cpu_data (&boot_cpu_data)
+#define current_cpu_data boot_cpu_data
+#endif
+
+extern char ignore_irq13;
+
+extern void identify_cpu(struct cpuinfo_x86 *);
+extern void print_cpu_info(struct cpuinfo_x86 *);
+
+/*
+ * EFLAGS bits
+ */
+#define X86_EFLAGS_CF  0x00000001 /* Carry Flag */
+#define X86_EFLAGS_PF  0x00000004 /* Parity Flag */
+#define X86_EFLAGS_AF  0x00000010 /* Auxillary carry Flag */
+#define X86_EFLAGS_ZF  0x00000040 /* Zero Flag */
+#define X86_EFLAGS_SF  0x00000080 /* Sign Flag */
+#define X86_EFLAGS_TF  0x00000100 /* Trap Flag */
+#define X86_EFLAGS_IF  0x00000200 /* Interrupt Flag */
+#define X86_EFLAGS_DF  0x00000400 /* Direction Flag */
+#define X86_EFLAGS_OF  0x00000800 /* Overflow Flag */
+#define X86_EFLAGS_IOPL        0x00003000 /* IOPL mask */
+#define X86_EFLAGS_NT  0x00004000 /* Nested Task */
+#define X86_EFLAGS_RF  0x00010000 /* Resume Flag */
+#define X86_EFLAGS_VM  0x00020000 /* Virtual Mode */
+#define X86_EFLAGS_AC  0x00040000 /* Alignment Check */
+#define X86_EFLAGS_VIF 0x00080000 /* Virtual Interrupt Flag */
+#define X86_EFLAGS_VIP 0x00100000 /* Virtual Interrupt Pending */
+#define X86_EFLAGS_ID  0x00200000 /* CPUID detection flag */
+
+/*
+ * Generic CPUID function
+ */
+static inline void cpuid(int op, int *eax, int *ebx, int *ecx, int *edx)
+{
+       __asm__("cpuid"
+               : "=a" (*eax),
+                 "=b" (*ebx),
+                 "=c" (*ecx),
+                 "=d" (*edx)
+               : "0" (op));
+}
+
+/*
+ * CPUID functions returning a single datum
+ */
+static inline unsigned int cpuid_eax(unsigned int op)
+{
+       unsigned int eax;
+
+       __asm__("cpuid"
+               : "=a" (eax)
+               : "0" (op)
+               : "bx", "cx", "dx");
+       return eax;
+}
+static inline unsigned int cpuid_ebx(unsigned int op)
+{
+       unsigned int eax, ebx;
+
+       __asm__("cpuid"
+               : "=a" (eax), "=b" (ebx)
+               : "0" (op)
+               : "cx", "dx" );
+       return ebx;
+}
+static inline unsigned int cpuid_ecx(unsigned int op)
+{
+       unsigned int eax, ecx;
+
+       __asm__("cpuid"
+               : "=a" (eax), "=c" (ecx)
+               : "0" (op)
+               : "bx", "dx" );
+       return ecx;
+}
+static inline unsigned int cpuid_edx(unsigned int op)
+{
+       unsigned int eax, edx;
+
+       __asm__("cpuid"
+               : "=a" (eax), "=d" (edx)
+               : "0" (op)
+               : "bx", "cx");
+       return edx;
+}
+
+/*
+ * Intel CPU features in CR4
+ */
+#define X86_CR4_VME            0x0001  /* enable vm86 extensions */
+#define X86_CR4_PVI            0x0002  /* virtual interrupts flag enable */
+#define X86_CR4_TSD            0x0004  /* disable time stamp at ipl 3 */
+#define X86_CR4_DE             0x0008  /* enable debugging extensions */
+#define X86_CR4_PSE            0x0010  /* enable page size extensions */
+#define X86_CR4_PAE            0x0020  /* enable physical address extensions */
+#define X86_CR4_MCE            0x0040  /* Machine check enable */
+#define X86_CR4_PGE            0x0080  /* enable global pages */
+#define X86_CR4_PCE            0x0100  /* enable performance counters at ipl 3 */
+#define X86_CR4_OSFXSR         0x0200  /* enable fast FPU save and restore */
+#define X86_CR4_OSXMMEXCPT     0x0400  /* enable unmasked SSE exceptions */
+
+#define load_cr3(pgdir) \
+       asm volatile("movl %0,%%cr3": :"r" (__pa(pgdir)));
+
+extern unsigned long mmu_cr4_features;
+
+#include <asm/hypervisor.h>
+
+static inline void set_in_cr4 (unsigned long mask)
+{
+    HYPERVISOR_console_write("No set_in_cr4", 13);
+}
+
+static inline void clear_in_cr4 (unsigned long mask)
+{
+    HYPERVISOR_console_write("No clear_in_cr4", 15);
+}
+
+/*
+ *      Cyrix CPU configuration register indexes
+ */
+#define CX86_CCR0 0xc0
+#define CX86_CCR1 0xc1
+#define CX86_CCR2 0xc2
+#define CX86_CCR3 0xc3
+#define CX86_CCR4 0xe8
+#define CX86_CCR5 0xe9
+#define CX86_CCR6 0xea
+#define CX86_CCR7 0xeb
+#define CX86_DIR0 0xfe
+#define CX86_DIR1 0xff
+#define CX86_ARR_BASE 0xc4
+#define CX86_RCR_BASE 0xdc
+
+/*
+ *      Cyrix CPU indexed register access macros
+ */
+
+#define getCx86(reg) ({ outb((reg), 0x22); inb(0x23); })
+
+#define setCx86(reg, data) do { \
+       outb((reg), 0x22); \
+       outb((data), 0x23); \
+} while (0)
+
+/*
+ * Bus types (default is ISA, but people can check others with these..)
+ */
+#ifdef CONFIG_EISA
+extern int EISA_bus;
+#else
+#define EISA_bus (0)
+#endif
+extern int MCA_bus;
+
+/* from system description table in BIOS.  Mostly for MCA use, but
+others may find it useful. */
+extern unsigned int machine_id;
+extern unsigned int machine_submodel_id;
+extern unsigned int BIOS_revision;
+extern unsigned int mca_pentium_flag;
+
+/*
+ * User space process size: 3GB (default).
+ */
+#define TASK_SIZE      (PAGE_OFFSET)
+
+/* This decides where the kernel will search for a free chunk of vm
+ * space during mmap's.
+ */
+#define TASK_UNMAPPED_BASE     (TASK_SIZE / 3)
+
+/*
+ * Size of io_bitmap in longwords: 32 is ports 0-0x3ff.
+ */
+#define IO_BITMAP_SIZE 32
+#define IO_BITMAP_BYTES (IO_BITMAP_SIZE * 4)
+#define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap)
+#define INVALID_IO_BITMAP_OFFSET 0x8000
+
+struct i387_fsave_struct {
+       long    cwd;
+       long    swd;
+       long    twd;
+       long    fip;
+       long    fcs;
+       long    foo;
+       long    fos;
+       long    st_space[20];   /* 8*10 bytes for each FP-reg = 80 bytes */
+       long    status;         /* software status information */
+};
+
+struct i387_fxsave_struct {
+       unsigned short  cwd;
+       unsigned short  swd;
+       unsigned short  twd;
+       unsigned short  fop;
+       long    fip;
+       long    fcs;
+       long    foo;
+       long    fos;
+       long    mxcsr;
+       long    reserved;
+       long    st_space[32];   /* 8*16 bytes for each FP-reg = 128 bytes */
+       long    xmm_space[32];  /* 8*16 bytes for each XMM-reg = 128 bytes */
+       long    padding[56];
+} __attribute__ ((aligned (16)));
+
+struct i387_soft_struct {
+       long    cwd;
+       long    swd;
+       long    twd;
+       long    fip;
+       long    fcs;
+       long    foo;
+       long    fos;
+       long    st_space[20];   /* 8*10 bytes for each FP-reg = 80 bytes */
+       unsigned char   ftop, changed, lookahead, no_update, rm, alimit;
+       struct info     *info;
+       unsigned long   entry_eip;
+};
+
+union i387_union {
+       struct i387_fsave_struct        fsave;
+       struct i387_fxsave_struct       fxsave;
+       struct i387_soft_struct soft;
+};
+
+typedef struct {
+       unsigned long seg;
+} mm_segment_t;
+
+struct tss_struct {
+       unsigned short  back_link,__blh;
+       unsigned long   esp0;
+       unsigned short  ss0,__ss0h;
+       unsigned long   esp1;
+       unsigned short  ss1,__ss1h;
+       unsigned long   esp2;
+       unsigned short  ss2,__ss2h;
+       unsigned long   __cr3;
+       unsigned long   eip;
+       unsigned long   eflags;
+       unsigned long   eax,ecx,edx,ebx;
+       unsigned long   esp;
+       unsigned long   ebp;
+       unsigned long   esi;
+       unsigned long   edi;
+       unsigned short  es, __esh;
+       unsigned short  cs, __csh;
+       unsigned short  ss, __ssh;
+       unsigned short  ds, __dsh;
+       unsigned short  fs, __fsh;
+       unsigned short  gs, __gsh;
+       unsigned short  ldt, __ldth;
+       unsigned short  trace, bitmap;
+       unsigned long   io_bitmap[IO_BITMAP_SIZE+1];
+       /*
+        * pads the TSS to be cacheline-aligned (size is 0x100)
+        */
+       unsigned long __cacheline_filler[5];
+};
+
+struct thread_struct {
+       unsigned long   esp0;
+       unsigned long   eip;
+       unsigned long   esp;
+       unsigned long   fs;
+       unsigned long   gs;
+       unsigned int    io_pl;
+/* Hardware debugging registers */
+       unsigned long   debugreg[8];  /* %%db0-7 debug registers */
+/* fault info */
+       unsigned long   cr2, trap_no, error_code;
+/* floating point info */
+       union i387_union        i387;
+/* virtual 86 mode info */
+       struct vm86_struct      * vm86_info;
+       unsigned long           screen_bitmap;
+       unsigned long           v86flags, v86mask, saved_esp0;
+};
+
+#define INIT_THREAD  { sizeof(init_stack) + (long) &init_stack, \
+                       0, 0, 0, 0, 0, 0, {0}, 0, 0, 0, {{0}}, 0, 0, 0, 0, 0 }
+
+#define INIT_TSS  {                                            \
+       0,0, /* back_link, __blh */                             \
+       sizeof(init_stack) + (long) &init_stack, /* esp0 */     \
+       __KERNEL_DS, 0, /* ss0 */                               \
+       0,0,0,0,0,0, /* stack1, stack2 */                       \
+       0, /* cr3 */                                            \
+       0,0, /* eip,eflags */                                   \
+       0,0,0,0, /* eax,ecx,edx,ebx */                          \
+       0,0,0,0, /* esp,ebp,esi,edi */                          \
+       0,0,0,0,0,0, /* es,cs,ss */                             \
+       0,0,0,0,0,0, /* ds,fs,gs */                             \
+       0,0, /* ldt */                                          \
+       0, INVALID_IO_BITMAP_OFFSET, /* tace, bitmap */         \
+       {~0, } /* ioperm */                                     \
+}
+
+#define start_thread(regs, new_eip, new_esp) do {              \
+       __asm__("movl %0,%%fs ; movl %0,%%gs": :"r" (0));       \
+       set_fs(USER_DS);                                        \
+       regs->xds = __USER_DS;                                  \
+       regs->xes = __USER_DS;                                  \
+       regs->xss = __USER_DS;                                  \
+       regs->xcs = __USER_CS;                                  \
+       regs->eip = new_eip;                                    \
+       regs->esp = new_esp;                                    \
+} while (0)
+
+/* Forward declaration, a strange C thing */
+struct task_struct;
+struct mm_struct;
+
+/* Free all resources held by a thread. */
+extern void release_thread(struct task_struct *);
+/*
+ * create a kernel thread without removing it from tasklists
+ */
+extern int arch_kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
+
+/* Copy and release all segment info associated with a VM */
+extern void copy_segments(struct task_struct *p, struct mm_struct * mm);
+extern void release_segments(struct mm_struct * mm);
+
+/*
+ * Return saved PC of a blocked thread.
+ */
+static inline unsigned long thread_saved_pc(struct thread_struct *t)
+{
+       return ((unsigned long *)t->esp)[3];
+}
+
+unsigned long get_wchan(struct task_struct *p);
+#define KSTK_EIP(tsk)  (((unsigned long *)(4096+(unsigned long)(tsk)))[1019])
+#define KSTK_ESP(tsk)  (((unsigned long *)(4096+(unsigned long)(tsk)))[1022])
+
+#define THREAD_SIZE (2*PAGE_SIZE)
+#define alloc_task_struct() ((struct task_struct *) __get_free_pages(GFP_KERNEL,1))
+#define free_task_struct(p) free_pages((unsigned long) (p), 1)
+#define get_task_struct(tsk)      atomic_inc(&virt_to_page(tsk)->count)
+
+#define init_task      (init_task_union.task)
+#define init_stack     (init_task_union.stack)
+
+struct microcode {
+       unsigned int hdrver;
+       unsigned int rev;
+       unsigned int date;
+       unsigned int sig;
+       unsigned int cksum;
+       unsigned int ldrver;
+       unsigned int pf;
+       unsigned int reserved[5];
+       unsigned int bits[500];
+};
+
+/* '6' because it used to be for P6 only (but now covers Pentium 4 as well) */
+#define MICROCODE_IOCFREE      _IO('6',0)
+
+/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
+static inline void rep_nop(void)
+{
+       __asm__ __volatile__("rep;nop" ::: "memory");
+}
+
+#define cpu_relax()    rep_nop()
+
+/* Prefetch instructions for Pentium III and AMD Athlon */
+#if defined(CONFIG_MPENTIUMIII) || defined (CONFIG_MPENTIUM4)
+
+#define ARCH_HAS_PREFETCH
+extern inline void prefetch(const void *x)
+{
+       __asm__ __volatile__ ("prefetchnta (%0)" : : "r"(x));
+}
+
+#elif CONFIG_X86_USE_3DNOW
+
+#define ARCH_HAS_PREFETCH
+#define ARCH_HAS_PREFETCHW
+#define ARCH_HAS_SPINLOCK_PREFETCH
+
+extern inline void prefetch(const void *x)
+{
+        __asm__ __volatile__ ("prefetch (%0)" : : "r"(x));
+}
+
+extern inline void prefetchw(const void *x)
+{
+        __asm__ __volatile__ ("prefetchw (%0)" : : "r"(x));
+}
+#define spin_lock_prefetch(x)  prefetchw(x)
+
+#endif
+
+#define TF_MASK 0x100
+
+#endif /* __ASM_I386_PROCESSOR_H */
diff --git a/xenolinux-2.4.22-sparse/include/asm-xeno/ptrace.h b/xenolinux-2.4.22-sparse/include/asm-xeno/ptrace.h
new file mode 100644 (file)
index 0000000..4457ac0
--- /dev/null
@@ -0,0 +1,63 @@
+#ifndef _I386_PTRACE_H
+#define _I386_PTRACE_H
+
+#define EBX 0
+#define ECX 1
+#define EDX 2
+#define ESI 3
+#define EDI 4
+#define EBP 5
+#define EAX 6
+#define DS 7
+#define ES 8
+#define FS 9
+#define GS 10
+#define ORIG_EAX 11
+#define EIP 12
+#define CS  13
+#define EFL 14
+#define UESP 15
+#define SS   16
+#define FRAME_SIZE 17
+
+/* this struct defines the way the registers are stored on the 
+   stack during a system call. */
+
+struct pt_regs {
+       long ebx;
+       long ecx;
+       long edx;
+       long esi;
+       long edi;
+       long ebp;
+       long eax;
+       int  xds;
+       int  xes;
+       long orig_eax;
+       long eip;
+       int  xcs;
+       long eflags;
+       long esp;
+       int  xss;
+};
+
+/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */
+#define PTRACE_GETREGS            12
+#define PTRACE_SETREGS            13
+#define PTRACE_GETFPREGS          14
+#define PTRACE_SETFPREGS          15
+#define PTRACE_GETFPXREGS         18
+#define PTRACE_SETFPXREGS         19
+
+#define PTRACE_SETOPTIONS         21
+
+/* options set using PTRACE_SETOPTIONS */
+#define PTRACE_O_TRACESYSGOOD     0x00000001
+
+#ifdef __KERNEL__
+#define user_mode(regs) ((regs) && (2 & (regs)->xcs))
+#define instruction_pointer(regs) ((regs) ? (regs)->eip : NULL)
+extern void show_regs(struct pt_regs *);
+#endif
+
+#endif
diff --git a/xenolinux-2.4.22-sparse/include/asm-xeno/segment.h b/xenolinux-2.4.22-sparse/include/asm-xeno/segment.h
new file mode 100644 (file)
index 0000000..ca13028
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef _ASM_SEGMENT_H
+#define _ASM_SEGMENT_H
+
+#ifndef __ASSEMBLY__
+#include <linux/types.h>
+#endif
+#include <asm/hypervisor-ifs/hypervisor-if.h>
+
+#define __KERNEL_CS    FLAT_RING1_CS
+#define __KERNEL_DS    FLAT_RING1_DS
+
+#define __USER_CS      FLAT_RING3_CS
+#define __USER_DS      FLAT_RING3_DS
+
+#endif
diff --git a/xenolinux-2.4.22-sparse/include/asm-xeno/smp.h b/xenolinux-2.4.22-sparse/include/asm-xeno/smp.h
new file mode 100644 (file)
index 0000000..804b93c
--- /dev/null
@@ -0,0 +1,102 @@
+#ifndef __ASM_SMP_H
+#define __ASM_SMP_H
+
+/*
+ * We need the APIC definitions automatically as part of 'smp.h'
+ */
+#ifndef __ASSEMBLY__
+#include <linux/config.h>
+#include <linux/threads.h>
+#include <linux/ptrace.h>
+#endif
+
+#ifdef CONFIG_X86_LOCAL_APIC
+#ifndef __ASSEMBLY__
+#include <asm/bitops.h>
+#include <asm/mpspec.h>
+#ifdef CONFIG_X86_IO_APIC
+#include <asm/io_apic.h>
+#endif
+#include <asm/apic.h>
+#endif
+#endif
+
+#ifdef CONFIG_SMP
+#ifndef __ASSEMBLY__
+
+/*
+ * Private routines/data
+ */
+extern void smp_alloc_memory(void);
+extern unsigned long phys_cpu_present_map;
+extern unsigned long cpu_online_map;
+extern volatile unsigned long smp_invalidate_needed;
+extern int pic_mode;
+extern int smp_num_siblings;
+extern int cpu_sibling_map[];
+
+extern void smp_flush_tlb(void);
+extern void smp_message_irq(int cpl, void *dev_id, struct pt_regs *regs);
+extern void smp_send_reschedule(int cpu);
+extern void smp_invalidate_rcv(void);          /* Process an NMI */
+extern void (*mtrr_hook) (void);
+extern void zap_low_mappings (void);
+
+/*
+ * On x86 all CPUs are mapped 1:1 to the APIC space.
+ * This simplifies scheduling and IPI sending and
+ * compresses data structures.
+ */
+static inline int cpu_logical_map(int cpu)
+{
+       return cpu;
+}
+static inline int cpu_number_map(int cpu)
+{
+       return cpu;
+}
+
+/*
+ * Some lowlevel functions might want to know about
+ * the real APIC ID <-> CPU # mapping.
+ */
+#define MAX_APICID 256
+extern volatile int cpu_to_physical_apicid[NR_CPUS];
+extern volatile int physical_apicid_to_cpu[MAX_APICID];
+extern volatile int cpu_to_logical_apicid[NR_CPUS];
+extern volatile int logical_apicid_to_cpu[MAX_APICID];
+
+/*
+ * General functions that each host system must provide.
+ */
+extern void smp_boot_cpus(void);
+extern void smp_store_cpu_info(int id);                /* Store per CPU info (like the initial udelay numbers */
+
+/*
+ * This function is needed by all SMP systems. It must _always_ be valid
+ * from the initial startup. We map APIC_BASE very early in page_setup(),
+ * so this is correct in the x86 case.
+ */
+
+#define smp_processor_id() (current->processor)
+
+#endif /* !__ASSEMBLY__ */
+
+#define NO_PROC_ID             0xFF            /* No processor magic marker */
+
+/*
+ *     This magic constant controls our willingness to transfer
+ *     a process across CPUs. Such a transfer incurs misses on the L1
+ *     cache, and on a P6 or P5 with multiple L2 caches L2 hits. My
+ *     gut feeling is this will vary by board in value. For a board
+ *     with separate L2 cache it probably depends also on the RSS, and
+ *     for a board with shared L2 cache it ought to decay fast as other
+ *     processes are run.
+ */
+#define PROC_CHANGE_PENALTY    15              /* Schedule penalty */
+
+#endif
+#endif
diff --git a/xenolinux-2.4.22-sparse/include/asm-xeno/system.h b/xenolinux-2.4.22-sparse/include/asm-xeno/system.h
new file mode 100644 (file)
index 0000000..12bfe68
--- /dev/null
@@ -0,0 +1,406 @@
+#ifndef __ASM_SYSTEM_H
+#define __ASM_SYSTEM_H
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <asm/segment.h>
+#include <asm/hypervisor.h>
+#include <linux/bitops.h> /* for LOCK_PREFIX */
+
+#ifdef __KERNEL__
+
+struct task_struct;
+extern void FASTCALL(__switch_to(struct task_struct *prev, 
+                                 struct task_struct *next));
+
+#define prepare_to_switch()                                             \
+do {                                                                    \
+    struct thread_struct *__t = &current->thread;                       \
+    __asm__ __volatile__ ( "movl %%fs,%0" : "=m" (*(int *)&__t->fs) );  \
+    __asm__ __volatile__ ( "movl %%gs,%0" : "=m" (*(int *)&__t->gs) );  \
+} while (0)
+#define switch_to(prev,next,last) do {                                 \
+       asm volatile("pushl %%esi\n\t"                                  \
+                    "pushl %%edi\n\t"                                  \
+                    "pushl %%ebp\n\t"                                  \
+                    "movl %%esp,%0\n\t"        /* save ESP */          \
+                    "movl %3,%%esp\n\t"        /* restore ESP */       \
+                    "movl $1f,%1\n\t"          /* save EIP */          \
+                    "pushl %4\n\t"             /* restore EIP */       \
+                    "jmp __switch_to\n"                                \
+                    "1:\t"                                             \
+                    "popl %%ebp\n\t"                                   \
+                    "popl %%edi\n\t"                                   \
+                    "popl %%esi\n\t"                                   \
+                    :"=m" (prev->thread.esp),"=m" (prev->thread.eip),  \
+                     "=b" (last)                                       \
+                    :"m" (next->thread.esp),"m" (next->thread.eip),    \
+                     "a" (prev), "d" (next),                           \
+                     "b" (prev));                                      \
+} while (0)
+
+#define _set_base(addr,base) do { unsigned long __pr; \
+__asm__ __volatile__ ("movw %%dx,%1\n\t" \
+       "rorl $16,%%edx\n\t" \
+       "movb %%dl,%2\n\t" \
+       "movb %%dh,%3" \
+       :"=&d" (__pr) \
+       :"m" (*((addr)+2)), \
+        "m" (*((addr)+4)), \
+        "m" (*((addr)+7)), \
+         "0" (base) \
+        ); } while(0)
+
+#define _set_limit(addr,limit) do { unsigned long __lr; \
+__asm__ __volatile__ ("movw %%dx,%1\n\t" \
+       "rorl $16,%%edx\n\t" \
+       "movb %2,%%dh\n\t" \
+       "andb $0xf0,%%dh\n\t" \
+       "orb %%dh,%%dl\n\t" \
+       "movb %%dl,%2" \
+       :"=&d" (__lr) \
+       :"m" (*(addr)), \
+        "m" (*((addr)+6)), \
+        "0" (limit) \
+        ); } while(0)
+
+#define set_base(ldt,base) _set_base( ((char *)&(ldt)) , (base) )
+#define set_limit(ldt,limit) _set_limit( ((char *)&(ldt)) , ((limit)-1)>>12 )
+
+static inline unsigned long _get_base(char * addr)
+{
+       unsigned long __base;
+       __asm__("movb %3,%%dh\n\t"
+               "movb %2,%%dl\n\t"
+               "shll $16,%%edx\n\t"
+               "movw %1,%%dx"
+               :"=&d" (__base)
+               :"m" (*((addr)+2)),
+                "m" (*((addr)+4)),
+                "m" (*((addr)+7)));
+       return __base;
+}
+
+#define get_base(ldt) _get_base( ((char *)&(ldt)) )
+
+/*
+ * Load a segment. Fall back on loading the zero
+ * segment if something goes wrong..
+ */
+#define loadsegment(seg,value)                 \
+       asm volatile("\n"                       \
+               "1:\t"                          \
+               "movl %0,%%" #seg "\n"          \
+               "2:\n"                          \
+               ".section .fixup,\"ax\"\n"      \
+               "3:\t"                          \
+               "pushl $0\n\t"                  \
+               "popl %%" #seg "\n\t"           \
+               "jmp 2b\n"                      \
+               ".previous\n"                   \
+               ".section __ex_table,\"a\"\n\t" \
+               ".align 4\n\t"                  \
+               ".long 1b,3b\n"                 \
+               ".previous"                     \
+               : :"m" (*(unsigned int *)&(value)))
+
+#define clts() ((void)0)
+#define read_cr0() ({ \
+       unsigned int __dummy; \
+       __asm__( \
+               "movl %%cr0,%0\n\t" \
+               :"=r" (__dummy)); \
+       __dummy; \
+})
+#define write_cr0(x) \
+       __asm__("movl %0,%%cr0": :"r" (x));
+
+#define read_cr4() ({ \
+       unsigned int __dummy; \
+       __asm__( \
+               "movl %%cr4,%0\n\t" \
+               :"=r" (__dummy)); \
+       __dummy; \
+})
+#define write_cr4(x) \
+       __asm__("movl %0,%%cr4": :"r" (x));
+#define stts() (HYPERVISOR_fpu_taskswitch())
+
+#endif /* __KERNEL__ */
+
+#define wbinvd() \
+       __asm__ __volatile__ ("wbinvd": : :"memory");
+
+static inline unsigned long get_limit(unsigned long segment)
+{
+       unsigned long __limit;
+       __asm__("lsll %1,%0"
+               :"=r" (__limit):"r" (segment));
+       return __limit+1;
+}
+
+#define nop() __asm__ __volatile__ ("nop")
+
+#define xchg(ptr,v) ((__typeof__(*(ptr)))__xchg((unsigned long)(v),(ptr),sizeof(*(ptr))))
+
+#define tas(ptr) (xchg((ptr),1))
+
+struct __xchg_dummy { unsigned long a[100]; };
+#define __xg(x) ((struct __xchg_dummy *)(x))
+
+
+/*
+ * The semantics of XCHGCMP8B are a bit strange, this is why
+ * there is a loop and the loading of %%eax and %%edx has to
+ * be inside. This inlines well in most cases, the cached
+ * cost is around ~38 cycles. (in the future we might want
+ * to do an SIMD/3DNOW!/MMX/FPU 64-bit store here, but that
+ * might have an implicit FPU-save as a cost, so it's not
+ * clear which path to go.)
+ *
+ * chmxchg8b must be used with the lock prefix here to allow
+ * the instruction to be executed atomically, see page 3-102
+ * of the instruction set reference 24319102.pdf. We need
+ * the reader side to see the coherent 64bit value.
+ */
+static inline void __set_64bit (unsigned long long * ptr,
+               unsigned int low, unsigned int high)
+{
+       __asm__ __volatile__ (
+               "\n1:\t"
+               "movl (%0), %%eax\n\t"
+               "movl 4(%0), %%edx\n\t"
+               "lock cmpxchg8b (%0)\n\t"
+               "jnz 1b"
+               : /* no outputs */
+               :       "D"(ptr),
+                       "b"(low),
+                       "c"(high)
+               :       "ax","dx","memory");
+}
+
+static inline void __set_64bit_constant (unsigned long long *ptr,
+                                                unsigned long long value)
+{
+       __set_64bit(ptr,(unsigned int)(value), (unsigned int)((value)>>32ULL));
+}
+#define ll_low(x)      *(((unsigned int*)&(x))+0)
+#define ll_high(x)     *(((unsigned int*)&(x))+1)
+
+static inline void __set_64bit_var (unsigned long long *ptr,
+                        unsigned long long value)
+{
+       __set_64bit(ptr,ll_low(value), ll_high(value));
+}
+
+#define set_64bit(ptr,value) \
+(__builtin_constant_p(value) ? \
+ __set_64bit_constant(ptr, value) : \
+ __set_64bit_var(ptr, value) )
+
+#define _set_64bit(ptr,value) \
+(__builtin_constant_p(value) ? \
+ __set_64bit(ptr, (unsigned int)(value), (unsigned int)((value)>>32ULL) ) : \
+ __set_64bit(ptr, ll_low(value), ll_high(value)) )
+
+/*
+ * Note: no "lock" prefix even on SMP: xchg always implies lock anyway
+ * Note 2: xchg has side effect, so that attribute volatile is necessary,
+ *       but generally the primitive is invalid, *ptr is output argument. --ANK
+ */
+static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
+{
+       switch (size) {
+               case 1:
+                       __asm__ __volatile__("xchgb %b0,%1"
+                               :"=q" (x)
+                               :"m" (*__xg(ptr)), "0" (x)
+                               :"memory");
+                       break;
+               case 2:
+                       __asm__ __volatile__("xchgw %w0,%1"
+                               :"=r" (x)
+                               :"m" (*__xg(ptr)), "0" (x)
+                               :"memory");
+                       break;
+               case 4:
+                       __asm__ __volatile__("xchgl %0,%1"
+                               :"=r" (x)
+                               :"m" (*__xg(ptr)), "0" (x)
+                               :"memory");
+                       break;
+       }
+       return x;
+}
+
+/*
+ * Atomic compare and exchange.  Compare OLD with MEM, if identical,
+ * store NEW in MEM.  Return the initial value in MEM.  Success is
+ * indicated by comparing RETURN with OLD.
+ */
+
+#ifdef CONFIG_X86_CMPXCHG
+#define __HAVE_ARCH_CMPXCHG 1
+
+static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
+                                     unsigned long new, int size)
+{
+       unsigned long prev;
+       switch (size) {
+       case 1:
+               __asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2"
+                                    : "=a"(prev)
+                                    : "q"(new), "m"(*__xg(ptr)), "0"(old)
+                                    : "memory");
+               return prev;
+       case 2:
+               __asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2"
+                                    : "=a"(prev)
+                                    : "q"(new), "m"(*__xg(ptr)), "0"(old)
+                                    : "memory");
+               return prev;
+       case 4:
+               __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2"
+                                    : "=a"(prev)
+                                    : "q"(new), "m"(*__xg(ptr)), "0"(old)
+                                    : "memory");
+               return prev;
+       }
+       return old;
+}
+
+#define cmpxchg(ptr,o,n)\
+       ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\
+                                       (unsigned long)(n),sizeof(*(ptr))))
+    
+#else
+/* Compiling for a 386 proper. Is it worth implementing via cli/sti?  */
+#endif
+
+/*
+ * Force strict CPU ordering.
+ * And yes, this is required on UP too when we're talking
+ * to devices.
+ *
+ * For now, "wmb()" doesn't actually do anything, as all
+ * Intel CPU's follow what Intel calls a *Processor Order*,
+ * in which all writes are seen in the program order even
+ * outside the CPU.
+ *
+ * I expect future Intel CPU's to have a weaker ordering,
+ * but I'd also expect them to finally get their act together
+ * and add some real memory barriers if so.
+ *
+ * Some non intel clones support out of order store. wmb() ceases to be a
+ * nop for these.
+ */
+#define mb()   __asm__ __volatile__ ("lock; addl $0,0(%%esp)": : :"memory")
+#define rmb()  mb()
+
+#ifdef CONFIG_X86_OOSTORE
+#define wmb()  __asm__ __volatile__ ("lock; addl $0,0(%%esp)": : :"memory")
+#else
+#define wmb()  __asm__ __volatile__ ("": : :"memory")
+#endif
+
+#ifdef CONFIG_SMP
+#define smp_mb()       mb()
+#define smp_rmb()      rmb()
+#define smp_wmb()      wmb()
+#define set_mb(var, value) do { xchg(&var, value); } while (0)
+#else
+#define smp_mb()       barrier()
+#define smp_rmb()      barrier()
+#define smp_wmb()      barrier()
+#define set_mb(var, value) do { var = value; barrier(); } while (0)
+#endif
+
+#define set_wmb(var, value) do { var = value; wmb(); } while (0)
+
+
+#define __save_flags(x)                                                       \
+do {                                                                          \
+    (x) = test_bit(EVENTS_MASTER_ENABLE_BIT,                                  \
+                   &HYPERVISOR_shared_info->events_mask);                     \
+    barrier();                                                                \
+} while (0)
+
+#define __restore_flags(x)                                                    \
+do {                                                                          \
+    shared_info_t *_shared = HYPERVISOR_shared_info;                          \
+    if (x) set_bit(EVENTS_MASTER_ENABLE_BIT, &_shared->events_mask);          \
+    barrier();                                                                \
+    if ( unlikely(_shared->events) && (x) ) do_hypervisor_callback(NULL);     \
+} while (0)
+
+#define __cli()                                                               \
+do {                                                                          \
+    clear_bit(EVENTS_MASTER_ENABLE_BIT, &HYPERVISOR_shared_info->events_mask);\
+    barrier();                                                                \
+} while (0)
+
+#define __sti()                                                               \
+do {                                                                          \
+    shared_info_t *_shared = HYPERVISOR_shared_info;                          \
+    set_bit(EVENTS_MASTER_ENABLE_BIT, &_shared->events_mask);                 \
+    barrier();                                                                \
+    if ( unlikely(_shared->events) ) do_hypervisor_callback(NULL);            \
+} while (0)
+
+#define safe_halt()             ((void)0)
+
+#define __save_and_cli(x)      do { __save_flags(x); __cli(); } while(0);
+#define __save_and_sti(x)      do { __save_flags(x); __sti(); } while(0);
+
+#define local_irq_save(x)                                                     \
+do {                                                                          \
+    (x) = test_and_clear_bit(EVENTS_MASTER_ENABLE_BIT,                        \
+                             &HYPERVISOR_shared_info->events_mask);           \
+    barrier();                                                                \
+} while (0)
+#define local_irq_restore(x)    __restore_flags(x)
+#define local_irq_disable()     __cli()
+#define local_irq_enable()      __sti()
+
+
+#ifdef CONFIG_SMP
+#error no SMP
+extern void __global_cli(void);
+extern void __global_sti(void);
+extern unsigned long __global_save_flags(void);
+extern void __global_restore_flags(unsigned long);
+#define cli() __global_cli()
+#define sti() __global_sti()
+#define save_flags(x) ((x)=__global_save_flags())
+#define restore_flags(x) __global_restore_flags(x)
+#define save_and_cli(x) do { save_flags(x); cli(); } while(0);
+#define save_and_sti(x) do { save_flags(x); sti(); } while(0);
+
+#else
+
+#define cli() __cli()
+#define sti() __sti()
+#define save_flags(x) __save_flags(x)
+#define restore_flags(x) __restore_flags(x)
+#define save_and_cli(x) __save_and_cli(x)
+#define save_and_sti(x) __save_and_sti(x)
+
+#endif
+
+/*
+ * disable hlt during certain critical i/o operations
+ */
+#define HAVE_DISABLE_HLT
+void disable_hlt(void);
+void enable_hlt(void);
+
+extern unsigned long dmi_broken;
+extern int is_sony_vaio_laptop;
+
+#define BROKEN_ACPI_Sx         0x0001
+#define BROKEN_INIT_AFTER_S1   0x0002
+#define BROKEN_PNP_BIOS                0x0004
+
+#endif
diff --git a/xenolinux-2.4.22-sparse/include/asm-xeno/vga.h b/xenolinux-2.4.22-sparse/include/asm-xeno/vga.h
new file mode 100644 (file)
index 0000000..d0624cf
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ *     Access to VGA videoram
+ *
+ *     (c) 1998 Martin Mares <mj@ucw.cz>
+ */
+
+#ifndef _LINUX_ASM_VGA_H_
+#define _LINUX_ASM_VGA_H_
+
+#include <asm/io.h>
+
+extern unsigned char *vgacon_mmap;
+
+static unsigned long VGA_MAP_MEM(unsigned long x)
+{
+    if( vgacon_mmap == NULL )
+    {
+        /* This is our first time in this function. This whole thing
+           is a rather grim hack. We know we're going to get asked 
+           to map a 32KB region between 0xb0000 and 0xb8000 because
+           that's what VGAs are. We used the boot time permanent 
+           fixed map region, and map it to machine pages.
+        */
+        if( x != 0xb8000 )
+            panic("Argghh! VGA Console is weird. 1:%08lx\n",x);
+
+        vgacon_mmap = (unsigned char*) bt_ioremap( 0xa0000, 128*1024 );
+        return (unsigned long) (vgacon_mmap+x-0xa0000);
+    }
+    else
+    {
+        if( x != 0xc0000 && x != 0xa0000 ) /* vidmem_end or charmap fonts */
+            panic("Argghh! VGA Console is weird. 2:%08lx\n",x);  
+       return (unsigned long) (vgacon_mmap+x-0xa0000);
+    }
+    return 0;
+}
+
+static inline unsigned char vga_readb(unsigned char * x) { return (*(x)); }
+static inline void vga_writeb(unsigned char x, unsigned char *y) { *(y) = (x); }
+
+#endif
diff --git a/xenolinux-2.4.22-sparse/include/linux/blk.h b/xenolinux-2.4.22-sparse/include/linux/blk.h
new file mode 100644 (file)
index 0000000..6f5a738
--- /dev/null
@@ -0,0 +1,411 @@
+#ifndef _BLK_H
+#define _BLK_H
+
+#include <linux/blkdev.h>
+#include <linux/locks.h>
+#include <linux/config.h>
+#include <linux/spinlock.h>
+
+/*
+ * Spinlock for protecting the request queue which
+ * is mucked around with in interrupts on potentially
+ * multiple CPU's..
+ */
+extern spinlock_t io_request_lock;
+
+/*
+ * Initialization functions.
+ */
+extern int isp16_init(void);
+extern int cdu31a_init(void);
+extern int acsi_init(void);
+extern int mcd_init(void);
+extern int mcdx_init(void);
+extern int sbpcd_init(void);
+extern int aztcd_init(void);
+extern int sony535_init(void);
+extern int gscd_init(void);
+extern int cm206_init(void);
+extern int optcd_init(void);
+extern int sjcd_init(void);
+extern int cdi_init(void);
+extern int hd_init(void);
+extern int ide_init(void);
+extern int xd_init(void);
+extern int mfm_init(void);
+extern int loop_init(void);
+extern int md_init(void);
+extern int ap_init(void);
+extern int ddv_init(void);
+extern int z2_init(void);
+extern int swim3_init(void);
+extern int swimiop_init(void);
+extern int amiga_floppy_init(void);
+extern int atari_floppy_init(void);
+extern int ez_init(void);
+extern int bpcd_init(void);
+extern int ps2esdi_init(void);
+extern int jsfd_init(void);
+extern int viodasd_init(void);
+extern int viocd_init(void);
+
+#if defined(CONFIG_ARCH_S390)
+extern int dasd_init(void);
+extern int xpram_init(void);
+extern int tapeblock_init(void);
+#endif /* CONFIG_ARCH_S390 */
+
+#if defined(CONFIG_XENOLINUX_BLOCK)
+extern int xlblk_init(void);
+extern int xlseg_init(void);
+extern int xlseg_proc_init(void);
+#endif /* CONFIG_ARCH_XENO */
+
+extern void set_device_ro(kdev_t dev,int flag);
+void add_blkdev_randomness(int major);
+
+extern int floppy_init(void);
+extern int rd_doload;          /* 1 = load ramdisk, 0 = don't load */
+extern int rd_prompt;          /* 1 = prompt for ramdisk, 0 = don't prompt */
+extern int rd_image_start;     /* starting block # of image */
+
+#ifdef CONFIG_BLK_DEV_INITRD
+
+#define INITRD_MINOR 250 /* shouldn't collide with /dev/ram* too soon ... */
+
+extern unsigned long initrd_start,initrd_end;
+extern int initrd_below_start_ok; /* 1 if it is not an error if initrd_start < memory_start */
+void initrd_init(void);
+
+#endif
+
+                
+/*
+ * end_request() and friends. Must be called with the request queue spinlock
+ * acquired. All functions called within end_request() _must_be_ atomic.
+ *
+ * Several drivers define their own end_request and call
+ * end_that_request_first() and end_that_request_last()
+ * for parts of the original function. This prevents
+ * code duplication in drivers.
+ */
+
+static inline void blkdev_dequeue_request(struct request * req)
+{
+       list_del(&req->queue);
+}
+
+int end_that_request_first(struct request *req, int uptodate, char *name);
+void end_that_request_last(struct request *req);
+
+#if defined(MAJOR_NR) || defined(IDE_DRIVER)
+
+#undef DEVICE_ON
+#undef DEVICE_OFF
+
+/*
+ * Add entries as needed.
+ */
+
+#ifdef IDE_DRIVER
+
+#define DEVICE_NR(device)      (MINOR(device) >> PARTN_BITS)
+#define DEVICE_NAME "ide"
+
+#elif (MAJOR_NR == RAMDISK_MAJOR)
+
+/* ram disk */
+#define DEVICE_NAME "ramdisk"
+#define DEVICE_NR(device) (MINOR(device))
+#define DEVICE_NO_RANDOM
+
+#elif (MAJOR_NR == Z2RAM_MAJOR)
+
+/* Zorro II Ram */
+#define DEVICE_NAME "Z2RAM"
+#define DEVICE_REQUEST do_z2_request
+#define DEVICE_NR(device) (MINOR(device))
+
+#elif (MAJOR_NR == FLOPPY_MAJOR)
+
+static void floppy_off(unsigned int nr);
+
+#define DEVICE_NAME "floppy"
+#define DEVICE_INTR do_floppy
+#define DEVICE_REQUEST do_fd_request
+#define DEVICE_NR(device) ( (MINOR(device) & 3) | ((MINOR(device) & 0x80 ) >> 5 ))
+#define DEVICE_OFF(device) floppy_off(DEVICE_NR(device))
+
+#elif (MAJOR_NR == HD_MAJOR)
+
+/* Hard disk:  timeout is 6 seconds. */
+#define DEVICE_NAME "hard disk"
+#define DEVICE_INTR do_hd
+#define TIMEOUT_VALUE (6*HZ)
+#define DEVICE_REQUEST do_hd_request
+#define DEVICE_NR(device) (MINOR(device)>>6)
+
+#elif (SCSI_DISK_MAJOR(MAJOR_NR))
+
+#define DEVICE_NAME "scsidisk"
+#define TIMEOUT_VALUE (2*HZ)
+#define DEVICE_NR(device) (((MAJOR(device) & SD_MAJOR_MASK) << (8 - 4)) + (MINOR(device) >> 4))
+
+/* Kludge to use the same number for both char and block major numbers */
+#elif  (MAJOR_NR == MD_MAJOR) && defined(MD_DRIVER)
+
+#define DEVICE_NAME "Multiple devices driver"
+#define DEVICE_REQUEST do_md_request
+#define DEVICE_NR(device) (MINOR(device))
+
+#elif (MAJOR_NR == SCSI_TAPE_MAJOR)
+
+#define DEVICE_NAME "scsitape"
+#define DEVICE_INTR do_st  
+#define DEVICE_NR(device) (MINOR(device) & 0x7f)
+
+#elif (MAJOR_NR == OSST_MAJOR)
+
+#define DEVICE_NAME "onstream" 
+#define DEVICE_INTR do_osst
+#define DEVICE_NR(device) (MINOR(device) & 0x7f) 
+#define DEVICE_ON(device) 
+#define DEVICE_OFF(device) 
+
+#elif (MAJOR_NR == SCSI_CDROM_MAJOR)
+
+#define DEVICE_NAME "CD-ROM"
+#define DEVICE_NR(device) (MINOR(device))
+
+#elif (MAJOR_NR == XT_DISK_MAJOR)
+
+#define DEVICE_NAME "xt disk"
+#define DEVICE_REQUEST do_xd_request
+#define DEVICE_NR(device) (MINOR(device) >> 6)
+
+#elif (MAJOR_NR == PS2ESDI_MAJOR)
+
+#define DEVICE_NAME "PS/2 ESDI"
+#define DEVICE_REQUEST do_ps2esdi_request
+#define DEVICE_NR(device) (MINOR(device) >> 6)
+
+#elif (MAJOR_NR == CDU31A_CDROM_MAJOR)
+
+#define DEVICE_NAME "CDU31A"
+#define DEVICE_REQUEST do_cdu31a_request
+#define DEVICE_NR(device) (MINOR(device))
+
+#elif (MAJOR_NR == ACSI_MAJOR) && (defined(CONFIG_ATARI_ACSI) || defined(CONFIG_ATARI_ACSI_MODULE))
+
+#define DEVICE_NAME "ACSI"
+#define DEVICE_INTR do_acsi
+#define DEVICE_REQUEST do_acsi_request
+#define DEVICE_NR(device) (MINOR(device) >> 4)
+
+#elif (MAJOR_NR == MITSUMI_CDROM_MAJOR)
+
+#define DEVICE_NAME "Mitsumi CD-ROM"
+/* #define DEVICE_INTR do_mcd */
+#define DEVICE_REQUEST do_mcd_request
+#define DEVICE_NR(device) (MINOR(device))
+
+#elif (MAJOR_NR == MITSUMI_X_CDROM_MAJOR)
+
+#define DEVICE_NAME "Mitsumi CD-ROM"
+/* #define DEVICE_INTR do_mcdx */
+#define DEVICE_REQUEST do_mcdx_request
+#define DEVICE_NR(device) (MINOR(device))
+
+#elif (MAJOR_NR == MATSUSHITA_CDROM_MAJOR)
+
+#define DEVICE_NAME "Matsushita CD-ROM controller #1"
+#define DEVICE_REQUEST do_sbpcd_request
+#define DEVICE_NR(device) (MINOR(device))
+
+#elif (MAJOR_NR == MATSUSHITA_CDROM2_MAJOR)
+
+#define DEVICE_NAME "Matsushita CD-ROM controller #2"
+#define DEVICE_REQUEST do_sbpcd2_request
+#define DEVICE_NR(device) (MINOR(device))
+
+#elif (MAJOR_NR == MATSUSHITA_CDROM3_MAJOR)
+
+#define DEVICE_NAME "Matsushita CD-ROM controller #3"
+#define DEVICE_REQUEST do_sbpcd3_request
+#define DEVICE_NR(device) (MINOR(device))
+
+#elif (MAJOR_NR == MATSUSHITA_CDROM4_MAJOR)
+
+#define DEVICE_NAME "Matsushita CD-ROM controller #4"
+#define DEVICE_REQUEST do_sbpcd4_request
+#define DEVICE_NR(device) (MINOR(device))
+
+#elif (MAJOR_NR == AZTECH_CDROM_MAJOR)
+
+#define DEVICE_NAME "Aztech CD-ROM"
+#define DEVICE_REQUEST do_aztcd_request
+#define DEVICE_NR(device) (MINOR(device))
+
+#elif (MAJOR_NR == CDU535_CDROM_MAJOR)
+
+#define DEVICE_NAME "SONY-CDU535"
+#define DEVICE_INTR do_cdu535
+#define DEVICE_REQUEST do_cdu535_request
+#define DEVICE_NR(device) (MINOR(device))
+
+#elif (MAJOR_NR == GOLDSTAR_CDROM_MAJOR)
+
+#define DEVICE_NAME "Goldstar R420"
+#define DEVICE_REQUEST do_gscd_request
+#define DEVICE_NR(device) (MINOR(device))
+
+#elif (MAJOR_NR == CM206_CDROM_MAJOR)
+#define DEVICE_NAME "Philips/LMS CD-ROM cm206"
+#define DEVICE_REQUEST do_cm206_request
+#define DEVICE_NR(device) (MINOR(device))
+
+#elif (MAJOR_NR == OPTICS_CDROM_MAJOR)
+
+#define DEVICE_NAME "DOLPHIN 8000AT CD-ROM"
+#define DEVICE_REQUEST do_optcd_request
+#define DEVICE_NR(device) (MINOR(device))
+
+#elif (MAJOR_NR == SANYO_CDROM_MAJOR)
+
+#define DEVICE_NAME "Sanyo H94A CD-ROM"
+#define DEVICE_REQUEST do_sjcd_request
+#define DEVICE_NR(device) (MINOR(device))
+
+#elif (MAJOR_NR == APBLOCK_MAJOR)
+
+#define DEVICE_NAME "apblock"
+#define DEVICE_REQUEST ap_request
+#define DEVICE_NR(device) (MINOR(device))
+
+#elif (MAJOR_NR == DDV_MAJOR)
+
+#define DEVICE_NAME "ddv"
+#define DEVICE_REQUEST ddv_request
+#define DEVICE_NR(device) (MINOR(device)>>PARTN_BITS)
+
+#elif (MAJOR_NR == MFM_ACORN_MAJOR)
+
+#define DEVICE_NAME "mfm disk"
+#define DEVICE_INTR do_mfm
+#define DEVICE_REQUEST do_mfm_request
+#define DEVICE_NR(device) (MINOR(device) >> 6)
+
+#elif (MAJOR_NR == NBD_MAJOR)
+
+#define DEVICE_NAME "nbd"
+#define DEVICE_REQUEST do_nbd_request
+#define DEVICE_NR(device) (MINOR(device))
+
+#elif (MAJOR_NR == MDISK_MAJOR)
+
+#define DEVICE_NAME "mdisk"
+#define DEVICE_REQUEST mdisk_request
+#define DEVICE_NR(device) (MINOR(device))
+
+#elif (MAJOR_NR == DASD_MAJOR)
+
+#define DEVICE_NAME "dasd"
+#define DEVICE_REQUEST do_dasd_request
+#define DEVICE_NR(device) (MINOR(device) >> PARTN_BITS)
+
+#elif (MAJOR_NR == I2O_MAJOR)
+
+#define DEVICE_NAME "I2O block"
+#define DEVICE_REQUEST i2ob_request
+#define DEVICE_NR(device) (MINOR(device)>>4)
+
+#elif (MAJOR_NR == COMPAQ_SMART2_MAJOR)
+
+#define DEVICE_NAME "ida"
+#define TIMEOUT_VALUE (25*HZ)
+#define DEVICE_REQUEST do_ida_request
+#define DEVICE_NR(device) (MINOR(device) >> 4)
+
+#endif /* MAJOR_NR == whatever */
+
+/* provide DEVICE_xxx defaults, if not explicitly defined
+ * above in the MAJOR_NR==xxx if-elif tree */
+#ifndef DEVICE_ON
+#define DEVICE_ON(device) do {} while (0)
+#endif
+#ifndef DEVICE_OFF
+#define DEVICE_OFF(device) do {} while (0)
+#endif
+
+#if (MAJOR_NR != SCSI_TAPE_MAJOR) && (MAJOR_NR != OSST_MAJOR)
+#if !defined(IDE_DRIVER)
+
+#ifndef CURRENT
+#define CURRENT blkdev_entry_next_request(&blk_dev[MAJOR_NR].request_queue.queue_head)
+#endif
+#ifndef QUEUE_EMPTY
+#define QUEUE_EMPTY list_empty(&blk_dev[MAJOR_NR].request_queue.queue_head)
+#endif
+
+#ifndef DEVICE_NAME
+#define DEVICE_NAME "unknown"
+#endif
+
+#define CURRENT_DEV DEVICE_NR(CURRENT->rq_dev)
+
+#ifdef DEVICE_INTR
+static void (*DEVICE_INTR)(void) = NULL;
+#endif
+
+#define SET_INTR(x) (DEVICE_INTR = (x))
+
+#ifdef DEVICE_REQUEST
+static void (DEVICE_REQUEST)(request_queue_t *);
+#endif 
+  
+#ifdef DEVICE_INTR
+#define CLEAR_INTR SET_INTR(NULL)
+#else
+#define CLEAR_INTR
+#endif
+
+#define INIT_REQUEST \
+       if (QUEUE_EMPTY) {\
+               CLEAR_INTR; \
+               return; \
+       } \
+       if (MAJOR(CURRENT->rq_dev) != MAJOR_NR) \
+               panic(DEVICE_NAME ": request list destroyed"); \
+       if (CURRENT->bh) { \
+               if (!buffer_locked(CURRENT->bh)) \
+                       panic(DEVICE_NAME ": block not locked"); \
+       }
+
+#endif /* !defined(IDE_DRIVER) */
+
+
+#ifndef LOCAL_END_REQUEST      /* If we have our own end_request, we do not want to include this mess */
+
+#if ! SCSI_BLK_MAJOR(MAJOR_NR) && (MAJOR_NR != COMPAQ_SMART2_MAJOR)
+
+static inline void end_request(int uptodate) {
+       struct request *req = CURRENT;
+
+       if (end_that_request_first(req, uptodate, DEVICE_NAME))
+               return;
+
+#ifndef DEVICE_NO_RANDOM
+       add_blkdev_randomness(MAJOR(req->rq_dev));
+#endif
+       DEVICE_OFF(req->rq_dev);
+       blkdev_dequeue_request(req);
+       end_that_request_last(req);
+}
+
+#endif /* ! SCSI_BLK_MAJOR(MAJOR_NR) */
+#endif /* LOCAL_END_REQUEST */
+
+#endif /* (MAJOR_NR != SCSI_TAPE_MAJOR) */
+#endif /* defined(MAJOR_NR) || defined(IDE_DRIVER) */
+
+#endif /* _BLK_H */
diff --git a/xenolinux-2.4.22-sparse/include/linux/major.h b/xenolinux-2.4.22-sparse/include/linux/major.h
new file mode 100644 (file)
index 0000000..f311bd4
--- /dev/null
@@ -0,0 +1,206 @@
+#ifndef _LINUX_MAJOR_H
+#define _LINUX_MAJOR_H
+
+/*
+ * This file has definitions for major device numbers.
+ * For the device number assignments, see Documentation/devices.txt.
+ */
+
+/* limits */
+
+/*
+ * Important: Don't change this to 256.  Major number 255 is and must be
+ * reserved for future expansion into a larger dev_t space.
+ */
+#define MAX_CHRDEV     255
+#define MAX_BLKDEV     255
+
+#define UNNAMED_MAJOR  0
+#define MEM_MAJOR      1
+#define RAMDISK_MAJOR  1
+#define FLOPPY_MAJOR   2
+#define PTY_MASTER_MAJOR 2
+#define IDE0_MAJOR     3
+#define PTY_SLAVE_MAJOR 3
+#define HD_MAJOR       IDE0_MAJOR
+#define TTY_MAJOR      4
+#define TTYAUX_MAJOR   5
+#define LP_MAJOR       6
+#define VCS_MAJOR      7
+#define LOOP_MAJOR     7
+#define SCSI_DISK0_MAJOR 8
+#define SCSI_TAPE_MAJOR        9
+#define MD_MAJOR        9
+#define MISC_MAJOR     10
+#define SCSI_CDROM_MAJOR 11
+#define        MUX_MAJOR       11      /* PA-RISC only */
+#define QIC02_TAPE_MAJOR 12
+#define XT_DISK_MAJOR  13
+#define SOUND_MAJOR    14
+#define CDU31A_CDROM_MAJOR 15
+#define JOYSTICK_MAJOR 15
+#define GOLDSTAR_CDROM_MAJOR 16
+#define OPTICS_CDROM_MAJOR 17
+#define SANYO_CDROM_MAJOR 18
+#define CYCLADES_MAJOR  19
+#define CYCLADESAUX_MAJOR 20
+#define MITSUMI_X_CDROM_MAJOR 20
+#define MFM_ACORN_MAJOR 21     /* ARM Linux /dev/mfm */
+#define SCSI_GENERIC_MAJOR 21
+#define Z8530_MAJOR 34
+#define DIGI_MAJOR 23
+#define IDE1_MAJOR     22
+#define DIGICU_MAJOR 22
+#define MITSUMI_CDROM_MAJOR 23
+#define CDU535_CDROM_MAJOR 24
+#define STL_SERIALMAJOR 24
+#define MATSUSHITA_CDROM_MAJOR 25
+#define STL_CALLOUTMAJOR 25
+#define MATSUSHITA_CDROM2_MAJOR 26
+#define QIC117_TAPE_MAJOR 27
+#define MATSUSHITA_CDROM3_MAJOR 27
+#define MATSUSHITA_CDROM4_MAJOR 28
+#define STL_SIOMEMMAJOR 28
+#define ACSI_MAJOR     28
+#define AZTECH_CDROM_MAJOR 29
+#define GRAPHDEV_MAJOR 29      /* SparcLinux & Linux/68k /dev/fb */
+#define SHMIQ_MAJOR    85      /* Linux/mips, SGI /dev/shmiq */
+#define CM206_CDROM_MAJOR 32
+#define IDE2_MAJOR     33
+#define IDE3_MAJOR     34
+#define XPRAM_MAJOR     35      /* expanded storage on S/390 = "slow ram" */
+                                /* proposed by Peter                      */
+#define NETLINK_MAJOR  36
+#define PS2ESDI_MAJOR  36
+#define IDETAPE_MAJOR  37
+#define Z2RAM_MAJOR    37
+#define APBLOCK_MAJOR   38   /* AP1000 Block device */
+#define DDV_MAJOR       39   /* AP1000 DDV block device */
+#define NBD_MAJOR      43   /* Network block device    */
+#define RISCOM8_NORMAL_MAJOR 48
+#define DAC960_MAJOR   48      /* 48..55 */
+#define RISCOM8_CALLOUT_MAJOR 49
+#define MKISS_MAJOR    55
+#define DSP56K_MAJOR    55   /* DSP56001 processor device */
+
+#define IDE4_MAJOR     56
+#define IDE5_MAJOR     57
+
+#define LVM_BLK_MAJOR  58      /* Logical Volume Manager */
+
+#define SCSI_DISK1_MAJOR       65
+#define SCSI_DISK2_MAJOR       66
+#define SCSI_DISK3_MAJOR       67
+#define SCSI_DISK4_MAJOR       68
+#define SCSI_DISK5_MAJOR       69
+#define SCSI_DISK6_MAJOR       70
+#define SCSI_DISK7_MAJOR       71
+
+
+#define COMPAQ_SMART2_MAJOR    72
+#define COMPAQ_SMART2_MAJOR1   73
+#define COMPAQ_SMART2_MAJOR2   74
+#define COMPAQ_SMART2_MAJOR3   75
+#define COMPAQ_SMART2_MAJOR4   76
+#define COMPAQ_SMART2_MAJOR5   77
+#define COMPAQ_SMART2_MAJOR6   78
+#define COMPAQ_SMART2_MAJOR7   79
+
+#define SPECIALIX_NORMAL_MAJOR 75
+#define SPECIALIX_CALLOUT_MAJOR 76
+
+#define COMPAQ_CISS_MAJOR      104
+#define COMPAQ_CISS_MAJOR1     105
+#define COMPAQ_CISS_MAJOR2      106
+#define COMPAQ_CISS_MAJOR3      107
+#define COMPAQ_CISS_MAJOR4      108
+#define COMPAQ_CISS_MAJOR5      109
+#define COMPAQ_CISS_MAJOR6      110
+#define COMPAQ_CISS_MAJOR7      111
+
+#define ATARAID_MAJOR          114
+
+#define DASD_MAJOR      94     /* Official assignations from Peter */
+
+#define MDISK_MAJOR     95     /* Official assignations from Peter */
+
+#define I2O_MAJOR              80      /* 80->87 */
+
+#define IDE6_MAJOR     88
+#define IDE7_MAJOR     89
+#define IDE8_MAJOR     90
+#define IDE9_MAJOR     91
+
+#define UBD_MAJOR      98
+
+#define AURORA_MAJOR 79
+
+#define JSFD_MAJOR     99
+
+#define PHONE_MAJOR    100
+
+#define LVM_CHAR_MAJOR 109     /* Logical Volume Manager */
+
+#define        UMEM_MAJOR      116     /* http://www.umem.com/ Battery Backed RAM */
+
+#define        UMEM_MAJOR      116     /* http://www.umem.com/ Battery Backed RAM */
+
+/*
+ * XLVIRT supports 16 devices of <= 16 partitions each.
+ * eg. xvda == (125, 0), xvdb == (125, 16), ...
+ */
+#define XLVIRT_MAJOR    125
+
+#define RTF_MAJOR      150
+#define RAW_MAJOR      162
+
+#define USB_ACM_MAJOR          166
+#define USB_ACM_AUX_MAJOR      167
+#define USB_CHAR_MAJOR         180
+
+#define UNIX98_PTY_MASTER_MAJOR        128
+#define UNIX98_PTY_MAJOR_COUNT 8
+#define UNIX98_PTY_SLAVE_MAJOR (UNIX98_PTY_MASTER_MAJOR+UNIX98_PTY_MAJOR_COUNT)
+
+#define VXVM_MAJOR             199     /* VERITAS volume i/o driver    */
+#define VXSPEC_MAJOR           200     /* VERITAS volume config driver */
+#define VXDMP_MAJOR            201     /* VERITAS volume multipath driver */
+
+#define MSR_MAJOR              202
+#define CPUID_MAJOR            203
+
+#define OSST_MAJOR     206     /* OnStream-SCx0 SCSI tape */
+
+#define IBM_TTY3270_MAJOR       227    /* Official allocations now */
+#define IBM_FS3270_MAJOR        228
+
+/*
+ * Tests for SCSI devices.
+ */
+
+#define SCSI_DISK_MAJOR(M) ((M) == SCSI_DISK0_MAJOR || \
+  ((M) >= SCSI_DISK1_MAJOR && (M) <= SCSI_DISK7_MAJOR))
+  
+#define SCSI_BLK_MAJOR(M) \
+  (SCSI_DISK_MAJOR(M)  \
+   || (M) == SCSI_CDROM_MAJOR)
+
+static __inline__ int scsi_blk_major(int m) {
+       return SCSI_BLK_MAJOR(m);
+}
+
+/*
+ * Tests for IDE devices
+ */
+#define IDE_DISK_MAJOR(M)      ((M) == IDE0_MAJOR || (M) == IDE1_MAJOR || \
+                               (M) == IDE2_MAJOR || (M) == IDE3_MAJOR || \
+                               (M) == IDE4_MAJOR || (M) == IDE5_MAJOR || \
+                               (M) == IDE6_MAJOR || (M) == IDE7_MAJOR || \
+                               (M) == IDE8_MAJOR || (M) == IDE9_MAJOR)
+
+static __inline__ int ide_blk_major(int m)
+{
+       return IDE_DISK_MAJOR(m);
+}
+
+#endif
diff --git a/xenolinux-2.4.22-sparse/include/linux/sunrpc/debug.h b/xenolinux-2.4.22-sparse/include/linux/sunrpc/debug.h
new file mode 100644 (file)
index 0000000..67dbfb8
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * linux/include/linux/sunrpc/debug.h
+ *
+ * Debugging support for sunrpc module
+ *
+ * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de>
+ */
+
+#ifndef _LINUX_SUNRPC_DEBUG_H_
+#define _LINUX_SUNRPC_DEBUG_H_
+
+#include <linux/config.h>
+
+#include <linux/timer.h>
+#include <linux/tqueue.h>
+
+/*
+ * Enable RPC debugging/profiling.
+ */
+/*#ifdef CONFIG_SYSCTL*/
+/*#define  RPC_DEBUG*/
+/*#endif*/
+/* #define  RPC_PROFILE */
+
+/*
+ * RPC debug facilities
+ */
+#define RPCDBG_XPRT            0x0001
+#define RPCDBG_CALL            0x0002
+#define RPCDBG_DEBUG           0x0004
+#define RPCDBG_NFS             0x0008
+#define RPCDBG_AUTH            0x0010
+#define RPCDBG_PMAP            0x0020
+#define RPCDBG_SCHED           0x0040
+#define RPCDBG_SVCSOCK         0x0100
+#define RPCDBG_SVCDSP          0x0200
+#define RPCDBG_MISC            0x0400
+#define RPCDBG_ALL             0x7fff
+
+#ifdef __KERNEL__
+
+/*
+ * Debugging macros etc
+ */
+#ifdef RPC_DEBUG
+extern unsigned int            rpc_debug;
+extern unsigned int            nfs_debug;
+extern unsigned int            nfsd_debug;
+extern unsigned int            nlm_debug;
+#endif
+
+#define dprintk(args...)       dfprintk(FACILITY, ## args)
+
+#undef ifdebug
+#ifdef RPC_DEBUG                       
+# define ifdebug(fac)          if (rpc_debug & RPCDBG_##fac)
+# define dfprintk(fac, args...)        do { ifdebug(fac) printk(args); } while(0)
+# define RPC_IFDEBUG(x)                x
+#else
+# define dfprintk(fac, args...)        do ; while (0)
+# define RPC_IFDEBUG(x)
+#endif
+
+#ifdef RPC_PROFILE
+# define pprintk(args...)      printk(## args)
+#else
+# define pprintk(args...)      do ; while (0)
+#endif
+
+/*
+ * Sysctl interface for RPC debugging
+ */
+#ifdef RPC_DEBUG
+void           rpc_register_sysctl(void);
+void           rpc_unregister_sysctl(void);
+#endif
+
+#endif /* __KERNEL__ */
+
+/*
+ * Declarations for the sysctl debug interface, which allows to read or
+ * change the debug flags for rpc, nfs, nfsd, and lockd. Since the sunrpc
+ * module currently registers its sysctl table dynamically, the sysctl path
+ * for module FOO is <CTL_SUNRPC, CTL_FOODEBUG>.
+ */
+#define CTL_SUNRPC     7249    /* arbitrary and hopefully unused */
+
+enum {
+       CTL_RPCDEBUG = 1,
+       CTL_NFSDEBUG,
+       CTL_NFSDDEBUG,
+       CTL_NLMDEBUG,
+};
+
+#endif /* _LINUX_SUNRPC_DEBUG_H_ */
diff --git a/xenolinux-2.4.22-sparse/init/do_mounts.c b/xenolinux-2.4.22-sparse/init/do_mounts.c
new file mode 100644 (file)
index 0000000..47cb876
--- /dev/null
@@ -0,0 +1,1083 @@
+#define __KERNEL_SYSCALLS__
+#include <linux/config.h>
+#include <linux/slab.h>
+#include <linux/devfs_fs_kernel.h>
+#include <linux/unistd.h>
+#include <linux/ctype.h>
+#include <linux/blk.h>
+#include <linux/fd.h>
+#include <linux/tty.h>
+#include <linux/init.h>
+
+#include <linux/nfs_fs.h>
+#include <linux/nfs_fs_sb.h>
+#include <linux/nfs_mount.h>
+#include <linux/minix_fs.h>
+#include <linux/ext2_fs.h>
+#include <linux/romfs_fs.h>
+#include <linux/cramfs_fs.h>
+
+#define BUILD_CRAMDISK
+
+extern int get_filesystem_list(char * buf);
+
+extern asmlinkage long sys_mount(char *dev_name, char *dir_name, char *type,
+        unsigned long flags, void *data);
+extern asmlinkage long sys_mkdir(const char *name, int mode);
+extern asmlinkage long sys_chdir(const char *name);
+extern asmlinkage long sys_fchdir(int fd);
+extern asmlinkage long sys_chroot(const char *name);
+extern asmlinkage long sys_unlink(const char *name);
+extern asmlinkage long sys_symlink(const char *old, const char *new);
+extern asmlinkage long sys_mknod(const char *name, int mode, dev_t dev);
+extern asmlinkage long sys_umount(char *name, int flags);
+extern asmlinkage long sys_ioctl(int fd, int cmd, unsigned long arg);
+
+#ifdef CONFIG_BLK_DEV_INITRD
+unsigned int real_root_dev;    /* do_proc_dointvec cannot handle kdev_t */
+static int __initdata mount_initrd = 1;
+
+static int __init no_initrd(char *str)
+{
+       mount_initrd = 0;
+       return 1;
+}
+
+__setup("noinitrd", no_initrd);
+#else
+static int __initdata mount_initrd = 0;
+#endif
+
+int __initdata rd_doload;      /* 1 = load RAM disk, 0 = don't load */
+
+int root_mountflags = MS_RDONLY | MS_VERBOSE;
+static char root_device_name[64];
+
+/* this is initialized in init/main.c */
+kdev_t ROOT_DEV;
+
+static int do_devfs = 0;
+
+static int __init load_ramdisk(char *str)
+{
+       rd_doload = simple_strtol(str,NULL,0) & 3;
+       return 1;
+}
+__setup("load_ramdisk=", load_ramdisk);
+
+static int __init readonly(char *str)
+{
+       if (*str)
+               return 0;
+       root_mountflags |= MS_RDONLY;
+       return 1;
+}
+
+static int __init readwrite(char *str)
+{
+       if (*str)
+               return 0;
+       root_mountflags &= ~MS_RDONLY;
+       return 1;
+}
+
+__setup("ro", readonly);
+__setup("rw", readwrite);
+
+static struct dev_name_struct {
+       const char *name;
+       const int num;
+} root_dev_names[] __initdata = {
+       { "nfs",     MKDEV(NFS_MAJOR, NFS_MINOR) },
+       { "hda",     0x0300 },
+       { "hdb",     0x0340 },
+       { "loop",    0x0700 },
+       { "hdc",     0x1600 },
+       { "hdd",     0x1640 },
+       { "hde",     0x2100 },
+       { "hdf",     0x2140 },
+       { "hdg",     0x2200 },
+       { "hdh",     0x2240 },
+       { "hdi",     0x3800 },
+       { "hdj",     0x3840 },
+       { "hdk",     0x3900 },
+       { "hdl",     0x3940 },
+       { "hdm",     0x5800 },
+       { "hdn",     0x5840 },
+       { "hdo",     0x5900 },
+       { "hdp",     0x5940 },
+       { "hdq",     0x5A00 },
+       { "hdr",     0x5A40 },
+       { "hds",     0x5B00 },
+       { "hdt",     0x5B40 },
+       { "sda",     0x0800 },
+       { "sdb",     0x0810 },
+       { "sdc",     0x0820 },
+       { "sdd",     0x0830 },
+       { "sde",     0x0840 },
+       { "sdf",     0x0850 },
+       { "sdg",     0x0860 },
+       { "sdh",     0x0870 },
+       { "sdi",     0x0880 },
+       { "sdj",     0x0890 },
+       { "sdk",     0x08a0 },
+       { "sdl",     0x08b0 },
+       { "sdm",     0x08c0 },
+       { "sdn",     0x08d0 },
+       { "sdo",     0x08e0 },
+       { "sdp",     0x08f0 },
+       { "ada",     0x1c00 },
+       { "adb",     0x1c10 },
+       { "adc",     0x1c20 },
+       { "add",     0x1c30 },
+       { "ade",     0x1c40 },
+       { "fd",      0x0200 },
+       { "md",      0x0900 },       
+       { "xda",     0x0d00 },
+       { "xdb",     0x0d40 },
+       { "ram",     0x0100 },
+       { "scd",     0x0b00 },
+       { "mcd",     0x1700 },
+       { "cdu535",  0x1800 },
+       { "sonycd",  0x1800 },
+       { "aztcd",   0x1d00 },
+       { "cm206cd", 0x2000 },
+       { "gscd",    0x1000 },
+       { "sbpcd",   0x1900 },
+       { "eda",     0x2400 },
+       { "edb",     0x2440 },
+       { "pda",        0x2d00 },
+       { "pdb",        0x2d10 },
+       { "pdc",        0x2d20 },
+       { "pdd",        0x2d30 },
+       { "pcd",        0x2e00 },
+       { "pf",         0x2f00 },
+       { "apblock", APBLOCK_MAJOR << 8},
+       { "ddv", DDV_MAJOR << 8},
+       { "jsfd",    JSFD_MAJOR << 8},
+#if defined(CONFIG_ARCH_S390)
+       { "dasda", (DASD_MAJOR << MINORBITS) },
+       { "dasdb", (DASD_MAJOR << MINORBITS) + (1 << 2) },
+       { "dasdc", (DASD_MAJOR << MINORBITS) + (2 << 2) },
+       { "dasdd", (DASD_MAJOR << MINORBITS) + (3 << 2) },
+       { "dasde", (DASD_MAJOR << MINORBITS) + (4 << 2) },
+       { "dasdf", (DASD_MAJOR << MINORBITS) + (5 << 2) },
+       { "dasdg", (DASD_MAJOR << MINORBITS) + (6 << 2) },
+       { "dasdh", (DASD_MAJOR << MINORBITS) + (7 << 2) },
+#endif
+       { "ida/c0d0p",0x4800 },
+       { "ida/c0d1p",0x4810 },
+       { "ida/c0d2p",0x4820 },
+       { "ida/c0d3p",0x4830 },
+       { "ida/c0d4p",0x4840 },
+       { "ida/c0d5p",0x4850 },
+       { "ida/c0d6p",0x4860 },
+       { "ida/c0d7p",0x4870 },
+       { "ida/c0d8p",0x4880 },
+       { "ida/c0d9p",0x4890 },
+       { "ida/c0d10p",0x48A0 },
+       { "ida/c0d11p",0x48B0 },
+       { "ida/c0d12p",0x48C0 },
+       { "ida/c0d13p",0x48D0 },
+       { "ida/c0d14p",0x48E0 },
+       { "ida/c0d15p",0x48F0 },
+       { "ida/c1d0p",0x4900 },
+       { "ida/c2d0p",0x4A00 },
+       { "ida/c3d0p",0x4B00 },
+       { "ida/c4d0p",0x4C00 },
+       { "ida/c5d0p",0x4D00 },
+       { "ida/c6d0p",0x4E00 },
+       { "ida/c7d0p",0x4F00 }, 
+       { "cciss/c0d0p",0x6800 },
+       { "cciss/c0d1p",0x6810 },
+       { "cciss/c0d2p",0x6820 },
+       { "cciss/c0d3p",0x6830 },
+       { "cciss/c0d4p",0x6840 },
+       { "cciss/c0d5p",0x6850 },
+       { "cciss/c0d6p",0x6860 },
+       { "cciss/c0d7p",0x6870 },
+       { "cciss/c0d8p",0x6880 },
+       { "cciss/c0d9p",0x6890 },
+       { "cciss/c0d10p",0x68A0 },
+       { "cciss/c0d11p",0x68B0 },
+       { "cciss/c0d12p",0x68C0 },
+       { "cciss/c0d13p",0x68D0 },
+       { "cciss/c0d14p",0x68E0 },
+       { "cciss/c0d15p",0x68F0 },
+       { "cciss/c1d0p",0x6900 },
+       { "cciss/c2d0p",0x6A00 },
+       { "cciss/c3d0p",0x6B00 },
+       { "cciss/c4d0p",0x6C00 },
+       { "cciss/c5d0p",0x6D00 },
+       { "cciss/c6d0p",0x6E00 },
+       { "cciss/c7d0p",0x6F00 },
+       { "ataraid/d0p",0x7200 },
+       { "ataraid/d1p",0x7210 },
+       { "ataraid/d2p",0x7220 },
+       { "ataraid/d3p",0x7230 },
+       { "ataraid/d4p",0x7240 },
+       { "ataraid/d5p",0x7250 },
+       { "ataraid/d6p",0x7260 },
+       { "ataraid/d7p",0x7270 },
+       { "ataraid/d8p",0x7280 },
+       { "ataraid/d9p",0x7290 },
+       { "ataraid/d10p",0x72A0 },
+       { "ataraid/d11p",0x72B0 },
+       { "ataraid/d12p",0x72C0 },
+       { "ataraid/d13p",0x72D0 },
+       { "ataraid/d14p",0x72E0 },
+       { "ataraid/d15p",0x72F0 },
+        { "rd/c0d0p",0x3000 },
+        { "rd/c0d0p1",0x3001 },
+        { "rd/c0d0p2",0x3002 },
+        { "rd/c0d0p3",0x3003 },
+        { "rd/c0d0p4",0x3004 },
+        { "rd/c0d0p5",0x3005 },
+        { "rd/c0d0p6",0x3006 },
+        { "rd/c0d0p7",0x3007 },
+        { "rd/c0d0p8",0x3008 },
+        { "rd/c0d1p",0x3008 },
+        { "rd/c0d1p1",0x3009 },
+        { "rd/c0d1p2",0x300a },
+        { "rd/c0d1p3",0x300b },
+        { "rd/c0d1p4",0x300c },
+        { "rd/c0d1p5",0x300d },
+        { "rd/c0d1p6",0x300e },
+        { "rd/c0d1p7",0x300f },
+        { "rd/c0d1p8",0x3010 },
+       { "nftla", 0x5d00 },
+       { "nftlb", 0x5d10 },
+       { "nftlc", 0x5d20 },
+       { "nftld", 0x5d30 },
+       { "ftla", 0x2c00 },
+       { "ftlb", 0x2c08 },
+       { "ftlc", 0x2c10 },
+       { "ftld", 0x2c18 },
+       { "mtdblock", 0x1f00 },
+       { "nb", 0x2b00 },
+#if defined(CONFIG_XENOLINUX_BLOCK)
+        { "xvda", 0x7D00 }, { "xvdb", 0x7D10 },
+        { "xvdc", 0x7D20 }, { "xvdd", 0x7D30 },
+        { "xvde", 0x7D40 }, { "xvdf", 0x7D50 },
+        { "xvdg", 0x7D60 }, { "xvdh", 0x7D70 },
+        { "xvdi", 0x7D80 }, { "xvdj", 0x7D90 },
+        { "xvdk", 0x7DA0 }, { "xvdl", 0x7DB0 },
+        { "xvdm", 0x7DC0 }, { "xvdn", 0x7DD0 },
+        { "xvdo", 0x7DE0 }, { "xvdp", 0x7DF0 },
+#endif
+       { NULL, 0 }
+};
+
+kdev_t __init name_to_kdev_t(char *line)
+{
+       int base = 0, offs;
+       char *end;
+
+       if (strncmp(line,"/dev/",5) == 0) {
+               struct dev_name_struct *dev = root_dev_names;
+               line += 5;
+               do {
+                       int len = strlen(dev->name);
+                       if (strncmp(line,dev->name,len) == 0) {
+                               line += len;
+                               base = dev->num;
+                               break;
+                       }
+                       dev++;
+               } while (dev->name);
+       }
+       offs = simple_strtoul(line, &end, base?10:16);
+       if (*end)
+               offs = 0;
+       return to_kdev_t(base + offs);
+}
+
+static int __init root_dev_setup(char *line)
+{
+       int i;
+       char ch;
+
+       ROOT_DEV = name_to_kdev_t(line);
+       memset (root_device_name, 0, sizeof root_device_name);
+       if (strncmp (line, "/dev/", 5) == 0) line += 5;
+       for (i = 0; i < sizeof root_device_name - 1; ++i)
+       {
+           ch = line[i];
+           if ( isspace (ch) || (ch == ',') || (ch == '\0') ) break;
+           root_device_name[i] = ch;
+       }
+       return 1;
+}
+
+__setup("root=", root_dev_setup);
+
+static char * __initdata root_mount_data;
+static int __init root_data_setup(char *str)
+{
+       root_mount_data = str;
+       return 1;
+}
+
+static char * __initdata root_fs_names;
+static int __init fs_names_setup(char *str)
+{
+       root_fs_names = str;
+       return 1;
+}
+
+__setup("rootflags=", root_data_setup);
+__setup("rootfstype=", fs_names_setup);
+
+static void __init get_fs_names(char *page)
+{
+       char *s = page;
+
+       if (root_fs_names) {
+               strcpy(page, root_fs_names);
+               while (*s++) {
+                       if (s[-1] == ',')
+                               s[-1] = '\0';
+               }
+       } else {
+               int len = get_filesystem_list(page);
+               char *p, *next;
+
+               page[len] = '\0';
+               for (p = page-1; p; p = next) {
+                       next = strchr(++p, '\n');
+                       if (*p++ != '\t')
+                               continue;
+                       while ((*s++ = *p++) != '\n')
+                               ;
+                       s[-1] = '\0';
+               }
+       }
+       *s = '\0';
+}
+static void __init mount_block_root(char *name, int flags)
+{
+       char *fs_names = __getname();
+       char *p;
+
+       get_fs_names(fs_names);
+retry:
+       for (p = fs_names; *p; p += strlen(p)+1) {
+               int err = sys_mount(name, "/root", p, flags, root_mount_data);
+               switch (err) {
+                       case 0:
+                               goto out;
+                       case -EACCES:
+                               flags |= MS_RDONLY;
+                               goto retry;
+                       case -EINVAL:
+                               continue;
+               }
+               /*
+                * Allow the user to distinguish between failed open
+                * and bad superblock on root device.
+                */
+               printk ("VFS: Cannot open root device \"%s\" or %s\n",
+                       root_device_name, kdevname (ROOT_DEV));
+               printk ("Please append a correct \"root=\" boot option\n");
+               panic("VFS: Unable to mount root fs on %s",
+                       kdevname(ROOT_DEV));
+       }
+       panic("VFS: Unable to mount root fs on %s", kdevname(ROOT_DEV));
+out:
+       putname(fs_names);
+       sys_chdir("/root");
+       ROOT_DEV = current->fs->pwdmnt->mnt_sb->s_dev;
+       printk("VFS: Mounted root (%s filesystem)%s.\n",
+               current->fs->pwdmnt->mnt_sb->s_type->name,
+               (current->fs->pwdmnt->mnt_sb->s_flags & MS_RDONLY) ? " readonly" : "");
+}
+#ifdef CONFIG_ROOT_NFS
+static int __init mount_nfs_root(void)
+{
+       void *data = nfs_root_data();
+
+       if (data && sys_mount("/dev/root","/root","nfs",root_mountflags,data) == 0)
+               return 1;
+       return 0;
+}
+#endif
+
+static int __init create_dev(char *name, kdev_t dev, char *devfs_name)
+{
+       void *handle;
+       char path[64];
+       int n;
+
+       sys_unlink(name);
+       if (!do_devfs)
+               return sys_mknod(name, S_IFBLK|0600, kdev_t_to_nr(dev));
+
+       handle = devfs_find_handle(NULL, dev ? NULL : devfs_name,
+                               MAJOR(dev), MINOR(dev), DEVFS_SPECIAL_BLK, 1);
+       if (!handle)
+               return -1;
+       n = devfs_generate_path(handle, path + 5, sizeof (path) - 5);
+       if (n < 0)
+               return -1;
+       return sys_symlink(path + n + 5, name);
+}
+
+#if defined(CONFIG_BLK_DEV_RAM) || defined(CONFIG_BLK_DEV_FD)
+static void __init change_floppy(char *fmt, ...)
+{
+       struct termios termios;
+       char buf[80];
+       char c;
+       int fd;
+       va_list args;
+       va_start(args, fmt);
+       vsprintf(buf, fmt, args);
+       va_end(args);
+       fd = open("/dev/root", O_RDWR | O_NDELAY, 0);
+       if (fd >= 0) {
+               sys_ioctl(fd, FDEJECT, 0);
+               close(fd);
+       }
+       printk(KERN_NOTICE "VFS: Insert %s and press ENTER\n", buf);
+       fd = open("/dev/console", O_RDWR, 0);
+       if (fd >= 0) {
+               sys_ioctl(fd, TCGETS, (long)&termios);
+               termios.c_lflag &= ~ICANON;
+               sys_ioctl(fd, TCSETSF, (long)&termios);
+               read(fd, &c, 1);
+               termios.c_lflag |= ICANON;
+               sys_ioctl(fd, TCSETSF, (long)&termios);
+               close(fd);
+       }
+}
+#endif
+
+#ifdef CONFIG_BLK_DEV_RAM
+
+int __initdata rd_prompt = 1;  /* 1 = prompt for RAM disk, 0 = don't prompt */
+
+static int __init prompt_ramdisk(char *str)
+{
+       rd_prompt = simple_strtol(str,NULL,0) & 1;
+       return 1;
+}
+__setup("prompt_ramdisk=", prompt_ramdisk);
+
+int __initdata rd_image_start;         /* starting block # of image */
+
+static int __init ramdisk_start_setup(char *str)
+{
+       rd_image_start = simple_strtol(str,NULL,0);
+       return 1;
+}
+__setup("ramdisk_start=", ramdisk_start_setup);
+
+static int __init crd_load(int in_fd, int out_fd);
+
+/*
+ * This routine tries to find a RAM disk image to load, and returns the
+ * number of blocks to read for a non-compressed image, 0 if the image
+ * is a compressed image, and -1 if an image with the right magic
+ * numbers could not be found.
+ *
+ * We currently check for the following magic numbers:
+ *     minix
+ *     ext2
+ *     romfs
+ *     cramfs
+ *     gzip
+ */
+static int __init 
+identify_ramdisk_image(int fd, int start_block)
+{
+       const int size = 512;
+       struct minix_super_block *minixsb;
+       struct ext2_super_block *ext2sb;
+       struct romfs_super_block *romfsb;
+       struct cramfs_super *cramfsb;
+       int nblocks = -1;
+       unsigned char *buf;
+
+       buf = kmalloc(size, GFP_KERNEL);
+       if (buf == 0)
+               return -1;
+
+       minixsb = (struct minix_super_block *) buf;
+       ext2sb = (struct ext2_super_block *) buf;
+       romfsb = (struct romfs_super_block *) buf;
+       cramfsb = (struct cramfs_super *) buf;
+       memset(buf, 0xe5, size);
+
+       /*
+        * Read block 0 to test for gzipped kernel
+        */
+       lseek(fd, start_block * BLOCK_SIZE, 0);
+       read(fd, buf, size);
+
+       /*
+        * If it matches the gzip magic numbers, return -1
+        */
+       if (buf[0] == 037 && ((buf[1] == 0213) || (buf[1] == 0236))) {
+               printk(KERN_NOTICE
+                      "RAMDISK: Compressed image found at block %d\n",
+                      start_block);
+               nblocks = 0;
+               goto done;
+       }
+
+       /* romfs is at block zero too */
+       if (romfsb->word0 == ROMSB_WORD0 &&
+           romfsb->word1 == ROMSB_WORD1) {
+               printk(KERN_NOTICE
+                      "RAMDISK: romfs filesystem found at block %d\n",
+                      start_block);
+               nblocks = (ntohl(romfsb->size)+BLOCK_SIZE-1)>>BLOCK_SIZE_BITS;
+               goto done;
+       }
+
+       if (cramfsb->magic == CRAMFS_MAGIC) {
+               printk(KERN_NOTICE
+                      "RAMDISK: cramfs filesystem found at block %d\n",
+                      start_block);
+               nblocks = (cramfsb->size + BLOCK_SIZE - 1) >> BLOCK_SIZE_BITS;
+               goto done;
+       }
+
+       /*
+        * Read block 1 to test for minix and ext2 superblock
+        */
+       lseek(fd, (start_block+1) * BLOCK_SIZE, 0);
+       read(fd, buf, size);
+
+       /* Try minix */
+       if (minixsb->s_magic == MINIX_SUPER_MAGIC ||
+           minixsb->s_magic == MINIX_SUPER_MAGIC2) {
+               printk(KERN_NOTICE
+                      "RAMDISK: Minix filesystem found at block %d\n",
+                      start_block);
+               nblocks = minixsb->s_nzones << minixsb->s_log_zone_size;
+               goto done;
+       }
+
+       /* Try ext2 */
+       if (ext2sb->s_magic == cpu_to_le16(EXT2_SUPER_MAGIC)) {
+               printk(KERN_NOTICE
+                      "RAMDISK: ext2 filesystem found at block %d\n",
+                      start_block);
+               nblocks = le32_to_cpu(ext2sb->s_blocks_count);
+               goto done;
+       }
+
+       printk(KERN_NOTICE
+              "RAMDISK: Couldn't find valid RAM disk image starting at %d.\n",
+              start_block);
+       
+done:
+       lseek(fd, start_block * BLOCK_SIZE, 0);
+       kfree(buf);
+       return nblocks;
+}
+#endif
+
+static int __init rd_load_image(char *from)
+{
+       int res = 0;
+
+#ifdef CONFIG_BLK_DEV_RAM
+       int in_fd, out_fd;
+       unsigned long rd_blocks, devblocks;
+       int nblocks, i;
+       char *buf;
+       unsigned short rotate = 0;
+#if !defined(CONFIG_ARCH_S390) && !defined(CONFIG_PPC_ISERIES)
+       char rotator[4] = { '|' , '/' , '-' , '\\' };
+#endif
+
+       out_fd = open("/dev/ram", O_RDWR, 0);
+       if (out_fd < 0)
+               goto out;
+
+       in_fd = open(from, O_RDONLY, 0);
+       if (in_fd < 0)
+               goto noclose_input;
+
+       nblocks = identify_ramdisk_image(in_fd, rd_image_start);
+       if (nblocks < 0)
+               goto done;
+
+       if (nblocks == 0) {
+#ifdef BUILD_CRAMDISK
+               if (crd_load(in_fd, out_fd) == 0)
+                       goto successful_load;
+#else
+               printk(KERN_NOTICE
+                      "RAMDISK: Kernel does not support compressed "
+                      "RAM disk images\n");
+#endif
+               goto done;
+       }
+
+       /*
+        * NOTE NOTE: nblocks suppose that the blocksize is BLOCK_SIZE, so
+        * rd_load_image will work only with filesystem BLOCK_SIZE wide!
+        * So make sure to use 1k blocksize while generating ext2fs
+        * ramdisk-images.
+        */
+       if (sys_ioctl(out_fd, BLKGETSIZE, (unsigned long)&rd_blocks) < 0)
+               rd_blocks = 0;
+       else
+               rd_blocks >>= 1;
+
+       if (nblocks > rd_blocks) {
+               printk("RAMDISK: image too big! (%d/%lu blocks)\n",
+                      nblocks, rd_blocks);
+               goto done;
+       }
+               
+       /*
+        * OK, time to copy in the data
+        */
+       buf = kmalloc(BLOCK_SIZE, GFP_KERNEL);
+       if (buf == 0) {
+               printk(KERN_ERR "RAMDISK: could not allocate buffer\n");
+               goto done;
+       }
+
+       if (sys_ioctl(in_fd, BLKGETSIZE, (unsigned long)&devblocks) < 0)
+               devblocks = 0;
+       else
+               devblocks >>= 1;
+
+       if (strcmp(from, "/dev/initrd") == 0)
+               devblocks = nblocks;
+
+       if (devblocks == 0) {
+               printk(KERN_ERR "RAMDISK: could not determine device size\n");
+               goto done;
+       }
+
+       printk(KERN_NOTICE "RAMDISK: Loading %d blocks [%ld disk%s] into ram disk... ", 
+               nblocks, ((nblocks-1)/devblocks)+1, nblocks>devblocks ? "s" : "");
+       for (i=0; i < nblocks; i++) {
+               if (i && (i % devblocks == 0)) {
+                       printk("done disk #%ld.\n", i/devblocks);
+                       rotate = 0;
+                       if (close(in_fd)) {
+                               printk("Error closing the disk.\n");
+                               goto noclose_input;
+                       }
+                       change_floppy("disk #%d", i/devblocks+1);
+                       in_fd = open(from, O_RDONLY, 0);
+                       if (in_fd < 0)  {
+                               printk("Error opening disk.\n");
+                               goto noclose_input;
+                       }
+                       printk("Loading disk #%ld... ", i/devblocks+1);
+               }
+               read(in_fd, buf, BLOCK_SIZE);
+               write(out_fd, buf, BLOCK_SIZE);
+#if !defined(CONFIG_ARCH_S390) && !defined(CONFIG_PPC_ISERIES)
+               if (!(i % 16)) {
+                       printk("%c\b", rotator[rotate & 0x3]);
+                       rotate++;
+               }
+#endif
+       }
+       printk("done.\n");
+       kfree(buf);
+
+successful_load:
+       res = 1;
+done:
+       close(in_fd);
+noclose_input:
+       close(out_fd);
+out:
+       sys_unlink("/dev/ram");
+#endif
+       return res;
+}
+
+static int __init rd_load_disk(int n)
+{
+#ifdef CONFIG_BLK_DEV_RAM
+       if (rd_prompt)
+               change_floppy("root floppy disk to be loaded into RAM disk");
+       create_dev("/dev/ram", MKDEV(RAMDISK_MAJOR, n), NULL);
+#endif
+       return rd_load_image("/dev/root");
+}
+
+#ifdef CONFIG_DEVFS_FS
+
+static void __init convert_name(char *prefix, char *name, char *p, int part)
+{
+       int host, bus, target, lun;
+       char dest[64];
+       char src[64];
+       char *base = p - 1;
+
+       /*  Decode "c#b#t#u#"  */
+       if (*p++ != 'c')
+               return;
+       host = simple_strtol(p, &p, 10);
+       if (*p++ != 'b')
+               return;
+       bus = simple_strtol(p, &p, 10);
+       if (*p++ != 't')
+               return;
+       target = simple_strtol(p, &p, 10);
+       if (*p++ != 'u')
+               return;
+       lun = simple_strtol(p, &p, 10);
+       if (!part)
+               sprintf(dest, "%s/host%d/bus%d/target%d/lun%d",
+                               prefix, host, bus, target, lun);
+       else if (*p++ == 'p')
+               sprintf(dest, "%s/host%d/bus%d/target%d/lun%d/part%s",
+                               prefix, host, bus, target, lun, p);
+       else
+               sprintf(dest, "%s/host%d/bus%d/target%d/lun%d/disc",
+                               prefix, host, bus, target, lun);
+       *base = '\0';
+       sprintf(src, "/dev/%s", name);
+       sys_mkdir(src, 0755);
+       *base = '/';
+       sprintf(src, "/dev/%s", name);
+       sys_symlink(dest, src);
+}
+
+static void __init devfs_make_root(char *name)
+{
+
+       if (!strncmp(name, "sd/", 3))
+               convert_name("../scsi", name, name+3, 1);
+       else if (!strncmp(name, "sr/", 3))
+               convert_name("../scsi", name, name+3, 0);
+       else if (!strncmp(name, "ide/hd/", 7))
+               convert_name("..", name, name + 7, 1);
+       else if (!strncmp(name, "ide/cd/", 7))
+               convert_name("..", name, name + 7, 0);
+}
+#else
+static void __init devfs_make_root(char *name)
+{
+}
+#endif
+
+static void __init mount_root(void)
+{
+#ifdef CONFIG_ROOT_NFS
+       if (MAJOR(ROOT_DEV) == NFS_MAJOR
+           && MINOR(ROOT_DEV) == NFS_MINOR) {
+               if (mount_nfs_root()) {
+                       sys_chdir("/root");
+                       ROOT_DEV = current->fs->pwdmnt->mnt_sb->s_dev;
+                       printk("VFS: Mounted root (nfs filesystem).\n");
+                       return;
+               }
+               printk(KERN_ERR "VFS: Unable to mount root fs via NFS, trying floppy.\n");
+               ROOT_DEV = MKDEV(FLOPPY_MAJOR, 0);
+       }
+#endif
+printk("root_device_name = %s\n",root_device_name);
+       devfs_make_root(root_device_name);
+       create_dev("/dev/root", ROOT_DEV, root_device_name);
+#ifdef CONFIG_BLK_DEV_FD
+       if (MAJOR(ROOT_DEV) == FLOPPY_MAJOR) {
+               /* rd_doload is 2 for a dual initrd/ramload setup */
+               if (rd_doload==2) {
+                       if (rd_load_disk(1)) {
+                               ROOT_DEV = MKDEV(RAMDISK_MAJOR, 1);
+                               create_dev("/dev/root", ROOT_DEV, NULL);
+                       }
+               } else
+                       change_floppy("root floppy");
+       }
+#endif
+       mount_block_root("/dev/root", root_mountflags);
+}
+
+#ifdef CONFIG_BLK_DEV_INITRD
+static int old_fd, root_fd;
+static int do_linuxrc(void * shell)
+{
+       static char *argv[] = { "linuxrc", NULL, };
+       extern char * envp_init[];
+
+       close(old_fd);
+       close(root_fd);
+       close(0);
+       close(1);
+       close(2);
+       setsid();
+       (void) open("/dev/console",O_RDWR,0);
+       (void) dup(0);
+       (void) dup(0);
+       return execve(shell, argv, envp_init);
+}
+
+#endif
+
+static void __init handle_initrd(void)
+{
+#ifdef CONFIG_BLK_DEV_INITRD
+       int ram0 = kdev_t_to_nr(MKDEV(RAMDISK_MAJOR,0));
+       int error;
+       int i, pid;
+
+       create_dev("/dev/root.old", ram0, NULL);
+       /* mount initrd on rootfs' /root */
+       mount_block_root("/dev/root.old", root_mountflags & ~MS_RDONLY);
+       sys_mkdir("/old", 0700);
+       root_fd = open("/", 0, 0);
+       old_fd = open("/old", 0, 0);
+       /* move initrd over / and chdir/chroot in initrd root */
+       sys_chdir("/root");
+       sys_mount(".", "/", NULL, MS_MOVE, NULL);
+       sys_chroot(".");
+       mount_devfs_fs ();
+
+       pid = kernel_thread(do_linuxrc, "/linuxrc", SIGCHLD);
+       if (pid > 0) {
+               while (pid != wait(&i))
+                       yield();
+       }
+
+       /* move initrd to rootfs' /old */
+       sys_fchdir(old_fd);
+       sys_mount("/", ".", NULL, MS_MOVE, NULL);
+       /* switch root and cwd back to / of rootfs */
+       sys_fchdir(root_fd);
+       sys_chroot(".");
+       sys_umount("/old/dev", 0);
+       close(old_fd);
+       close(root_fd);
+
+       if (real_root_dev == ram0) {
+               sys_chdir("/old");
+               return;
+       }
+
+       ROOT_DEV = real_root_dev;
+       mount_root();
+
+       printk(KERN_NOTICE "Trying to move old root to /initrd ... ");
+       error = sys_mount("/old", "/root/initrd", NULL, MS_MOVE, NULL);
+       if (!error)
+               printk("okay\n");
+       else {
+               int fd = open("/dev/root.old", O_RDWR, 0);
+               printk("failed\n");
+               printk(KERN_NOTICE "Unmounting old root\n");
+               sys_umount("/old", MNT_DETACH);
+               printk(KERN_NOTICE "Trying to free ramdisk memory ... ");
+               if (fd < 0) {
+                       error = fd;
+               } else {
+                       error = sys_ioctl(fd, BLKFLSBUF, 0);
+                       close(fd);
+               }
+               printk(!error ? "okay\n" : "failed\n");
+       }
+#endif
+}
+
+static int __init initrd_load(void)
+{
+#ifdef CONFIG_BLK_DEV_INITRD
+       create_dev("/dev/ram", MKDEV(RAMDISK_MAJOR, 0), NULL);
+       create_dev("/dev/initrd", MKDEV(RAMDISK_MAJOR, INITRD_MINOR), NULL);
+#endif
+       return rd_load_image("/dev/initrd");
+}
+
+/*
+ * Prepare the namespace - decide what/where to mount, load ramdisks, etc.
+ */
+void prepare_namespace(void)
+{
+       int is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;
+#ifdef CONFIG_ALL_PPC
+       extern void arch_discover_root(void);
+       arch_discover_root();
+#endif /* CONFIG_ALL_PPC */
+#ifdef CONFIG_BLK_DEV_INITRD
+       if (!initrd_start)
+               mount_initrd = 0;
+       real_root_dev = ROOT_DEV;
+#endif
+       sys_mkdir("/dev", 0700);
+       sys_mkdir("/root", 0700);
+       sys_mknod("/dev/console", S_IFCHR|0600, MKDEV(TTYAUX_MAJOR, 1));
+#ifdef CONFIG_DEVFS_FS
+       sys_mount("devfs", "/dev", "devfs", 0, NULL);
+       do_devfs = 1;
+#endif
+
+       create_dev("/dev/root", ROOT_DEV, NULL);
+       if (mount_initrd) {
+               if (initrd_load() && ROOT_DEV != MKDEV(RAMDISK_MAJOR, 0)) {
+                       handle_initrd();
+                       goto out;
+               }
+       } else if (is_floppy && rd_doload && rd_load_disk(0))
+               ROOT_DEV = MKDEV(RAMDISK_MAJOR, 0);
+       mount_root();
+out:
+       sys_umount("/dev", 0);
+       sys_mount(".", "/", NULL, MS_MOVE, NULL);
+       sys_chroot(".");
+       mount_devfs_fs ();
+}
+
+#ifdef CONFIG_BLK_DEV_RAM
+
+#if defined(BUILD_CRAMDISK) && defined(CONFIG_BLK_DEV_RAM)
+
+/*
+ * gzip declarations
+ */
+
+#define OF(args)  args
+
+#ifndef memzero
+#define memzero(s, n)     memset ((s), 0, (n))
+#endif
+
+typedef unsigned char  uch;
+typedef unsigned short ush;
+typedef unsigned long  ulg;
+
+#define INBUFSIZ 4096
+#define WSIZE 0x8000    /* window size--must be a power of two, and */
+                       /*  at least 32K for zip's deflate method */
+
+static uch *inbuf;
+static uch *window;
+
+static unsigned insize;  /* valid bytes in inbuf */
+static unsigned inptr;   /* index of next byte to be processed in inbuf */
+static unsigned outcnt;  /* bytes in output buffer */
+static int exit_code;
+static long bytes_out;
+static int crd_infd, crd_outfd;
+
+#define get_byte()  (inptr < insize ? inbuf[inptr++] : fill_inbuf())
+               
+/* Diagnostic functions (stubbed out) */
+#define Assert(cond,msg)
+#define Trace(x)
+#define Tracev(x)
+#define Tracevv(x)
+#define Tracec(c,x)
+#define Tracecv(c,x)
+
+#define STATIC static
+
+static int  fill_inbuf(void);
+static void flush_window(void);
+static void *malloc(int size);
+static void free(void *where);
+static void error(char *m);
+static void gzip_mark(void **);
+static void gzip_release(void **);
+
+#include "../lib/inflate.c"
+
+static void __init *malloc(int size)
+{
+       return kmalloc(size, GFP_KERNEL);
+}
+
+static void __init free(void *where)
+{
+       kfree(where);
+}
+
+static void __init gzip_mark(void **ptr)
+{
+}
+
+static void __init gzip_release(void **ptr)
+{
+}
+
+
+/* ===========================================================================
+ * Fill the input buffer. This is called only when the buffer is empty
+ * and at least one byte is really needed.
+ */
+static int __init fill_inbuf(void)
+{
+       if (exit_code) return -1;
+       
+       insize = read(crd_infd, inbuf, INBUFSIZ);
+       if (insize == 0) return -1;
+
+       inptr = 1;
+
+       return inbuf[0];
+}
+
+/* ===========================================================================
+ * Write the output window window[0..outcnt-1] and update crc and bytes_out.
+ * (Used for the decompressed data only.)
+ */
+static void __init flush_window(void)
+{
+    ulg c = crc;         /* temporary variable */
+    unsigned n;
+    uch *in, ch;
+    
+    write(crd_outfd, window, outcnt);
+    in = window;
+    for (n = 0; n < outcnt; n++) {
+           ch = *in++;
+           c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
+    }
+    crc = c;
+    bytes_out += (ulg)outcnt;
+    outcnt = 0;
+}
+
+static void __init error(char *x)
+{
+       printk(KERN_ERR "%s", x);
+       exit_code = 1;
+}
+
+static int __init crd_load(int in_fd, int out_fd)
+{
+       int result;
+
+       insize = 0;             /* valid bytes in inbuf */
+       inptr = 0;              /* index of next byte to be processed in inbuf */
+       outcnt = 0;             /* bytes in output buffer */
+       exit_code = 0;
+       bytes_out = 0;
+       crc = (ulg)0xffffffffL; /* shift register contents */
+
+       crd_infd = in_fd;
+       crd_outfd = out_fd;
+       inbuf = kmalloc(INBUFSIZ, GFP_KERNEL);
+       if (inbuf == 0) {
+               printk(KERN_ERR "RAMDISK: Couldn't allocate gzip buffer\n");
+               return -1;
+       }
+       window = kmalloc(WSIZE, GFP_KERNEL);
+       if (window == 0) {
+               printk(KERN_ERR "RAMDISK: Couldn't allocate gzip window\n");
+               kfree(inbuf);
+               return -1;
+       }
+       makecrc();
+       result = gunzip();
+       kfree(inbuf);
+       kfree(window);
+       return result;
+}
+
+#endif  /* BUILD_CRAMDISK && CONFIG_BLK_DEV_RAM */
+#endif  /* CONFIG_BLK_DEV_RAM */
diff --git a/xenolinux-2.4.22-sparse/kernel/panic.c b/xenolinux-2.4.22-sparse/kernel/panic.c
new file mode 100644 (file)
index 0000000..90a782e
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+ *  linux/kernel/panic.c
+ *
+ *  Copyright (C) 1991, 1992  Linus Torvalds
+ */
+
+/*
+ * This function is used through-out the kernel (including mm and fs)
+ * to indicate a major problem.
+ */
+#include <linux/config.h>
+#include <linux/sched.h>
+#include <linux/delay.h>
+#include <linux/reboot.h>
+#include <linux/notifier.h>
+#include <linux/init.h>
+#include <linux/sysrq.h>
+#include <linux/interrupt.h>
+
+asmlinkage void sys_sync(void);        /* it's really int */
+
+int panic_timeout;
+
+struct notifier_block *panic_notifier_list;
+
+static int __init panic_setup(char *str)
+{
+       panic_timeout = simple_strtoul(str, NULL, 0);
+       return 1;
+}
+
+__setup("panic=", panic_setup);
+
+/**
+ *     panic - halt the system
+ *     @fmt: The text string to print
+ *
+ *     Display a message, then perform cleanups. Functions in the panic
+ *     notifier list are called after the filesystem cache is flushed (when possible).
+ *
+ *     This function never returns.
+ */
+NORET_TYPE void panic(const char * fmt, ...)
+{
+       static char buf[1024];
+       va_list args;
+#if defined(CONFIG_ARCH_S390)
+        unsigned long caller = (unsigned long) __builtin_return_address(0);
+#endif
+
+       bust_spinlocks(1);
+       va_start(args, fmt);
+       vsprintf(buf, fmt, args);
+       va_end(args);
+       printk(KERN_EMERG "Kernel panic: %s\n",buf);
+       if (in_interrupt())
+               printk(KERN_EMERG "In interrupt handler - not syncing\n");
+       else if (!current->pid)
+               printk(KERN_EMERG "In idle task - not syncing\n");
+       else
+               sys_sync();
+       bust_spinlocks(0);
+
+#ifdef CONFIG_SMP
+       smp_send_stop();
+#endif
+
+       notifier_call_chain(&panic_notifier_list, 0, NULL);
+
+       if (panic_timeout > 0)
+       {
+               /*
+                * Delay timeout seconds before rebooting the machine. 
+                * We can't use the "normal" timers since we just panicked..
+                */
+               printk(KERN_EMERG "Rebooting in %d seconds..",panic_timeout);
+               mdelay(panic_timeout*1000);
+               /*
+                *      Should we run the reboot notifier. For the moment Im
+                *      choosing not too. It might crash, be corrupt or do
+                *      more harm than good for other reasons.
+                */
+               machine_restart(NULL);
+       }
+#ifdef __sparc__
+       {
+               extern int stop_a_enabled;
+               /* Make sure the user can actually press L1-A */
+               stop_a_enabled = 1;
+               printk("Press L1-A to return to the boot prom\n");
+       }
+#endif
+#if defined(CONFIG_ARCH_S390)
+        disabled_wait(caller);
+#endif
+       sti();
+       for(;;) {
+#if defined(CONFIG_X86) && defined(CONFIG_VT) 
+               extern void panic_blink(void);
+               panic_blink(); 
+#endif
+               CHECK_EMERGENCY_SYNC
+#if defined(CONFIG_XENO)
+                HYPERVISOR_exit();
+#endif
+       }
+}
+
+/**
+ *     print_tainted - return a string to represent the kernel taint state.
+ *
+ *     The string is overwritten by the next call to print_taint().
+ */
+const char *print_tainted()
+{
+       static char buf[20];
+       if (tainted) {
+               snprintf(buf, sizeof(buf), "Tainted: %c%c",
+                       tainted & 1 ? 'P' : 'G',
+                       tainted & 2 ? 'F' : ' ');
+       }
+       else
+               snprintf(buf, sizeof(buf), "Not tainted");
+       return(buf);
+}
+
+int tainted = 0;
+
+/*
+ * A BUG() call in an inline function in a header should be avoided,
+ * because it can seriously bloat the kernel.  So here we have
+ * helper functions.
+ * We lose the BUG()-time file-and-line info this way, but it's
+ * usually not very useful from an inline anyway.  The backtrace
+ * tells us what we want to know.
+ */
+
+void __out_of_line_bug(int line)
+{
+       printk("kernel BUG in header file at line %d\n", line);
+
+       BUG();
+
+       /* Satisfy __attribute__((noreturn)) */
+       for ( ; ; )
+               ;
+}
diff --git a/xenolinux-2.4.22-sparse/kernel/printk.c b/xenolinux-2.4.22-sparse/kernel/printk.c
new file mode 100644 (file)
index 0000000..a46602c
--- /dev/null
@@ -0,0 +1,698 @@
+/*
+ *  linux/kernel/printk.c
+ *
+ *  Copyright (C) 1991, 1992  Linus Torvalds
+ *
+ * Modified to make sys_syslog() more flexible: added commands to
+ * return the last 4k of kernel messages, regardless of whether
+ * they've been read or not.  Added option to suppress kernel printk's
+ * to the console.  Added hook for sending the console messages
+ * elsewhere, in preparation for a serial line console (someday).
+ * Ted Ts'o, 2/11/93.
+ * Modified for sysctl support, 1/8/97, Chris Horn.
+ * Fixed SMP synchronization, 08/08/99, Manfred Spraul 
+ *     manfreds@colorfullife.com
+ * Rewrote bits to get rid of console_lock
+ *     01Mar01 Andrew Morton <andrewm@uow.edu.au>
+ */
+
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/tty.h>
+#include <linux/tty_driver.h>
+#include <linux/smp_lock.h>
+#include <linux/console.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/interrupt.h>                   /* For in_interrupt() */
+#include <linux/config.h>
+
+#include <asm/uaccess.h>
+
+#if defined(CONFIG_MULTIQUAD) || defined(CONFIG_IA64)
+#define LOG_BUF_LEN    (65536)
+#elif defined(CONFIG_ARCH_S390)
+#define LOG_BUF_LEN    (131072)
+#elif defined(CONFIG_SMP)
+#define LOG_BUF_LEN    (32768)
+#else  
+#define LOG_BUF_LEN    (16384)                 /* This must be a power of two */
+#endif
+
+#define LOG_BUF_MASK   (LOG_BUF_LEN-1)
+
+#ifndef arch_consoles_callable
+#define arch_consoles_callable() (1)
+#endif
+
+/* printk's without a loglevel use this.. */
+#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */
+
+/* We show everything that is MORE important than this.. */
+#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
+#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */
+
+DECLARE_WAIT_QUEUE_HEAD(log_wait);
+
+int console_printk[4] = {
+       DEFAULT_CONSOLE_LOGLEVEL,       /* console_loglevel */
+       DEFAULT_MESSAGE_LOGLEVEL,       /* default_message_loglevel */
+       MINIMUM_CONSOLE_LOGLEVEL,       /* minimum_console_loglevel */
+       DEFAULT_CONSOLE_LOGLEVEL,       /* default_console_loglevel */
+};
+
+int oops_in_progress;
+
+/*
+ * console_sem protects the console_drivers list, and also
+ * provides serialisation for access to the entire console
+ * driver system.
+ */
+static DECLARE_MUTEX(console_sem);
+struct console *console_drivers;
+
+/*
+ * logbuf_lock protects log_buf, log_start, log_end, con_start and logged_chars
+ * It is also used in interesting ways to provide interlocking in
+ * release_console_sem().
+ */
+static spinlock_t logbuf_lock = SPIN_LOCK_UNLOCKED;
+
+static char log_buf[LOG_BUF_LEN];
+#define LOG_BUF(idx) (log_buf[(idx) & LOG_BUF_MASK])
+
+/*
+ * The indices into log_buf are not constrained to LOG_BUF_LEN - they
+ * must be masked before subscripting
+ */
+static unsigned long log_start;                        /* Index into log_buf: next char to be read by syslog() */
+static unsigned long con_start;                        /* Index into log_buf: next char to be sent to consoles */
+static unsigned long log_end;                  /* Index into log_buf: most-recently-written-char + 1 */
+static unsigned long logged_chars;             /* Number of chars produced since last read+clear operation */
+
+struct console_cmdline console_cmdline[MAX_CMDLINECONSOLES];
+static int preferred_console = -1;
+
+/* Flag: console code may call schedule() */
+static int console_may_schedule;
+
+/*
+ *     Setup a list of consoles. Called from init/main.c
+ */
+static int __init console_setup(char *str)
+{
+       struct console_cmdline *c;
+       char name[sizeof(c->name)];
+       char *s, *options;
+       int i, idx;
+
+       /*
+        *      Decode str into name, index, options.
+        */
+       if (str[0] >= '0' && str[0] <= '9') {
+               strcpy(name, "ttyS");
+               strncpy(name + 4, str, sizeof(name) - 5);
+       } else
+               strncpy(name, str, sizeof(name) - 1);
+       name[sizeof(name) - 1] = 0;
+       if ((options = strchr(str, ',')) != NULL)
+               *(options++) = 0;
+#ifdef __sparc__
+       if (!strcmp(str, "ttya"))
+               strcpy(name, "ttyS0");
+       if (!strcmp(str, "ttyb"))
+               strcpy(name, "ttyS1");
+#endif
+       for(s = name; *s; s++)
+               if (*s >= '0' && *s <= '9')
+                       break;
+       idx = simple_strtoul(s, NULL, 10);
+       *s = 0;
+
+       /*
+        *      See if this tty is not yet registered, and
+        *      if we have a slot free.
+        */
+       for(i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
+               if (strcmp(console_cmdline[i].name, name) == 0 &&
+                         console_cmdline[i].index == idx) {
+                               preferred_console = i;
+                               return 1;
+               }
+       if (i == MAX_CMDLINECONSOLES)
+               return 1;
+       preferred_console = i;
+       c = &console_cmdline[i];
+       memcpy(c->name, name, sizeof(c->name));
+       c->options = options;
+       c->index = idx;
+       return 1;
+}
+
+__setup("console=", console_setup);
+
+/*
+ * Commands to do_syslog:
+ *
+ *     0 -- Close the log.  Currently a NOP.
+ *     1 -- Open the log. Currently a NOP.
+ *     2 -- Read from the log.
+ *     3 -- Read all messages remaining in the ring buffer.
+ *     4 -- Read and clear all messages remaining in the ring buffer
+ *     5 -- Clear ring buffer.
+ *     6 -- Disable printk's to console
+ *     7 -- Enable printk's to console
+ *     8 -- Set level of messages printed to console
+ *     9 -- Return number of unread characters in the log buffer
+ */
+int do_syslog(int type, char * buf, int len)
+{
+       unsigned long i, j, limit, count;
+       int do_clear = 0;
+       char c;
+       int error = 0;
+
+       switch (type) {
+       case 0:         /* Close log */
+               break;
+       case 1:         /* Open log */
+               break;
+       case 2:         /* Read from log */
+               error = -EINVAL;
+               if (!buf || len < 0)
+                       goto out;
+               error = 0;
+               if (!len)
+                       goto out;
+               error = verify_area(VERIFY_WRITE,buf,len);
+               if (error)
+                       goto out;
+               error = wait_event_interruptible(log_wait, (log_start - log_end));
+               if (error)
+                       goto out;
+               i = 0;
+               spin_lock_irq(&logbuf_lock);
+               while ((log_start != log_end) && i < len) {
+                       c = LOG_BUF(log_start);
+                       log_start++;
+                       spin_unlock_irq(&logbuf_lock);
+                       __put_user(c,buf);
+                       buf++;
+                       i++;
+                       spin_lock_irq(&logbuf_lock);
+               }
+               spin_unlock_irq(&logbuf_lock);
+               error = i;
+               break;
+       case 4:         /* Read/clear last kernel messages */
+               do_clear = 1; 
+               /* FALL THRU */
+       case 3:         /* Read last kernel messages */
+               error = -EINVAL;
+               if (!buf || len < 0)
+                       goto out;
+               error = 0;
+               if (!len)
+                       goto out;
+               error = verify_area(VERIFY_WRITE,buf,len);
+               if (error)
+                       goto out;
+               count = len;
+               if (count > LOG_BUF_LEN)
+                       count = LOG_BUF_LEN;
+               spin_lock_irq(&logbuf_lock);
+               if (count > logged_chars)
+                       count = logged_chars;
+               if (do_clear)
+                       logged_chars = 0;
+               limit = log_end;
+               /*
+                * __put_user() could sleep, and while we sleep
+                * printk() could overwrite the messages 
+                * we try to copy to user space. Therefore
+                * the messages are copied in reverse. <manfreds>
+                */
+               for(i=0;i < count;i++) {
+                       j = limit-1-i;
+                       if (j+LOG_BUF_LEN < log_end)
+                               break;
+                       c = LOG_BUF(j);
+                       spin_unlock_irq(&logbuf_lock);
+                       __put_user(c,&buf[count-1-i]);
+                       spin_lock_irq(&logbuf_lock);
+               }
+               spin_unlock_irq(&logbuf_lock);
+               error = i;
+               if(i != count) {
+                       int offset = count-error;
+                       /* buffer overflow during copy, correct user buffer. */
+                       for(i=0;i<error;i++) {
+                               __get_user(c,&buf[i+offset]);
+                               __put_user(c,&buf[i]);
+                       }
+               }
+
+               break;
+       case 5:         /* Clear ring buffer */
+               spin_lock_irq(&logbuf_lock);
+               logged_chars = 0;
+               spin_unlock_irq(&logbuf_lock);
+               break;
+       case 6:         /* Disable logging to console */
+               spin_lock_irq(&logbuf_lock);
+               console_loglevel = minimum_console_loglevel;
+               spin_unlock_irq(&logbuf_lock);
+               break;
+       case 7:         /* Enable logging to console */
+               spin_lock_irq(&logbuf_lock);
+               console_loglevel = default_console_loglevel;
+               spin_unlock_irq(&logbuf_lock);
+               break;
+       case 8:         /* Set level of messages printed to console */
+               error = -EINVAL;
+               if (len < 1 || len > 8)
+                       goto out;
+               if (len < minimum_console_loglevel)
+                       len = minimum_console_loglevel;
+               spin_lock_irq(&logbuf_lock);
+               console_loglevel = len;
+               spin_unlock_irq(&logbuf_lock);
+               error = 0;
+               break;
+       case 9:         /* Number of chars in the log buffer */
+               spin_lock_irq(&logbuf_lock);
+               error = log_end - log_start;
+               spin_unlock_irq(&logbuf_lock);
+               break;
+       default:
+               error = -EINVAL;
+               break;
+       }
+out:
+       return error;
+}
+
+asmlinkage long sys_syslog(int type, char * buf, int len)
+{
+       if ((type != 3) && !capable(CAP_SYS_ADMIN))
+               return -EPERM;
+       return do_syslog(type, buf, len);
+}
+
+/*
+ * Call the console drivers on a range of log_buf
+ */
+static void __call_console_drivers(unsigned long start, unsigned long end)
+{
+       struct console *con;
+
+       for (con = console_drivers; con; con = con->next) {
+               if ((con->flags & CON_ENABLED) && con->write)
+                       con->write(con, &LOG_BUF(start), end - start);
+       }
+}
+
+/*
+ * Write out chars from start to end - 1 inclusive
+ */
+static void _call_console_drivers(unsigned long start, unsigned long end, int msg_log_level)
+{
+       if (msg_log_level < console_loglevel && console_drivers && start != end) {
+               if ((start & LOG_BUF_MASK) > (end & LOG_BUF_MASK)) {
+                       /* wrapped write */
+                       __call_console_drivers(start & LOG_BUF_MASK, LOG_BUF_LEN);
+                       __call_console_drivers(0, end & LOG_BUF_MASK);
+               } else {
+                       __call_console_drivers(start, end);
+               }
+       }
+}
+
+/*
+ * Call the console drivers, asking them to write out
+ * log_buf[start] to log_buf[end - 1].
+ * The console_sem must be held.
+ */
+static void call_console_drivers(unsigned long start, unsigned long end)
+{
+       unsigned long cur_index, start_print;
+       static int msg_level = -1;
+
+       if (((long)(start - end)) > 0)
+               BUG();
+
+       cur_index = start;
+       start_print = start;
+       while (cur_index != end) {
+               if (    msg_level < 0 &&
+                       ((end - cur_index) > 2) &&
+                       LOG_BUF(cur_index + 0) == '<' &&
+                       LOG_BUF(cur_index + 1) >= '0' &&
+                       LOG_BUF(cur_index + 1) <= '7' &&
+                       LOG_BUF(cur_index + 2) == '>')
+               {
+                       msg_level = LOG_BUF(cur_index + 1) - '0';
+                       cur_index += 3;
+                       start_print = cur_index;
+               }
+               while (cur_index != end) {
+                       char c = LOG_BUF(cur_index);
+                       cur_index++;
+
+                       if (c == '\n') {
+                               if (msg_level < 0) {
+                                       /*
+                                        * printk() has already given us loglevel tags in
+                                        * the buffer.  This code is here in case the
+                                        * log buffer has wrapped right round and scribbled
+                                        * on those tags
+                                        */
+                                       msg_level = default_message_loglevel;
+                               }
+                               _call_console_drivers(start_print, cur_index, msg_level);
+                               msg_level = -1;
+                               start_print = cur_index;
+                               break;
+                       }
+               }
+       }
+       _call_console_drivers(start_print, end, msg_level);
+}
+
+static void emit_log_char(char c)
+{
+       LOG_BUF(log_end) = c;
+       log_end++;
+       if (log_end - log_start > LOG_BUF_LEN)
+               log_start = log_end - LOG_BUF_LEN;
+       if (log_end - con_start > LOG_BUF_LEN)
+               con_start = log_end - LOG_BUF_LEN;
+       if (logged_chars < LOG_BUF_LEN)
+               logged_chars++;
+}
+
+/*
+ * This is printk.  It can be called from any context.  We want it to work.
+ * 
+ * We try to grab the console_sem.  If we succeed, it's easy - we log the output and
+ * call the console drivers.  If we fail to get the semaphore we place the output
+ * into the log buffer and return.  The current holder of the console_sem will
+ * notice the new output in release_console_sem() and will send it to the
+ * consoles before releasing the semaphore.
+ *
+ * One effect of this deferred printing is that code which calls printk() and
+ * then changes console_loglevel may break. This is because console_loglevel
+ * is inspected when the actual printing occurs.
+ */
+asmlinkage int printk(const char *fmt, ...)
+{
+       va_list args;
+       unsigned long flags;
+       int printed_len;
+       char *p;
+       static char printk_buf[1024];
+       static int log_level_unknown = 1;
+
+       if (oops_in_progress) {
+               /* If a crash is occurring, make sure we can't deadlock */
+               spin_lock_init(&logbuf_lock);
+               /* And make sure that we print immediately */
+               init_MUTEX(&console_sem);
+       }
+
+       /* This stops the holder of console_sem just where we want him */
+       spin_lock_irqsave(&logbuf_lock, flags);
+
+       /* Emit the output into the temporary buffer */
+       va_start(args, fmt);
+       printed_len = vsnprintf(printk_buf, sizeof(printk_buf), fmt, args);
+       va_end(args);
+
+#if 0
+// Useful Hack if things are going wrong very early in the day
+(void)HYPERVISOR_console_write(printk_buf, sizeof(printk_buf));
+#endif
+       /*
+        * Copy the output into log_buf.  If the caller didn't provide
+        * appropriate log level tags, we insert them here
+        */
+       for (p = printk_buf; *p; p++) {
+               if (log_level_unknown) {
+                       if (p[0] != '<' || p[1] < '0' || p[1] > '7' || p[2] != '>') {
+                               emit_log_char('<');
+                               emit_log_char(default_message_loglevel + '0');
+                               emit_log_char('>');
+                       }
+                       log_level_unknown = 0;
+               }
+               emit_log_char(*p);
+               if (*p == '\n')
+                       log_level_unknown = 1;
+       }
+
+       if (!arch_consoles_callable()) {
+               /*
+                * On some architectures, the consoles are not usable
+                * on secondary CPUs early in the boot process.
+                */
+               spin_unlock_irqrestore(&logbuf_lock, flags);
+               goto out;
+       }
+       if (!down_trylock(&console_sem)) {
+               /*
+                * We own the drivers.  We can drop the spinlock and let
+                * release_console_sem() print the text
+                */
+               spin_unlock_irqrestore(&logbuf_lock, flags);
+               console_may_schedule = 0;
+               release_console_sem();
+       } else {
+               /*
+                * Someone else owns the drivers.  We drop the spinlock, which
+                * allows the semaphore holder to proceed and to call the
+                * console drivers with the output which we just produced.
+                */
+               spin_unlock_irqrestore(&logbuf_lock, flags);
+       }
+out:
+       return printed_len;
+}
+EXPORT_SYMBOL(printk);
+
+/**
+ * acquire_console_sem - lock the console system for exclusive use.
+ *
+ * Acquires a semaphore which guarantees that the caller has
+ * exclusive access to the console system and the console_drivers list.
+ *
+ * Can sleep, returns nothing.
+ */
+void acquire_console_sem(void)
+{
+       if (in_interrupt())
+               BUG();
+       down(&console_sem);
+       console_may_schedule = 1;
+}
+EXPORT_SYMBOL(acquire_console_sem);
+
+/**
+ * release_console_sem - unlock the console system
+ *
+ * Releases the semaphore which the caller holds on the console system
+ * and the console driver list.
+ *
+ * While the semaphore was held, console output may have been buffered
+ * by printk().  If this is the case, release_console_sem() emits
+ * the output prior to releasing the semaphore.
+ *
+ * If there is output waiting for klogd, we wake it up.
+ *
+ * release_console_sem() may be called from any context.
+ */
+void release_console_sem(void)
+{
+       unsigned long flags;
+       unsigned long _con_start, _log_end;
+       unsigned long must_wake_klogd = 0;
+
+       for ( ; ; ) {
+               spin_lock_irqsave(&logbuf_lock, flags);
+               must_wake_klogd |= log_start - log_end;
+               if (con_start == log_end)
+                       break;                  /* Nothing to print */
+               _con_start = con_start;
+               _log_end = log_end;
+               con_start = log_end;            /* Flush */
+               spin_unlock_irqrestore(&logbuf_lock, flags);
+               call_console_drivers(_con_start, _log_end);
+       }
+       console_may_schedule = 0;
+       up(&console_sem);
+       spin_unlock_irqrestore(&logbuf_lock, flags);
+       if (must_wake_klogd && !oops_in_progress)
+               wake_up_interruptible(&log_wait);
+}
+
+/** console_conditional_schedule - yield the CPU if required
+ *
+ * If the console code is currently allowed to sleep, and
+ * if this CPU should yield the CPU to another task, do
+ * so here.
+ *
+ * Must be called within acquire_console_sem().
+ */
+void console_conditional_schedule(void)
+{
+       if (console_may_schedule && current->need_resched) {
+               set_current_state(TASK_RUNNING);
+               schedule();
+       }
+}
+
+void console_print(const char *s)
+{
+       printk(KERN_EMERG "%s", s);
+}
+EXPORT_SYMBOL(console_print);
+
+void console_unblank(void)
+{
+       struct console *c;
+
+       /*
+        * Try to get the console semaphore. If someone else owns it
+        * we have to return without unblanking because console_unblank
+        * may be called in interrupt context.
+        */
+       if (down_trylock(&console_sem) != 0)
+               return;
+       console_may_schedule = 0;
+       for (c = console_drivers; c != NULL; c = c->next)
+               if ((c->flags & CON_ENABLED) && c->unblank)
+                       c->unblank();
+       release_console_sem();
+}
+EXPORT_SYMBOL(console_unblank);
+
+/*
+ * The console driver calls this routine during kernel initialization
+ * to register the console printing procedure with printk() and to
+ * print any messages that were printed by the kernel before the
+ * console driver was initialized.
+ */
+void register_console(struct console * console)
+{
+       int     i;
+       unsigned long flags;
+
+       /*
+        *      See if we want to use this console driver. If we
+        *      didn't select a console we take the first one
+        *      that registers here.
+        */
+       if (preferred_console < 0) {
+               if (console->index < 0)
+                       console->index = 0;
+               if (console->setup == NULL ||
+                   console->setup(console, NULL) == 0) {
+                       console->flags |= CON_ENABLED | CON_CONSDEV;
+                       preferred_console = 0;
+               }
+       }
+
+       /*
+        *      See if this console matches one we selected on
+        *      the command line.
+        */
+       for(i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++) {
+               if (strcmp(console_cmdline[i].name, console->name) != 0)
+                       continue;
+               if (console->index >= 0 &&
+                   console->index != console_cmdline[i].index)
+                       continue;
+               if (console->index < 0)
+                       console->index = console_cmdline[i].index;
+               if (console->setup &&
+                   console->setup(console, console_cmdline[i].options) != 0)
+                       break;
+               console->flags |= CON_ENABLED;
+               console->index = console_cmdline[i].index;
+               if (i == preferred_console)
+                       console->flags |= CON_CONSDEV;
+               break;
+       }
+
+       if (!(console->flags & CON_ENABLED))
+               return;
+
+       /*
+        *      Put this console in the list - keep the
+        *      preferred driver at the head of the list.
+        */
+       acquire_console_sem();
+       if ((console->flags & CON_CONSDEV) || console_drivers == NULL) {
+               console->next = console_drivers;
+               console_drivers = console;
+       } else {
+               console->next = console_drivers->next;
+               console_drivers->next = console;
+       }
+       if (console->flags & CON_PRINTBUFFER) {
+               /*
+                * release_console_sem() will print out the buffered messages for us.
+                */
+               spin_lock_irqsave(&logbuf_lock, flags);
+               con_start = log_start;
+               spin_unlock_irqrestore(&logbuf_lock, flags);
+       }
+       release_console_sem();
+}
+EXPORT_SYMBOL(register_console);
+
+int unregister_console(struct console * console)
+{
+        struct console *a,*b;
+       int res = 1;
+
+       acquire_console_sem();
+       if (console_drivers == console) {
+               console_drivers=console->next;
+               res = 0;
+       } else {
+               for (a=console_drivers->next, b=console_drivers ;
+                    a; b=a, a=b->next) {
+                       if (a == console) {
+                               b->next = a->next;
+                               res = 0;
+                               break;
+                       }  
+               }
+       }
+       
+       /* If last console is removed, we re-enable picking the first
+        * one that gets registered. Without that, pmac early boot console
+        * would prevent fbcon from taking over.
+        */
+       if (console_drivers == NULL)
+               preferred_console = -1;
+               
+
+       release_console_sem();
+       return res;
+}
+EXPORT_SYMBOL(unregister_console);
+       
+/**
+ * tty_write_message - write a message to a certain tty, not just the console.
+ *
+ * This is used for messages that need to be redirected to a specific tty.
+ * We don't put it into the syslog queue right now maybe in the future if
+ * really needed.
+ */
+void tty_write_message(struct tty_struct *tty, char *msg)
+{
+       if (tty && tty->driver.write)
+               tty->driver.write(tty, 0, msg, strlen(msg));
+       return;
+}
diff --git a/xenolinux-2.4.22-sparse/lndir-rel b/xenolinux-2.4.22-sparse/lndir-rel
new file mode 100755 (executable)
index 0000000..d0bd863
Binary files /dev/null and b/xenolinux-2.4.22-sparse/lndir-rel differ
diff --git a/xenolinux-2.4.22-sparse/mkbuildtree b/xenolinux-2.4.22-sparse/mkbuildtree
new file mode 100755 (executable)
index 0000000..0d5581a
--- /dev/null
@@ -0,0 +1,193 @@
+#!/bin/sh
+
+# mkbuildtree <build tree>
+#
+# Creates symbolic links in <build tree> for the sparse tree
+# in the current directory.
+
+# Script to determine the relative path between two directories.
+# Copyright (c) D. J. Hawkey Jr. 2002
+# Fixed for Xen project by K. Fraser in 2003.  
+abs_to_rel ()
+{
+       local CWD SRCPATH
+                
+       if [ "$1" != "/" -a "${1##*[^/]}" = "/" ]; then
+               SRCPATH=${1%?}
+       else
+               SRCPATH=$1
+       fi
+       if [ "$2" != "/" -a "${2##*[^/]}" = "/" ]; then
+               DESTPATH=${2%?}
+       else
+               DESTPATH=$2
+       fi
+
+       CWD=$PWD
+       [ "${1%%[^/]*}" != "/" ] && cd $1 && SRCPATH=$PWD
+       [ "${2%%[^/]*}" != "/" ] && cd $2 && DESTPATH=$PWD
+       [ "$CWD" != "$PWD" ] && cd $CWD
+
+       BASEPATH=$SRCPATH
+
+       [ "$SRCPATH" = "$DESTPATH" ] && DESTPATH="." && return
+       [ "$SRCPATH" = "/" ] && DESTPATH=${DESTPATH#?} && return
+
+       while [ "$BASEPATH/" != "${DESTPATH%${DESTPATH#$BASEPATH/}}" ]; do
+          BASEPATH=${BASEPATH%/*}
+       done
+
+       SRCPATH=${SRCPATH#$BASEPATH}
+        DESTPATH=${DESTPATH#$BASEPATH}
+        DESTPATH=${DESTPATH#?}
+       while [ -n "$SRCPATH" ]; do
+               SRCPATH=${SRCPATH%/*}
+               DESTPATH="../$DESTPATH"
+       done
+
+       [ -z "$BASEPATH" ] && BASEPATH="/"
+       [ "${DESTPATH##*[^/]}" = "/" ] && DESTPATH=${DESTPATH%?}
+}
+
+
+[ "$1" == "" ] && { echo "Syntax: $0 <linux tree to xenify>"; exit 1; }
+
+# Get absolute path to the destination directory
+pushd . >/dev/null
+cd ${1}
+AD=`pwd`
+popd >/dev/null
+
+# Get absolute path to the source directory
+AS=`pwd`
+
+# Get path to source, relative to destination
+abs_to_rel ${AD} ${AS}
+RS=$DESTPATH
+
+# Remove old copies of files and directories at the destination
+for i in `find . -type f -o -type l` ; do rm -f ${AD}/${i#./} ; done
+
+# We now work from the destination directory
+cd ${AD}
+
+# Create symlinks of files and directories which exist in the sparse source
+${AS}/lndir-rel -silent ${RS}
+rm -f mkbuildtree lndir-rel
+
+## There are a whole bunch of special symlinks, mostly for files
+## which are identical in the i386 and xeno-i386 architecture-dependent
+## subdirectories.
+
+# This first symlink is special: it links to shared files in Xen's source tree
+rm -rf ${AD}/include/asm-xeno/hypervisor-ifs
+mkdir  ${AD}/include/asm-xeno/hypervisor-ifs
+cd     ${AD}/include/asm-xeno/hypervisor-ifs
+${AS}/lndir-rel -silent ../../../${RS}/../xen/include/hypervisor-ifs
+
+# The remainder are the i386 -> xeno-i386 links
+cd ..
+ln -sf ../asm-i386/a.out.h 
+ln -sf ../asm-i386/apicdef.h 
+ln -sf ../asm-i386/apic.h 
+ln -sf ../asm-i386/atomic.h 
+ln -sf ../asm-i386/bitops.h 
+ln -sf ../asm-i386/boot.h 
+ln -sf ../asm-i386/byteorder.h 
+ln -sf ../asm-i386/cache.h 
+ln -sf ../asm-i386/checksum.h 
+ln -sf ../asm-i386/cpufeature.h 
+ln -sf ../asm-i386/current.h 
+ln -sf ../asm-i386/debugreg.h 
+ln -sf ../asm-i386/delay.h 
+ln -sf ../asm-i386/div64.h 
+ln -sf ../asm-i386/dma.h 
+ln -sf ../asm-i386/elf.h 
+ln -sf ../asm-i386/errno.h 
+ln -sf ../asm-i386/fcntl.h 
+ln -sf ../asm-i386/floppy.h 
+ln -sf ../asm-i386/hardirq.h 
+ln -sf ../asm-i386/hdreg.h 
+ln -sf ../asm-i386/i387.h 
+ln -sf ../asm-i386/ide.h 
+ln -sf ../asm-i386/init.h 
+ln -sf ../asm-i386/io.h
+ln -sf ../asm-i386/io_apic.h
+ln -sf ../asm-i386/ioctl.h
+ln -sf ../asm-i386/ioctls.h
+ln -sf ../asm-i386/ipcbuf.h
+ln -sf ../asm-i386/ipc.h 
+ln -sf ../asm-i386/kmap_types.h
+ln -sf ../asm-i386/ldt.h 
+ln -sf ../asm-i386/linux_logo.h
+ln -sf ../asm-i386/locks.h 
+ln -sf ../asm-i386/math_emu.h
+ln -sf ../asm-i386/mc146818rtc.h
+ln -sf ../asm-i386/mca_dma.h 
+ln -sf ../asm-i386/mman.h 
+ln -sf ../asm-i386/mmu.h 
+ln -sf ../asm-i386/mmx.h 
+ln -sf ../asm-i386/module.h 
+ln -sf ../asm-i386/mpspec.h 
+ln -sf ../asm-i386/msgbuf.h 
+ln -sf ../asm-i386/msr.h 
+ln -sf ../asm-i386/mtrr.h 
+ln -sf ../asm-i386/namei.h 
+ln -sf ../asm-i386/param.h 
+ln -sf ../asm-i386/parport.h 
+ln -sf ../asm-i386/pgtable-3level.h 
+ln -sf ../asm-i386/poll.h 
+ln -sf ../asm-i386/posix_types.h 
+ln -sf ../asm-i386/resource.h 
+ln -sf ../asm-i386/rwlock.h 
+ln -sf ../asm-i386/rwsem.h 
+ln -sf ../asm-i386/scatterlist.h
+ln -sf ../asm-i386/semaphore.h 
+ln -sf ../asm-i386/sembuf.h 
+ln -sf ../asm-i386/serial.h 
+ln -sf ../asm-i386/setup.h 
+ln -sf ../asm-i386/shmbuf.h 
+ln -sf ../asm-i386/shmparam.h 
+ln -sf ../asm-i386/sigcontext.h 
+ln -sf ../asm-i386/siginfo.h 
+ln -sf ../asm-i386/signal.h 
+ln -sf ../asm-i386/smplock.h 
+ln -sf ../asm-i386/socket.h 
+ln -sf ../asm-i386/sockios.h 
+ln -sf ../asm-i386/softirq.h 
+ln -sf ../asm-i386/spinlock.h 
+ln -sf ../asm-i386/statfs.h 
+ln -sf ../asm-i386/stat.h 
+ln -sf ../asm-i386/string-486.h 
+ln -sf ../asm-i386/string.h 
+ln -sf ../asm-i386/termbits.h 
+ln -sf ../asm-i386/termios.h 
+ln -sf ../asm-i386/timex.h 
+ln -sf ../asm-i386/tlb.h 
+ln -sf ../asm-i386/types.h 
+ln -sf ../asm-i386/uaccess.h 
+ln -sf ../asm-i386/ucontext.h 
+ln -sf ../asm-i386/unaligned.h
+ln -sf ../asm-i386/unistd.h 
+ln -sf ../asm-i386/user.h 
+ln -sf ../asm-i386/xor.h 
+
+cd ../../arch/xeno/kernel
+ln -sf ../../i386/kernel/i387.c
+ln -sf ../../i386/kernel/init_task.c
+ln -sf ../../i386/kernel/ptrace.c
+ln -sf ../../i386/kernel/semaphore.c 
+ln -sf ../../i386/kernel/sys_i386.c 
+cd ../lib
+ln -sf ../../i386/lib/checksum.S 
+ln -sf ../../i386/lib/dec_and_lock.c 
+ln -sf ../../i386/lib/getuser.S 
+ln -sf ../../i386/lib/iodebug.c 
+ln -sf ../../i386/lib/memcpy.c 
+ln -sf ../../i386/lib/mmx.c
+ln -sf ../../i386/lib/old-checksum.c 
+ln -sf ../../i386/lib/strstr.c 
+ln -sf ../../i386/lib/usercopy.c 
+cd ../mm
+ln -sf ../../i386/mm/extable.c 
+ln -sf ../../i386/mm/pageattr.c 
diff --git a/xenolinux-2.4.22-sparse/mm/memory.c b/xenolinux-2.4.22-sparse/mm/memory.c
new file mode 100644 (file)
index 0000000..f06ad4b
--- /dev/null
@@ -0,0 +1,1511 @@
+/*
+ *  linux/mm/memory.c
+ *
+ *  Copyright (C) 1991, 1992, 1993, 1994  Linus Torvalds
+ */
+
+/*
+ * demand-loading started 01.12.91 - seems it is high on the list of
+ * things wanted, and it should be easy to implement. - Linus
+ */
+
+/*
+ * Ok, demand-loading was easy, shared pages a little bit tricker. Shared
+ * pages started 02.12.91, seems to work. - Linus.
+ *
+ * Tested sharing by executing about 30 /bin/sh: under the old kernel it
+ * would have taken more than the 6M I have free, but it worked well as
+ * far as I could see.
+ *
+ * Also corrected some "invalidate()"s - I wasn't doing enough of them.
+ */
+
+/*
+ * Real VM (paging to/from disk) started 18.12.91. Much more work and
+ * thought has to go into this. Oh, well..
+ * 19.12.91  -  works, somewhat. Sometimes I get faults, don't know why.
+ *             Found it. Everything seems to work now.
+ * 20.12.91  -  Ok, making the swap-device changeable like the root.
+ */
+
+/*
+ * 05.04.94  -  Multi-page memory management added for v1.1.
+ *             Idea by Alex Bligh (alex@cconcepts.co.uk)
+ *
+ * 16.07.99  -  Support of BIGMEM added by Gerhard Wichert, Siemens AG
+ *             (Gerhard.Wichert@pdb.siemens.de)
+ */
+
+#include <linux/mm.h>
+#include <linux/mman.h>
+#include <linux/swap.h>
+#include <linux/smp_lock.h>
+#include <linux/swapctl.h>
+#include <linux/iobuf.h>
+#include <linux/highmem.h>
+#include <linux/pagemap.h>
+#include <linux/module.h>
+
+#include <asm/pgalloc.h>
+#include <asm/uaccess.h>
+#include <asm/tlb.h>
+
+unsigned long max_mapnr;
+unsigned long num_physpages;
+unsigned long num_mappedpages;
+void * high_memory;
+struct page *highmem_start_page;
+
+/*
+ * We special-case the C-O-W ZERO_PAGE, because it's such
+ * a common occurrence (no need to read the page to know
+ * that it's zero - better for the cache and memory subsystem).
+ */
+static inline void copy_cow_page(struct page * from, struct page * to, unsigned long address)
+{
+       if (from == ZERO_PAGE(address)) {
+               clear_user_highpage(to, address);
+               return;
+       }
+       copy_user_highpage(to, from, address);
+}
+
+mem_map_t * mem_map;
+
+/*
+ * Called by TLB shootdown 
+ */
+void __free_pte(pte_t pte)
+{
+       struct page *page = pte_page(pte);
+       if ((!VALID_PAGE(page)) || PageReserved(page))
+               return;
+       if (pte_dirty(pte))
+               set_page_dirty(page);           
+       free_page_and_swap_cache(page);
+}
+
+
+/*
+ * Note: this doesn't free the actual pages themselves. That
+ * has been handled earlier when unmapping all the memory regions.
+ */
+static inline void free_one_pmd(pmd_t * dir)
+{
+       pte_t * pte;
+
+       if (pmd_none(*dir))
+               return;
+       if (pmd_bad(*dir)) {
+               pmd_ERROR(*dir);
+               pmd_clear(dir);
+               return;
+       }
+       pte = pte_offset(dir, 0);
+       pmd_clear(dir);
+       pte_free(pte);
+}
+
+static inline void free_one_pgd(pgd_t * dir)
+{
+       int j;
+       pmd_t * pmd;
+
+       if (pgd_none(*dir))
+               return;
+       if (pgd_bad(*dir)) {
+               pgd_ERROR(*dir);
+               pgd_clear(dir);
+               return;
+       }
+       pmd = pmd_offset(dir, 0);
+       pgd_clear(dir);
+       for (j = 0; j < PTRS_PER_PMD ; j++) {
+               prefetchw(pmd+j+(PREFETCH_STRIDE/16));
+               free_one_pmd(pmd+j);
+       }
+       pmd_free(pmd);
+}
+
+/* Low and high watermarks for page table cache.
+   The system should try to have pgt_water[0] <= cache elements <= pgt_water[1]
+ */
+int pgt_cache_water[2] = { 25, 50 };
+
+/* Returns the number of pages freed */
+int check_pgt_cache(void)
+{
+       return do_check_pgt_cache(pgt_cache_water[0], pgt_cache_water[1]);
+}
+
+
+/*
+ * This function clears all user-level page tables of a process - this
+ * is needed by execve(), so that old pages aren't in the way.
+ */
+void clear_page_tables(struct mm_struct *mm, unsigned long first, int nr)
+{
+       pgd_t * page_dir = mm->pgd;
+
+       spin_lock(&mm->page_table_lock);
+       page_dir += first;
+       do {
+               free_one_pgd(page_dir);
+               page_dir++;
+       } while (--nr);
+       XENO_flush_page_update_queue();
+       spin_unlock(&mm->page_table_lock);
+
+       /* keep the page table cache within bounds */
+       check_pgt_cache();
+}
+
+#define PTE_TABLE_MASK ((PTRS_PER_PTE-1) * sizeof(pte_t))
+#define PMD_TABLE_MASK ((PTRS_PER_PMD-1) * sizeof(pmd_t))
+
+/*
+ * copy one vm_area from one task to the other. Assumes the page tables
+ * already present in the new task to be cleared in the whole range
+ * covered by this vma.
+ *
+ * 08Jan98 Merged into one routine from several inline routines to reduce
+ *         variable count and make things faster. -jj
+ *
+ * dst->page_table_lock is held on entry and exit,
+ * but may be dropped within pmd_alloc() and pte_alloc().
+ */
+int copy_page_range(struct mm_struct *dst, struct mm_struct *src,
+                       struct vm_area_struct *vma)
+{
+       pgd_t * src_pgd, * dst_pgd;
+       unsigned long address = vma->vm_start;
+       unsigned long end = vma->vm_end;
+       unsigned long cow = (vma->vm_flags & (VM_SHARED | VM_MAYWRITE)) == VM_MAYWRITE;
+
+       src_pgd = pgd_offset(src, address)-1;
+       dst_pgd = pgd_offset(dst, address)-1;
+
+       for (;;) {
+               pmd_t * src_pmd, * dst_pmd;
+
+               src_pgd++; dst_pgd++;
+               
+               /* copy_pmd_range */
+               
+               if (pgd_none(*src_pgd))
+                       goto skip_copy_pmd_range;
+               if (pgd_bad(*src_pgd)) {
+                       pgd_ERROR(*src_pgd);
+                       pgd_clear(src_pgd);
+skip_copy_pmd_range:   address = (address + PGDIR_SIZE) & PGDIR_MASK;
+                       if (!address || (address >= end))
+                               goto out;
+                       continue;
+               }
+
+               src_pmd = pmd_offset(src_pgd, address);
+               dst_pmd = pmd_alloc(dst, dst_pgd, address);
+               if (!dst_pmd)
+                       goto nomem;
+
+               do {
+                       pte_t * src_pte, * dst_pte;
+               
+                       /* copy_pte_range */
+               
+                       if (pmd_none(*src_pmd))
+                               goto skip_copy_pte_range;
+                       if (pmd_bad(*src_pmd)) {
+                               pmd_ERROR(*src_pmd);
+                               pmd_clear(src_pmd);
+skip_copy_pte_range:           address = (address + PMD_SIZE) & PMD_MASK;
+                               if (address >= end)
+                                       goto out;
+                               goto cont_copy_pmd_range;
+                       }
+
+                       src_pte = pte_offset(src_pmd, address);
+                       dst_pte = pte_alloc(dst, dst_pmd, address);
+                       if (!dst_pte)
+                               goto nomem;
+
+                       spin_lock(&src->page_table_lock);                       
+                       do {
+                               pte_t pte = *src_pte;
+                               struct page *ptepage;
+                               
+                               /* copy_one_pte */
+
+                               if (pte_none(pte))
+                                       goto cont_copy_pte_range_noset;
+                               if (!pte_present(pte)) {
+                                       swap_duplicate(pte_to_swp_entry(pte));
+                                       goto cont_copy_pte_range;
+                               }
+                               ptepage = pte_page(pte);
+                               if ((!VALID_PAGE(ptepage)) || 
+                                   PageReserved(ptepage))
+                                       goto cont_copy_pte_range;
+
+                               /* If it's a COW mapping, write protect it both in the parent and the child */
+                               if (cow && pte_write(pte)) {
+                                       /* XENO modification: modified ordering here to avoid RaW hazard. */
+                                       pte = *src_pte;
+                                       pte = pte_wrprotect(pte);
+                                       ptep_set_wrprotect(src_pte);
+                               }
+
+                               /* If it's a shared mapping, mark it clean in the child */
+                               if (vma->vm_flags & VM_SHARED)
+                                       pte = pte_mkclean(pte);
+                               pte = pte_mkold(pte);
+                               get_page(ptepage);
+                               dst->rss++;
+
+cont_copy_pte_range:           set_pte(dst_pte, pte);
+cont_copy_pte_range_noset:     address += PAGE_SIZE;
+                               if (address >= end)
+                                       goto out_unlock;
+                               src_pte++;
+                               dst_pte++;
+                       } while ((unsigned long)src_pte & PTE_TABLE_MASK);
+                       spin_unlock(&src->page_table_lock);
+               
+cont_copy_pmd_range:   src_pmd++;
+                       dst_pmd++;
+               } while ((unsigned long)src_pmd & PMD_TABLE_MASK);
+       }
+out_unlock:
+       spin_unlock(&src->page_table_lock);
+out:
+       return 0;
+nomem:
+       return -ENOMEM;
+}
+
+/*
+ * Return indicates whether a page was freed so caller can adjust rss
+ */
+static inline void forget_pte(pte_t page)
+{
+       if (!pte_none(page)) {
+               printk("forget_pte: old mapping existed!\n");
+               BUG();
+       }
+}
+
+static inline int zap_pte_range(mmu_gather_t *tlb, pmd_t * pmd, unsigned long address, unsigned long size)
+{
+       unsigned long offset;
+       pte_t * ptep;
+       int freed = 0;
+
+       if (pmd_none(*pmd))
+               return 0;
+       if (pmd_bad(*pmd)) {
+               pmd_ERROR(*pmd);
+               pmd_clear(pmd);
+               return 0;
+       }
+       ptep = pte_offset(pmd, address);
+       offset = address & ~PMD_MASK;
+       if (offset + size > PMD_SIZE)
+               size = PMD_SIZE - offset;
+       size &= PAGE_MASK;
+       for (offset=0; offset < size; ptep++, offset += PAGE_SIZE) {
+               pte_t pte = *ptep;
+               if (pte_none(pte))
+                       continue;
+               if (pte_present(pte)) {
+                       struct page *page = pte_page(pte);
+#if defined(CONFIG_XENO_PRIV)
+                       if (pte_io(pte)) {
+                               queue_l1_entry_update(
+                                       __pa(ptep)|PGREQ_UNCHECKED_UPDATE, 0);
+                               continue;
+                       }
+#endif
+                       if (VALID_PAGE(page) && !PageReserved(page))
+                               freed ++;
+                       /* This will eventually call __free_pte on the pte. */
+                       tlb_remove_page(tlb, ptep, address + offset);
+               } else {
+                       free_swap_and_cache(pte_to_swp_entry(pte));
+                       pte_clear(ptep);
+               }
+       }
+
+       return freed;
+}
+
+static inline int zap_pmd_range(mmu_gather_t *tlb, pgd_t * dir, unsigned long address, unsigned long size)
+{
+       pmd_t * pmd;
+       unsigned long end;
+       int freed;
+
+       if (pgd_none(*dir))
+               return 0;
+       if (pgd_bad(*dir)) {
+               pgd_ERROR(*dir);
+               pgd_clear(dir);
+               return 0;
+       }
+       pmd = pmd_offset(dir, address);
+       end = address + size;
+       if (end > ((address + PGDIR_SIZE) & PGDIR_MASK))
+               end = ((address + PGDIR_SIZE) & PGDIR_MASK);
+       freed = 0;
+       do {
+               freed += zap_pte_range(tlb, pmd, address, end - address);
+               address = (address + PMD_SIZE) & PMD_MASK; 
+               pmd++;
+       } while (address < end);
+       return freed;
+}
+
+/*
+ * remove user pages in a given range.
+ */
+void zap_page_range(struct mm_struct *mm, unsigned long address, unsigned long size)
+{
+       mmu_gather_t *tlb;
+       pgd_t * dir;
+       unsigned long start = address, end = address + size;
+       int freed = 0;
+
+       dir = pgd_offset(mm, address);
+
+       /*
+        * This is a long-lived spinlock. That's fine.
+        * There's no contention, because the page table
+        * lock only protects against kswapd anyway, and
+        * even if kswapd happened to be looking at this
+        * process we _want_ it to get stuck.
+        */
+       if (address >= end)
+               BUG();
+       spin_lock(&mm->page_table_lock);
+       flush_cache_range(mm, address, end);
+       tlb = tlb_gather_mmu(mm);
+
+       do {
+               freed += zap_pmd_range(tlb, dir, address, end - address);
+               address = (address + PGDIR_SIZE) & PGDIR_MASK;
+               dir++;
+       } while (address && (address < end));
+
+       /* this will flush any remaining tlb entries */
+       tlb_finish_mmu(tlb, start, end);
+
+       /*
+        * Update rss for the mm_struct (not necessarily current->mm)
+        * Notice that rss is an unsigned long.
+        */
+       if (mm->rss > freed)
+               mm->rss -= freed;
+       else
+               mm->rss = 0;
+       spin_unlock(&mm->page_table_lock);
+}
+
+/*
+ * Do a quick page-table lookup for a single page. 
+ */
+static struct page * follow_page(struct mm_struct *mm, unsigned long address, int write) 
+{
+       pgd_t *pgd;
+       pmd_t *pmd;
+       pte_t *ptep, pte;
+
+       pgd = pgd_offset(mm, address);
+       if (pgd_none(*pgd) || pgd_bad(*pgd))
+               goto out;
+
+       pmd = pmd_offset(pgd, address);
+       if (pmd_none(*pmd) || pmd_bad(*pmd))
+               goto out;
+
+       ptep = pte_offset(pmd, address);
+       if (!ptep)
+               goto out;
+
+       pte = *ptep;
+       if (pte_present(pte)) {
+               if (!write ||
+                   (pte_write(pte) && pte_dirty(pte)))
+                       return pte_page(pte);
+       }
+
+out:
+       return 0;
+}
+
+/* 
+ * Given a physical address, is there a useful struct page pointing to
+ * it?  This may become more complex in the future if we start dealing
+ * with IO-aperture pages in kiobufs.
+ */
+
+static inline struct page * get_page_map(struct page *page)
+{
+       if (!VALID_PAGE(page))
+               return 0;
+       return page;
+}
+
+/*
+ * Please read Documentation/cachetlb.txt before using this function,
+ * accessing foreign memory spaces can cause cache coherency problems.
+ *
+ * Accessing a VM_IO area is even more dangerous, therefore the function
+ * fails if pages is != NULL and a VM_IO area is found.
+ */
+int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, unsigned long start,
+               int len, int write, int force, struct page **pages, struct vm_area_struct **vmas)
+{
+       int i;
+       unsigned int flags;
+
+       /*
+        * Require read or write permissions.
+        * If 'force' is set, we only require the "MAY" flags.
+        */
+       flags = write ? (VM_WRITE | VM_MAYWRITE) : (VM_READ | VM_MAYREAD);
+       flags &= force ? (VM_MAYREAD | VM_MAYWRITE) : (VM_READ | VM_WRITE);
+       i = 0;
+
+       do {
+               struct vm_area_struct * vma;
+
+               vma = find_extend_vma(mm, start);
+
+               if ( !vma || (pages && vma->vm_flags & VM_IO) || !(flags & vma->vm_flags) )
+                       return i ? : -EFAULT;
+
+               spin_lock(&mm->page_table_lock);
+               do {
+                       struct page *map;
+                       while (!(map = follow_page(mm, start, write))) {
+                               spin_unlock(&mm->page_table_lock);
+                               switch (handle_mm_fault(mm, vma, start, write)) {
+                               case 1:
+                                       tsk->min_flt++;
+                                       break;
+                               case 2:
+                                       tsk->maj_flt++;
+                                       break;
+                               case 0:
+                                       if (i) return i;
+                                       return -EFAULT;
+                               default:
+                                       if (i) return i;
+                                       return -ENOMEM;
+                               }
+                               spin_lock(&mm->page_table_lock);
+                       }
+                       if (pages) {
+                               pages[i] = get_page_map(map);
+                               /* FIXME: call the correct function,
+                                * depending on the type of the found page
+                                */
+                               if (!pages[i])
+                                       goto bad_page;
+                               page_cache_get(pages[i]);
+                       }
+                       if (vmas)
+                               vmas[i] = vma;
+                       i++;
+                       start += PAGE_SIZE;
+                       len--;
+               } while(len && start < vma->vm_end);
+               spin_unlock(&mm->page_table_lock);
+       } while(len);
+out:
+       return i;
+
+       /*
+        * We found an invalid page in the VMA.  Release all we have
+        * so far and fail.
+        */
+bad_page:
+       spin_unlock(&mm->page_table_lock);
+       while (i--)
+               page_cache_release(pages[i]);
+       i = -EFAULT;
+       goto out;
+}
+
+EXPORT_SYMBOL(get_user_pages);
+
+/*
+ * Force in an entire range of pages from the current process's user VA,
+ * and pin them in physical memory.  
+ */
+#define dprintk(x...)
+
+int map_user_kiobuf(int rw, struct kiobuf *iobuf, unsigned long va, size_t len)
+{
+       int pgcount, err;
+       struct mm_struct *      mm;
+       
+       /* Make sure the iobuf is not already mapped somewhere. */
+       if (iobuf->nr_pages)
+               return -EINVAL;
+
+       mm = current->mm;
+       dprintk ("map_user_kiobuf: begin\n");
+       
+       pgcount = (va + len + PAGE_SIZE - 1)/PAGE_SIZE - va/PAGE_SIZE;
+       /* mapping 0 bytes is not permitted */
+       if (!pgcount) BUG();
+       err = expand_kiobuf(iobuf, pgcount);
+       if (err)
+               return err;
+
+       iobuf->locked = 0;
+       iobuf->offset = va & (PAGE_SIZE-1);
+       iobuf->length = len;
+       
+       /* Try to fault in all of the necessary pages */
+       down_read(&mm->mmap_sem);
+       /* rw==READ means read from disk, write into memory area */
+       err = get_user_pages(current, mm, va, pgcount,
+                       (rw==READ), 0, iobuf->maplist, NULL);
+       up_read(&mm->mmap_sem);
+       if (err < 0) {
+               unmap_kiobuf(iobuf);
+               dprintk ("map_user_kiobuf: end %d\n", err);
+               return err;
+       }
+       iobuf->nr_pages = err;
+       while (pgcount--) {
+               /* FIXME: flush superflous for rw==READ,
+                * probably wrong function for rw==WRITE
+                */
+               flush_dcache_page(iobuf->maplist[pgcount]);
+       }
+       dprintk ("map_user_kiobuf: end OK\n");
+       return 0;
+}
+
+/*
+ * Mark all of the pages in a kiobuf as dirty 
+ *
+ * We need to be able to deal with short reads from disk: if an IO error
+ * occurs, the number of bytes read into memory may be less than the
+ * size of the kiobuf, so we have to stop marking pages dirty once the
+ * requested byte count has been reached.
+ *
+ * Must be called from process context - set_page_dirty() takes VFS locks.
+ */
+
+void mark_dirty_kiobuf(struct kiobuf *iobuf, int bytes)
+{
+       int index, offset, remaining;
+       struct page *page;
+       
+       index = iobuf->offset >> PAGE_SHIFT;
+       offset = iobuf->offset & ~PAGE_MASK;
+       remaining = bytes;
+       if (remaining > iobuf->length)
+               remaining = iobuf->length;
+       
+       while (remaining > 0 && index < iobuf->nr_pages) {
+               page = iobuf->maplist[index];
+               
+               if (!PageReserved(page))
+                       set_page_dirty(page);
+
+               remaining -= (PAGE_SIZE - offset);
+               offset = 0;
+               index++;
+       }
+}
+
+/*
+ * Unmap all of the pages referenced by a kiobuf.  We release the pages,
+ * and unlock them if they were locked. 
+ */
+
+void unmap_kiobuf (struct kiobuf *iobuf) 
+{
+       int i;
+       struct page *map;
+       
+       for (i = 0; i < iobuf->nr_pages; i++) {
+               map = iobuf->maplist[i];
+               if (map) {
+                       if (iobuf->locked)
+                               UnlockPage(map);
+                       /* FIXME: cache flush missing for rw==READ
+                        * FIXME: call the correct reference counting function
+                        */
+                       page_cache_release(map);
+               }
+       }
+       
+       iobuf->nr_pages = 0;
+       iobuf->locked = 0;
+}
+
+
+/*
+ * Lock down all of the pages of a kiovec for IO.
+ *
+ * If any page is mapped twice in the kiovec, we return the error -EINVAL.
+ *
+ * The optional wait parameter causes the lock call to block until all
+ * pages can be locked if set.  If wait==0, the lock operation is
+ * aborted if any locked pages are found and -EAGAIN is returned.
+ */
+
+int lock_kiovec(int nr, struct kiobuf *iovec[], int wait)
+{
+       struct kiobuf *iobuf;
+       int i, j;
+       struct page *page, **ppage;
+       int doublepage = 0;
+       int repeat = 0;
+       
+ repeat:
+       
+       for (i = 0; i < nr; i++) {
+               iobuf = iovec[i];
+
+               if (iobuf->locked)
+                       continue;
+
+               ppage = iobuf->maplist;
+               for (j = 0; j < iobuf->nr_pages; ppage++, j++) {
+                       page = *ppage;
+                       if (!page)
+                               continue;
+                       
+                       if (TryLockPage(page)) {
+                               while (j--) {
+                                       struct page *tmp = *--ppage;
+                                       if (tmp)
+                                               UnlockPage(tmp);
+                               }
+                               goto retry;
+                       }
+               }
+               iobuf->locked = 1;
+       }
+
+       return 0;
+       
+ retry:
+       
+       /* 
+        * We couldn't lock one of the pages.  Undo the locking so far,
+        * wait on the page we got to, and try again.  
+        */
+       
+       unlock_kiovec(nr, iovec);
+       if (!wait)
+               return -EAGAIN;
+       
+       /* 
+        * Did the release also unlock the page we got stuck on?
+        */
+       if (!PageLocked(page)) {
+               /* 
+                * If so, we may well have the page mapped twice
+                * in the IO address range.  Bad news.  Of
+                * course, it _might_ just be a coincidence,
+                * but if it happens more than once, chances
+                * are we have a double-mapped page. 
+                */
+               if (++doublepage >= 3) 
+                       return -EINVAL;
+               
+               /* Try again...  */
+               wait_on_page(page);
+       }
+       
+       if (++repeat < 16)
+               goto repeat;
+       return -EAGAIN;
+}
+
+/*
+ * Unlock all of the pages of a kiovec after IO.
+ */
+
+int unlock_kiovec(int nr, struct kiobuf *iovec[])
+{
+       struct kiobuf *iobuf;
+       int i, j;
+       struct page *page, **ppage;
+       
+       for (i = 0; i < nr; i++) {
+               iobuf = iovec[i];
+
+               if (!iobuf->locked)
+                       continue;
+               iobuf->locked = 0;
+               
+               ppage = iobuf->maplist;
+               for (j = 0; j < iobuf->nr_pages; ppage++, j++) {
+                       page = *ppage;
+                       if (!page)
+                               continue;
+                       UnlockPage(page);
+               }
+       }
+       return 0;
+}
+
+static inline void zeromap_pte_range(pte_t * pte, unsigned long address,
+                                     unsigned long size, pgprot_t prot)
+{
+       unsigned long end;
+
+       address &= ~PMD_MASK;
+       end = address + size;
+       if (end > PMD_SIZE)
+               end = PMD_SIZE;
+       do {
+               pte_t zero_pte = pte_wrprotect(mk_pte(ZERO_PAGE(address), prot));
+               pte_t oldpage = ptep_get_and_clear(pte);
+               set_pte(pte, zero_pte);
+               forget_pte(oldpage);
+               address += PAGE_SIZE;
+               pte++;
+       } while (address && (address < end));
+}
+
+static inline int zeromap_pmd_range(struct mm_struct *mm, pmd_t * pmd, unsigned long address,
+                                    unsigned long size, pgprot_t prot)
+{
+       unsigned long end;
+
+       address &= ~PGDIR_MASK;
+       end = address + size;
+       if (end > PGDIR_SIZE)
+               end = PGDIR_SIZE;
+       do {
+               pte_t * pte = pte_alloc(mm, pmd, address);
+               if (!pte)
+                       return -ENOMEM;
+               zeromap_pte_range(pte, address, end - address, prot);
+               address = (address + PMD_SIZE) & PMD_MASK;
+               pmd++;
+       } while (address && (address < end));
+       return 0;
+}
+
+int zeromap_page_range(unsigned long address, unsigned long size, pgprot_t prot)
+{
+       int error = 0;
+       pgd_t * dir;
+       unsigned long beg = address;
+       unsigned long end = address + size;
+       struct mm_struct *mm = current->mm;
+
+       dir = pgd_offset(mm, address);
+       flush_cache_range(mm, beg, end);
+       if (address >= end)
+               BUG();
+
+       spin_lock(&mm->page_table_lock);
+       do {
+               pmd_t *pmd = pmd_alloc(mm, dir, address);
+               error = -ENOMEM;
+               if (!pmd)
+                       break;
+               error = zeromap_pmd_range(mm, pmd, address, end - address, prot);
+               if (error)
+                       break;
+               address = (address + PGDIR_SIZE) & PGDIR_MASK;
+               dir++;
+       } while (address && (address < end));
+       spin_unlock(&mm->page_table_lock);
+       flush_tlb_range(mm, beg, end);
+       return error;
+}
+
+/*
+ * maps a range of physical memory into the requested pages. the old
+ * mappings are removed. any references to nonexistent pages results
+ * in null mappings (currently treated as "copy-on-access")
+ */
+static inline void remap_pte_range(pte_t * pte, unsigned long address, unsigned long size,
+       unsigned long phys_addr, pgprot_t prot)
+{
+       unsigned long end;
+
+       address &= ~PMD_MASK;
+       end = address + size;
+       if (end > PMD_SIZE)
+               end = PMD_SIZE;
+       do {
+               struct page *page;
+               pte_t oldpage;
+               oldpage = ptep_get_and_clear(pte);
+
+               page = virt_to_page(__va(phys_addr));
+               if ((!VALID_PAGE(page)) || PageReserved(page))
+                       set_pte(pte, mk_pte_phys(phys_addr, prot));
+               forget_pte(oldpage);
+               address += PAGE_SIZE;
+               phys_addr += PAGE_SIZE;
+               pte++;
+       } while (address && (address < end));
+}
+
+static inline int remap_pmd_range(struct mm_struct *mm, pmd_t * pmd, unsigned long address, unsigned long size,
+       unsigned long phys_addr, pgprot_t prot)
+{
+       unsigned long end;
+
+       address &= ~PGDIR_MASK;
+       end = address + size;
+       if (end > PGDIR_SIZE)
+               end = PGDIR_SIZE;
+       phys_addr -= address;
+       do {
+               pte_t * pte = pte_alloc(mm, pmd, address);
+               if (!pte)
+                       return -ENOMEM;
+               remap_pte_range(pte, address, end - address, address + phys_addr, prot);
+               address = (address + PMD_SIZE) & PMD_MASK;
+               pmd++;
+       } while (address && (address < end));
+       return 0;
+}
+
+/*  Note: this is only safe if the mm semaphore is held when called. */
+int remap_page_range(unsigned long from, unsigned long phys_addr, unsigned long size, pgprot_t prot)
+{
+       int error = 0;
+       pgd_t * dir;
+       unsigned long beg = from;
+       unsigned long end = from + size;
+       struct mm_struct *mm = current->mm;
+
+       phys_addr -= from;
+       dir = pgd_offset(mm, from);
+       flush_cache_range(mm, beg, end);
+       if (from >= end)
+               BUG();
+
+       spin_lock(&mm->page_table_lock);
+       do {
+               pmd_t *pmd = pmd_alloc(mm, dir, from);
+               error = -ENOMEM;
+               if (!pmd)
+                       break;
+               error = remap_pmd_range(mm, pmd, from, end - from, phys_addr + from, prot);
+               if (error)
+                       break;
+               from = (from + PGDIR_SIZE) & PGDIR_MASK;
+               dir++;
+       } while (from && (from < end));
+       spin_unlock(&mm->page_table_lock);
+       flush_tlb_range(mm, beg, end);
+       return error;
+}
+
+/*
+ * Establish a new mapping:
+ *  - flush the old one
+ *  - update the page tables
+ *  - inform the TLB about the new one
+ *
+ * We hold the mm semaphore for reading and vma->vm_mm->page_table_lock
+ */
+static inline void establish_pte(struct vm_area_struct * vma, unsigned long address, pte_t *page_table, pte_t entry)
+{
+       set_pte(page_table, entry);
+       flush_tlb_page(vma, address);
+       update_mmu_cache(vma, address, entry);
+}
+
+/*
+ * We hold the mm semaphore for reading and vma->vm_mm->page_table_lock
+ */
+static inline void break_cow(struct vm_area_struct * vma, struct page * new_page, unsigned long address, 
+               pte_t *page_table)
+{
+       flush_page_to_ram(new_page);
+       flush_cache_page(vma, address);
+       establish_pte(vma, address, page_table, pte_mkwrite(pte_mkdirty(mk_pte(new_page, vma->vm_page_prot))));
+}
+
+/*
+ * This routine handles present pages, when users try to write
+ * to a shared page. It is done by copying the page to a new address
+ * and decrementing the shared-page counter for the old page.
+ *
+ * Goto-purists beware: the only reason for goto's here is that it results
+ * in better assembly code.. The "default" path will see no jumps at all.
+ *
+ * Note that this routine assumes that the protection checks have been
+ * done by the caller (the low-level page fault routine in most cases).
+ * Thus we can safely just mark it writable once we've done any necessary
+ * COW.
+ *
+ * We also mark the page dirty at this point even though the page will
+ * change only once the write actually happens. This avoids a few races,
+ * and potentially makes it more efficient.
+ *
+ * We hold the mm semaphore and the page_table_lock on entry and exit
+ * with the page_table_lock released.
+ */
+static int do_wp_page(struct mm_struct *mm, struct vm_area_struct * vma,
+       unsigned long address, pte_t *page_table, pte_t pte)
+{
+       struct page *old_page, *new_page;
+
+       old_page = pte_page(pte);
+       if (!VALID_PAGE(old_page))
+               goto bad_wp_page;
+
+       if (!TryLockPage(old_page)) {
+               int reuse = can_share_swap_page(old_page);
+               unlock_page(old_page);
+               if (reuse) {
+                       flush_cache_page(vma, address);
+                       establish_pte(vma, address, page_table, pte_mkyoung(pte_mkdirty(pte_mkwrite(pte))));
+                       spin_unlock(&mm->page_table_lock);
+                       return 1;       /* Minor fault */
+               }
+       }
+
+       /*
+        * Ok, we need to copy. Oh, well..
+        */
+       page_cache_get(old_page);
+       spin_unlock(&mm->page_table_lock);
+
+       new_page = alloc_page(GFP_HIGHUSER);
+       if (!new_page)
+               goto no_mem;
+       copy_cow_page(old_page,new_page,address);
+
+       /*
+        * Re-check the pte - we dropped the lock
+        */
+       spin_lock(&mm->page_table_lock);
+       if (pte_same(*page_table, pte)) {
+               if (PageReserved(old_page))
+                       ++mm->rss;
+               break_cow(vma, new_page, address, page_table);
+               lru_cache_add(new_page);
+
+               /* Free the old page.. */
+               new_page = old_page;
+       }
+       spin_unlock(&mm->page_table_lock);
+       page_cache_release(new_page);
+       page_cache_release(old_page);
+       return 1;       /* Minor fault */
+
+bad_wp_page:
+       spin_unlock(&mm->page_table_lock);
+       printk("do_wp_page: bogus page at address %08lx (page 0x%lx)\n",address,(unsigned long)old_page);
+       return -1;
+no_mem:
+       page_cache_release(old_page);
+       return -1;
+}
+
+static void vmtruncate_list(struct vm_area_struct *mpnt, unsigned long pgoff)
+{
+       do {
+               struct mm_struct *mm = mpnt->vm_mm;
+               unsigned long start = mpnt->vm_start;
+               unsigned long end = mpnt->vm_end;
+               unsigned long len = end - start;
+               unsigned long diff;
+
+               /* mapping wholly truncated? */
+               if (mpnt->vm_pgoff >= pgoff) {
+                       zap_page_range(mm, start, len);
+                       continue;
+               }
+
+               /* mapping wholly unaffected? */
+               len = len >> PAGE_SHIFT;
+               diff = pgoff - mpnt->vm_pgoff;
+               if (diff >= len)
+                       continue;
+
+               /* Ok, partially affected.. */
+               start += diff << PAGE_SHIFT;
+               len = (len - diff) << PAGE_SHIFT;
+               zap_page_range(mm, start, len);
+       } while ((mpnt = mpnt->vm_next_share) != NULL);
+}
+
+/*
+ * Handle all mappings that got truncated by a "truncate()"
+ * system call.
+ *
+ * NOTE! We have to be ready to update the memory sharing
+ * between the file and the memory map for a potential last
+ * incomplete page.  Ugly, but necessary.
+ */
+int vmtruncate(struct inode * inode, loff_t offset)
+{
+       unsigned long pgoff;
+       struct address_space *mapping = inode->i_mapping;
+       unsigned long limit;
+
+       if (inode->i_size < offset)
+               goto do_expand;
+       inode->i_size = offset;
+       spin_lock(&mapping->i_shared_lock);
+       if (!mapping->i_mmap && !mapping->i_mmap_shared)
+               goto out_unlock;
+
+       pgoff = (offset + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
+       if (mapping->i_mmap != NULL)
+               vmtruncate_list(mapping->i_mmap, pgoff);
+       if (mapping->i_mmap_shared != NULL)
+               vmtruncate_list(mapping->i_mmap_shared, pgoff);
+
+out_unlock:
+       spin_unlock(&mapping->i_shared_lock);
+       truncate_inode_pages(mapping, offset);
+       goto out_truncate;
+
+do_expand:
+       limit = current->rlim[RLIMIT_FSIZE].rlim_cur;
+       if (limit != RLIM_INFINITY && offset > limit)
+               goto out_sig;
+       if (offset > inode->i_sb->s_maxbytes)
+               goto out;
+       inode->i_size = offset;
+
+out_truncate:
+       if (inode->i_op && inode->i_op->truncate) {
+               lock_kernel();
+               inode->i_op->truncate(inode);
+               unlock_kernel();
+       }
+       return 0;
+out_sig:
+       send_sig(SIGXFSZ, current, 0);
+out:
+       return -EFBIG;
+}
+
+/* 
+ * Primitive swap readahead code. We simply read an aligned block of
+ * (1 << page_cluster) entries in the swap area. This method is chosen
+ * because it doesn't cost us any seek time.  We also make sure to queue
+ * the 'original' request together with the readahead ones...  
+ */
+void swapin_readahead(swp_entry_t entry)
+{
+       int i, num;
+       struct page *new_page;
+       unsigned long offset;
+
+       /*
+        * Get the number of handles we should do readahead io to.
+        */
+       num = valid_swaphandles(entry, &offset);
+       for (i = 0; i < num; offset++, i++) {
+               /* Ok, do the async read-ahead now */
+               new_page = read_swap_cache_async(SWP_ENTRY(SWP_TYPE(entry), offset));
+               if (!new_page)
+                       break;
+               page_cache_release(new_page);
+       }
+       return;
+}
+
+/*
+ * We hold the mm semaphore and the page_table_lock on entry and
+ * should release the pagetable lock on exit..
+ */
+static int do_swap_page(struct mm_struct * mm,
+       struct vm_area_struct * vma, unsigned long address,
+       pte_t * page_table, pte_t orig_pte, int write_access)
+{
+       struct page *page;
+       swp_entry_t entry = pte_to_swp_entry(orig_pte);
+       pte_t pte;
+       int ret = 1;
+
+       spin_unlock(&mm->page_table_lock);
+       page = lookup_swap_cache(entry);
+       if (!page) {
+               swapin_readahead(entry);
+               page = read_swap_cache_async(entry);
+               if (!page) {
+                       /*
+                        * Back out if somebody else faulted in this pte while
+                        * we released the page table lock.
+                        */
+                       int retval;
+                       spin_lock(&mm->page_table_lock);
+                       retval = pte_same(*page_table, orig_pte) ? -1 : 1;
+                       spin_unlock(&mm->page_table_lock);
+                       return retval;
+               }
+
+               /* Had to read the page from swap area: Major fault */
+               ret = 2;
+       }
+
+       mark_page_accessed(page);
+
+       lock_page(page);
+
+       /*
+        * Back out if somebody else faulted in this pte while we
+        * released the page table lock.
+        */
+       spin_lock(&mm->page_table_lock);
+       if (!pte_same(*page_table, orig_pte)) {
+               spin_unlock(&mm->page_table_lock);
+               unlock_page(page);
+               page_cache_release(page);
+               return 1;
+       }
+
+       /* The page isn't present yet, go ahead with the fault. */
+               
+       swap_free(entry);
+       if (vm_swap_full())
+               remove_exclusive_swap_page(page);
+
+       mm->rss++;
+       pte = mk_pte(page, vma->vm_page_prot);
+       if (write_access && can_share_swap_page(page))
+               pte = pte_mkdirty(pte_mkwrite(pte));
+       unlock_page(page);
+
+       flush_page_to_ram(page);
+       flush_icache_page(vma, page);
+       set_pte(page_table, pte);
+
+       /* No need to invalidate - it was non-present before */
+       update_mmu_cache(vma, address, pte);
+       XENO_flush_page_update_queue();
+       spin_unlock(&mm->page_table_lock);
+       return ret;
+}
+
+/*
+ * We are called with the MM semaphore and page_table_lock
+ * spinlock held to protect against concurrent faults in
+ * multithreaded programs. 
+ */
+static int do_anonymous_page(struct mm_struct * mm, struct vm_area_struct * vma, pte_t *page_table, int write_access, unsigned long addr)
+{
+       pte_t entry;
+
+       /* Read-only mapping of ZERO_PAGE. */
+       entry = pte_wrprotect(mk_pte(ZERO_PAGE(addr), vma->vm_page_prot));
+
+       /* ..except if it's a write access */
+       if (write_access) {
+               struct page *page;
+
+               /* Allocate our own private page. */
+               spin_unlock(&mm->page_table_lock);
+
+               page = alloc_page(GFP_HIGHUSER);
+               if (!page)
+                       goto no_mem;
+               clear_user_highpage(page, addr);
+
+               spin_lock(&mm->page_table_lock);
+               if (!pte_none(*page_table)) {
+                       page_cache_release(page);
+                       spin_unlock(&mm->page_table_lock);
+                       return 1;
+               }
+               mm->rss++;
+               flush_page_to_ram(page);
+               entry = pte_mkwrite(pte_mkdirty(mk_pte(page, vma->vm_page_prot)));
+               lru_cache_add(page);
+               mark_page_accessed(page);
+       }
+
+       set_pte(page_table, entry);
+
+       /* No need to invalidate - it was non-present before */
+       update_mmu_cache(vma, addr, entry);
+       XENO_flush_page_update_queue();
+       spin_unlock(&mm->page_table_lock);
+       return 1;       /* Minor fault */
+
+no_mem:
+       return -1;
+}
+
+/*
+ * do_no_page() tries to create a new page mapping. It aggressively
+ * tries to share with existing pages, but makes a separate copy if
+ * the "write_access" parameter is true in order to avoid the next
+ * page fault.
+ *
+ * As this is called only for pages that do not currently exist, we
+ * do not need to flush old virtual caches or the TLB.
+ *
+ * This is called with the MM semaphore held and the page table
+ * spinlock held. Exit with the spinlock released.
+ */
+static int do_no_page(struct mm_struct * mm, struct vm_area_struct * vma,
+       unsigned long address, int write_access, pte_t *page_table)
+{
+       struct page * new_page;
+       pte_t entry;
+
+       if (!vma->vm_ops || !vma->vm_ops->nopage)
+               return do_anonymous_page(mm, vma, page_table, write_access, address);
+       spin_unlock(&mm->page_table_lock);
+
+       new_page = vma->vm_ops->nopage(vma, address & PAGE_MASK, 0);
+
+       if (new_page == NULL)   /* no page was available -- SIGBUS */
+               return 0;
+       if (new_page == NOPAGE_OOM)
+               return -1;
+
+       /*
+        * Should we do an early C-O-W break?
+        */
+       if (write_access && !(vma->vm_flags & VM_SHARED)) {
+               struct page * page = alloc_page(GFP_HIGHUSER);
+               if (!page) {
+                       page_cache_release(new_page);
+                       return -1;
+               }
+               copy_user_highpage(page, new_page, address);
+               page_cache_release(new_page);
+               lru_cache_add(page);
+               new_page = page;
+       }
+
+       spin_lock(&mm->page_table_lock);
+       /*
+        * This silly early PAGE_DIRTY setting removes a race
+        * due to the bad i386 page protection. But it's valid
+        * for other architectures too.
+        *
+        * Note that if write_access is true, we either now have
+        * an exclusive copy of the page, or this is a shared mapping,
+        * so we can make it writable and dirty to avoid having to
+        * handle that later.
+        */
+       /* Only go through if we didn't race with anybody else... */
+       if (pte_none(*page_table)) {
+               ++mm->rss;
+               flush_page_to_ram(new_page);
+               flush_icache_page(vma, new_page);
+               entry = mk_pte(new_page, vma->vm_page_prot);
+               if (write_access)
+                       entry = pte_mkwrite(pte_mkdirty(entry));
+               set_pte(page_table, entry);
+       } else {
+               /* One of our sibling threads was faster, back out. */
+               page_cache_release(new_page);
+               spin_unlock(&mm->page_table_lock);
+               return 1;
+       }
+
+       /* no need to invalidate: a not-present page shouldn't be cached */
+       update_mmu_cache(vma, address, entry);
+       XENO_flush_page_update_queue();
+       spin_unlock(&mm->page_table_lock);
+       return 2;       /* Major fault */
+}
+
+/*
+ * These routines also need to handle stuff like marking pages dirty
+ * and/or accessed for architectures that don't do it in hardware (most
+ * RISC architectures).  The early dirtying is also good on the i386.
+ *
+ * There is also a hook called "update_mmu_cache()" that architectures
+ * with external mmu caches can use to update those (ie the Sparc or
+ * PowerPC hashed page tables that act as extended TLBs).
+ *
+ * Note the "page_table_lock". It is to protect against kswapd removing
+ * pages from under us. Note that kswapd only ever _removes_ pages, never
+ * adds them. As such, once we have noticed that the page is not present,
+ * we can drop the lock early.
+ *
+ * The adding of pages is protected by the MM semaphore (which we hold),
+ * so we don't need to worry about a page being suddenly been added into
+ * our VM.
+ *
+ * We enter with the pagetable spinlock held, we are supposed to
+ * release it when done.
+ */
+static inline int handle_pte_fault(struct mm_struct *mm,
+       struct vm_area_struct * vma, unsigned long address,
+       int write_access, pte_t * pte)
+{
+       pte_t entry;
+
+       entry = *pte;
+       if (!pte_present(entry)) {
+               /*
+                * If it truly wasn't present, we know that kswapd
+                * and the PTE updates will not touch it later. So
+                * drop the lock.
+                */
+               if (pte_none(entry))
+                       return do_no_page(mm, vma, address, write_access, pte);
+               return do_swap_page(mm, vma, address, pte, entry, write_access);
+       }
+
+       if (write_access) {
+               if (!pte_write(entry))
+                       return do_wp_page(mm, vma, address, pte, entry);
+
+               entry = pte_mkdirty(entry);
+       }
+       entry = pte_mkyoung(entry);
+       establish_pte(vma, address, pte, entry);
+       XENO_flush_page_update_queue();
+       spin_unlock(&mm->page_table_lock);
+       return 1;
+}
+
+/*
+ * By the time we get here, we already hold the mm semaphore
+ */
+int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct * vma,
+       unsigned long address, int write_access)
+{
+       pgd_t *pgd;
+       pmd_t *pmd;
+
+       current->state = TASK_RUNNING;
+       pgd = pgd_offset(mm, address);
+
+       /*
+        * We need the page table lock to synchronize with kswapd
+        * and the SMP-safe atomic PTE updates.
+        */
+       spin_lock(&mm->page_table_lock);
+       pmd = pmd_alloc(mm, pgd, address);
+
+       if (pmd) {
+               pte_t * pte = pte_alloc(mm, pmd, address);
+               if (pte)
+                       return handle_pte_fault(mm, vma, address, write_access, pte);
+       }
+       spin_unlock(&mm->page_table_lock);
+       return -1;
+}
+
+/*
+ * Allocate page middle directory.
+ *
+ * We've already handled the fast-path in-line, and we own the
+ * page table lock.
+ *
+ * On a two-level page table, this ends up actually being entirely
+ * optimized away.
+ */
+pmd_t *__pmd_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)
+{
+       pmd_t *new;
+
+       /* "fast" allocation can happen without dropping the lock.. */
+       new = pmd_alloc_one_fast(mm, address);
+       if (!new) {
+               spin_unlock(&mm->page_table_lock);
+               new = pmd_alloc_one(mm, address);
+               spin_lock(&mm->page_table_lock);
+               if (!new)
+                       return NULL;
+
+               /*
+                * Because we dropped the lock, we should re-check the
+                * entry, as somebody else could have populated it..
+                */
+               if (!pgd_none(*pgd)) {
+                       pmd_free(new);
+                       goto out;
+               }
+       }
+       pgd_populate(mm, pgd, new);
+out:
+       return pmd_offset(pgd, address);
+}
+
+/*
+ * Allocate the page table directory.
+ *
+ * We've already handled the fast-path in-line, and we own the
+ * page table lock.
+ */
+pte_t *pte_alloc(struct mm_struct *mm, pmd_t *pmd, unsigned long address)
+{
+       if (pmd_none(*pmd)) {
+               pte_t *new;
+
+               /* "fast" allocation can happen without dropping the lock.. */
+               new = pte_alloc_one_fast(mm, address);
+               if (!new) {
+                       XENO_flush_page_update_queue();
+                       spin_unlock(&mm->page_table_lock);
+                       new = pte_alloc_one(mm, address);
+                       spin_lock(&mm->page_table_lock);
+                       if (!new)
+                               return NULL;
+
+                       /*
+                        * Because we dropped the lock, we should re-check the
+                        * entry, as somebody else could have populated it..
+                        */
+                       if (!pmd_none(*pmd)) {
+                               pte_free(new);
+                               goto out;
+                       }
+               }
+               pmd_populate(mm, pmd, new);
+       }
+out:
+       return pte_offset(pmd, address);
+}
+
+int make_pages_present(unsigned long addr, unsigned long end)
+{
+       int ret, len, write;
+       struct vm_area_struct * vma;
+
+       vma = find_vma(current->mm, addr);
+       write = (vma->vm_flags & VM_WRITE) != 0;
+       if (addr >= end)
+               BUG();
+       if (end > vma->vm_end)
+               BUG();
+       len = (end+PAGE_SIZE-1)/PAGE_SIZE-addr/PAGE_SIZE;
+       ret = get_user_pages(current, current->mm, addr,
+                       len, write, 0, NULL, NULL);
+       return ret == len ? 0 : -1;
+}
+
+struct page * vmalloc_to_page(void * vmalloc_addr)
+{
+       unsigned long addr = (unsigned long) vmalloc_addr;
+       struct page *page = NULL;
+       pmd_t *pmd;
+       pte_t *pte;
+       pgd_t *pgd;
+       
+       pgd = pgd_offset_k(addr);
+       if (!pgd_none(*pgd)) {
+               pmd = pmd_offset(pgd, addr);
+               if (!pmd_none(*pmd)) {
+                       pte = pte_offset(pmd, addr);
+                       if (pte_present(*pte)) {
+                               page = pte_page(*pte);
+                       }
+               }
+       }
+       return page;
+}
diff --git a/xenolinux-2.4.22-sparse/mm/mprotect.c b/xenolinux-2.4.22-sparse/mm/mprotect.c
new file mode 100644 (file)
index 0000000..a6f355d
--- /dev/null
@@ -0,0 +1,344 @@
+/*
+ *     linux/mm/mprotect.c
+ *
+ *  (C) Copyright 1994 Linus Torvalds
+ */
+#include <linux/slab.h>
+#include <linux/smp_lock.h>
+#include <linux/shm.h>
+#include <linux/mman.h>
+
+#include <asm/uaccess.h>
+#include <asm/pgalloc.h>
+#include <asm/pgtable.h>
+
+static inline void change_pte_range(pmd_t * pmd, unsigned long address,
+       unsigned long size, pgprot_t newprot)
+{
+       pte_t * pte;
+       unsigned long end;
+
+       if (pmd_none(*pmd))
+               return;
+       if (pmd_bad(*pmd)) {
+               pmd_ERROR(*pmd);
+               pmd_clear(pmd);
+               return;
+       }
+       pte = pte_offset(pmd, address);
+       address &= ~PMD_MASK;
+       end = address + size;
+       if (end > PMD_SIZE)
+               end = PMD_SIZE;
+       do {
+               if (pte_present(*pte)) {
+                       pte_t entry;
+
+                       /* Avoid an SMP race with hardware updated dirty/clean
+                        * bits by wiping the pte and then setting the new pte
+                        * into place.
+                        */
+                       entry = ptep_get_and_clear(pte);
+                       set_pte(pte, pte_modify(entry, newprot));
+               }
+               address += PAGE_SIZE;
+               pte++;
+       } while (address && (address < end));
+}
+
+static inline void change_pmd_range(pgd_t * pgd, unsigned long address,
+       unsigned long size, pgprot_t newprot)
+{
+       pmd_t * pmd;
+       unsigned long end;
+
+       if (pgd_none(*pgd))
+               return;
+       if (pgd_bad(*pgd)) {
+               pgd_ERROR(*pgd);
+               pgd_clear(pgd);
+               return;
+       }
+       pmd = pmd_offset(pgd, address);
+       address &= ~PGDIR_MASK;
+       end = address + size;
+       if (end > PGDIR_SIZE)
+               end = PGDIR_SIZE;
+       do {
+               change_pte_range(pmd, address, end - address, newprot);
+               address = (address + PMD_SIZE) & PMD_MASK;
+               pmd++;
+       } while (address && (address < end));
+}
+
+static void change_protection(unsigned long start, unsigned long end, pgprot_t newprot)
+{
+       pgd_t *dir;
+       unsigned long beg = start;
+
+       dir = pgd_offset(current->mm, start);
+       flush_cache_range(current->mm, beg, end);
+       if (start >= end)
+               BUG();
+       spin_lock(&current->mm->page_table_lock);
+       do {
+               change_pmd_range(dir, start, end - start, newprot);
+               start = (start + PGDIR_SIZE) & PGDIR_MASK;
+               dir++;
+       } while (start && (start < end));
+       spin_unlock(&current->mm->page_table_lock);
+       flush_tlb_range(current->mm, beg, end);
+       return;
+}
+
+static inline int mprotect_fixup_all(struct vm_area_struct * vma, struct vm_area_struct ** pprev,
+       int newflags, pgprot_t prot)
+{
+       struct vm_area_struct * prev = *pprev;
+       struct mm_struct * mm = vma->vm_mm;
+
+       if (prev && prev->vm_end == vma->vm_start && can_vma_merge(prev, newflags) &&
+           !vma->vm_file && !(vma->vm_flags & VM_SHARED)) {
+               spin_lock(&mm->page_table_lock);
+               prev->vm_end = vma->vm_end;
+               __vma_unlink(mm, vma, prev);
+               spin_unlock(&mm->page_table_lock);
+
+               kmem_cache_free(vm_area_cachep, vma);
+               mm->map_count--;
+
+               return 0;
+       }
+
+       spin_lock(&mm->page_table_lock);
+       vma->vm_flags = newflags;
+       vma->vm_page_prot = prot;
+       spin_unlock(&mm->page_table_lock);
+
+       *pprev = vma;
+
+       return 0;
+}
+
+static inline int mprotect_fixup_start(struct vm_area_struct * vma, struct vm_area_struct ** pprev,
+       unsigned long end,
+       int newflags, pgprot_t prot)
+{
+       struct vm_area_struct * n, * prev = *pprev;
+
+       *pprev = vma;
+
+       if (prev && prev->vm_end == vma->vm_start && can_vma_merge(prev, newflags) &&
+           !vma->vm_file && !(vma->vm_flags & VM_SHARED)) {
+               spin_lock(&vma->vm_mm->page_table_lock);
+               prev->vm_end = end;
+               vma->vm_start = end;
+               spin_unlock(&vma->vm_mm->page_table_lock);
+
+               return 0;
+       }
+       n = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
+       if (!n)
+               return -ENOMEM;
+       *n = *vma;
+       n->vm_end = end;
+       n->vm_flags = newflags;
+       n->vm_raend = 0;
+       n->vm_page_prot = prot;
+       if (n->vm_file)
+               get_file(n->vm_file);
+       if (n->vm_ops && n->vm_ops->open)
+               n->vm_ops->open(n);
+       vma->vm_pgoff += (end - vma->vm_start) >> PAGE_SHIFT;
+       lock_vma_mappings(vma);
+       spin_lock(&vma->vm_mm->page_table_lock);
+       vma->vm_start = end;
+       __insert_vm_struct(current->mm, n);
+       spin_unlock(&vma->vm_mm->page_table_lock);
+       unlock_vma_mappings(vma);
+
+       return 0;
+}
+
+static inline int mprotect_fixup_end(struct vm_area_struct * vma, struct vm_area_struct ** pprev,
+       unsigned long start,
+       int newflags, pgprot_t prot)
+{
+       struct vm_area_struct * n;
+
+       n = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL);
+       if (!n)
+               return -ENOMEM;
+       *n = *vma;
+       n->vm_start = start;
+       n->vm_pgoff += (n->vm_start - vma->vm_start) >> PAGE_SHIFT;
+       n->vm_flags = newflags;
+       n->vm_raend = 0;
+       n->vm_page_prot = prot;
+       if (n->vm_file)
+               get_file(n->vm_file);
+       if (n->vm_ops && n->vm_ops->open)
+               n->vm_ops->open(n);
+       lock_vma_mappings(vma);
+       spin_lock(&vma->vm_mm->page_table_lock);
+       vma->vm_end = start;
+       __insert_vm_struct(current->mm, n);
+       spin_unlock(&vma->vm_mm->page_table_lock);
+       unlock_vma_mappings(vma);
+
+       *pprev = n;
+
+       return 0;
+}
+
+static inline int mprotect_fixup_middle(struct vm_area_struct * vma, struct vm_area_struct ** pprev,
+       unsigned long start, unsigned long end,
+       int newflags, pgprot_t prot)
+{
+       struct vm_area_struct * left, * right;
+
+       left = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
+       if (!left)
+               return -ENOMEM;
+       right = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
+       if (!right) {
+               kmem_cache_free(vm_area_cachep, left);
+               return -ENOMEM;
+       }
+       *left = *vma;
+       *right = *vma;
+       left->vm_end = start;
+       right->vm_start = end;
+       right->vm_pgoff += (right->vm_start - left->vm_start) >> PAGE_SHIFT;
+       left->vm_raend = 0;
+       right->vm_raend = 0;
+       if (vma->vm_file)
+               atomic_add(2,&vma->vm_file->f_count);
+       if (vma->vm_ops && vma->vm_ops->open) {
+               vma->vm_ops->open(left);
+               vma->vm_ops->open(right);
+       }
+       vma->vm_pgoff += (start - vma->vm_start) >> PAGE_SHIFT;
+       vma->vm_raend = 0;
+       vma->vm_page_prot = prot;
+       lock_vma_mappings(vma);
+       spin_lock(&vma->vm_mm->page_table_lock);
+       vma->vm_start = start;
+       vma->vm_end = end;
+       vma->vm_flags = newflags;
+       __insert_vm_struct(current->mm, left);
+       __insert_vm_struct(current->mm, right);
+       spin_unlock(&vma->vm_mm->page_table_lock);
+       unlock_vma_mappings(vma);
+
+       *pprev = right;
+
+       return 0;
+}
+
+static int mprotect_fixup(struct vm_area_struct * vma, struct vm_area_struct ** pprev,
+       unsigned long start, unsigned long end, unsigned int newflags)
+{
+       pgprot_t newprot;
+       int error;
+
+       if (newflags == vma->vm_flags) {
+               *pprev = vma;
+               return 0;
+       }
+       newprot = protection_map[newflags & 0xf];
+       if (start == vma->vm_start) {
+               if (end == vma->vm_end)
+                       error = mprotect_fixup_all(vma, pprev, newflags, newprot);
+               else
+                       error = mprotect_fixup_start(vma, pprev, end, newflags, newprot);
+       } else if (end == vma->vm_end)
+               error = mprotect_fixup_end(vma, pprev, start, newflags, newprot);
+       else
+               error = mprotect_fixup_middle(vma, pprev, start, end, newflags, newprot);
+
+       if (error)
+               return error;
+
+       change_protection(start, end, newprot);
+       return 0;
+}
+
+asmlinkage long sys_mprotect(unsigned long start, size_t len, unsigned long prot)
+{
+       unsigned long nstart, end, tmp;
+       struct vm_area_struct * vma, * next, * prev;
+       int error = -EINVAL;
+
+       if (start & ~PAGE_MASK)
+               return -EINVAL;
+       len = PAGE_ALIGN(len);
+       end = start + len;
+       if (end < start)
+               return -EINVAL;
+       if (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC))
+               return -EINVAL;
+       if (end == start)
+               return 0;
+
+       down_write(&current->mm->mmap_sem);
+
+       vma = find_vma_prev(current->mm, start, &prev);
+       error = -ENOMEM;
+       if (!vma || vma->vm_start > start)
+               goto out;
+
+#if defined(CONFIG_XENO_PRIV)
+       /* mprotect() unsupported for I/O mappings in Xenolinux. */
+       error = -EINVAL;
+       if (vma->vm_flags & VM_IO)
+               goto out;
+#endif
+
+       for (nstart = start ; ; ) {
+               unsigned int newflags;
+               int last = 0;
+
+               /* Here we know that  vma->vm_start <= nstart < vma->vm_end. */
+
+               newflags = prot | (vma->vm_flags & ~(PROT_READ | PROT_WRITE | PROT_EXEC));
+               if ((newflags & ~(newflags >> 4)) & 0xf) {
+                       error = -EACCES;
+                       goto out;
+               }
+
+               if (vma->vm_end > end) {
+                       error = mprotect_fixup(vma, &prev, nstart, end, newflags);
+                       goto out;
+               }
+               if (vma->vm_end == end)
+                       last = 1;
+
+               tmp = vma->vm_end;
+               next = vma->vm_next;
+               error = mprotect_fixup(vma, &prev, nstart, tmp, newflags);
+               if (error)
+                       goto out;
+               if (last)
+                       break;
+               nstart = tmp;
+               vma = next;
+               if (!vma || vma->vm_start != nstart) {
+                       error = -ENOMEM;
+                       goto out;
+               }
+       }
+       if (next && prev->vm_end == next->vm_start && can_vma_merge(next, prev->vm_flags) &&
+           !prev->vm_file && !(prev->vm_flags & VM_SHARED)) {
+               spin_lock(&prev->vm_mm->page_table_lock);
+               prev->vm_end = next->vm_end;
+               __vma_unlink(prev->vm_mm, next, prev);
+               spin_unlock(&prev->vm_mm->page_table_lock);
+
+               kmem_cache_free(vm_area_cachep, next);
+               prev->vm_mm->map_count--;
+       }
+out:
+       up_write(&current->mm->mmap_sem);
+       return error;
+}
diff --git a/xenolinux-2.4.22-sparse/mm/mremap.c b/xenolinux-2.4.22-sparse/mm/mremap.c
new file mode 100644 (file)
index 0000000..f40f2ad
--- /dev/null
@@ -0,0 +1,366 @@
+/*
+ *     linux/mm/remap.c
+ *
+ *     (C) Copyright 1996 Linus Torvalds
+ */
+
+#include <linux/slab.h>
+#include <linux/smp_lock.h>
+#include <linux/shm.h>
+#include <linux/mman.h>
+#include <linux/swap.h>
+
+#include <asm/uaccess.h>
+#include <asm/pgalloc.h>
+
+extern int vm_enough_memory(long pages);
+
+static inline pte_t *get_one_pte(struct mm_struct *mm, unsigned long addr)
+{
+       pgd_t * pgd;
+       pmd_t * pmd;
+       pte_t * pte = NULL;
+
+       pgd = pgd_offset(mm, addr);
+       if (pgd_none(*pgd))
+               goto end;
+       if (pgd_bad(*pgd)) {
+               pgd_ERROR(*pgd);
+               pgd_clear(pgd);
+               goto end;
+       }
+
+       pmd = pmd_offset(pgd, addr);
+       if (pmd_none(*pmd))
+               goto end;
+       if (pmd_bad(*pmd)) {
+               pmd_ERROR(*pmd);
+               pmd_clear(pmd);
+               goto end;
+       }
+
+       pte = pte_offset(pmd, addr);
+       if (pte_none(*pte))
+               pte = NULL;
+end:
+       return pte;
+}
+
+static inline pte_t *alloc_one_pte(struct mm_struct *mm, unsigned long addr)
+{
+       pmd_t * pmd;
+       pte_t * pte = NULL;
+
+       pmd = pmd_alloc(mm, pgd_offset(mm, addr), addr);
+       if (pmd)
+               pte = pte_alloc(mm, pmd, addr);
+       return pte;
+}
+
+static inline int copy_one_pte(struct mm_struct *mm, pte_t * src, pte_t * dst)
+{
+       int error = 0;
+       pte_t pte;
+
+       if (!pte_none(*src)) {
+               pte = ptep_get_and_clear(src);
+               if (!dst) {
+                       /* No dest?  We must put it back. */
+                       dst = src;
+                       error++;
+               }
+               set_pte(dst, pte);
+       }
+       return error;
+}
+
+static int move_one_page(struct mm_struct *mm, unsigned long old_addr, unsigned long new_addr)
+{
+       int error = 0;
+       pte_t * src;
+
+       spin_lock(&mm->page_table_lock);
+       src = get_one_pte(mm, old_addr);
+       if (src)
+               error = copy_one_pte(mm, src, alloc_one_pte(mm, new_addr));
+       spin_unlock(&mm->page_table_lock);
+       return error;
+}
+
+static int move_page_tables(struct mm_struct * mm,
+       unsigned long new_addr, unsigned long old_addr, unsigned long len)
+{
+       unsigned long offset = len;
+
+       flush_cache_range(mm, old_addr, old_addr + len);
+
+       /*
+        * This is not the clever way to do this, but we're taking the
+        * easy way out on the assumption that most remappings will be
+        * only a few pages.. This also makes error recovery easier.
+        */
+       while (offset) {
+               offset -= PAGE_SIZE;
+               if (move_one_page(mm, old_addr + offset, new_addr + offset))
+                       goto oops_we_failed;
+       }
+       flush_tlb_range(mm, old_addr, old_addr + len);
+       return 0;
+
+       /*
+        * Ok, the move failed because we didn't have enough pages for
+        * the new page table tree. This is unlikely, but we have to
+        * take the possibility into account. In that case we just move
+        * all the pages back (this will work, because we still have
+        * the old page tables)
+        */
+oops_we_failed:
+       XENO_flush_page_update_queue();
+       flush_cache_range(mm, new_addr, new_addr + len);
+       while ((offset += PAGE_SIZE) < len)
+               move_one_page(mm, new_addr + offset, old_addr + offset);
+       XENO_flush_page_update_queue();
+       zap_page_range(mm, new_addr, len);
+       return -1;
+}
+
+static inline unsigned long move_vma(struct vm_area_struct * vma,
+       unsigned long addr, unsigned long old_len, unsigned long new_len,
+       unsigned long new_addr)
+{
+       struct mm_struct * mm = vma->vm_mm;
+       struct vm_area_struct * new_vma, * next, * prev;
+       int allocated_vma;
+
+       new_vma = NULL;
+       next = find_vma_prev(mm, new_addr, &prev);
+       if (next) {
+               if (prev && prev->vm_end == new_addr &&
+                   can_vma_merge(prev, vma->vm_flags) && !vma->vm_file && !(vma->vm_flags & VM_SHARED)) {
+                       spin_lock(&mm->page_table_lock);
+                       prev->vm_end = new_addr + new_len;
+                       spin_unlock(&mm->page_table_lock);
+                       new_vma = prev;
+                       if (next != prev->vm_next)
+                               BUG();
+                       if (prev->vm_end == next->vm_start && can_vma_merge(next, prev->vm_flags)) {
+                               spin_lock(&mm->page_table_lock);
+                               prev->vm_end = next->vm_end;
+                               __vma_unlink(mm, next, prev);
+                               spin_unlock(&mm->page_table_lock);
+
+                               mm->map_count--;
+                               kmem_cache_free(vm_area_cachep, next);
+                       }
+               } else if (next->vm_start == new_addr + new_len &&
+                          can_vma_merge(next, vma->vm_flags) && !vma->vm_file && !(vma->vm_flags & VM_SHARED)) {
+                       spin_lock(&mm->page_table_lock);
+                       next->vm_start = new_addr;
+                       spin_unlock(&mm->page_table_lock);
+                       new_vma = next;
+               }
+       } else {
+               prev = find_vma(mm, new_addr-1);
+               if (prev && prev->vm_end == new_addr &&
+                   can_vma_merge(prev, vma->vm_flags) && !vma->vm_file && !(vma->vm_flags & VM_SHARED)) {
+                       spin_lock(&mm->page_table_lock);
+                       prev->vm_end = new_addr + new_len;
+                       spin_unlock(&mm->page_table_lock);
+                       new_vma = prev;
+               }
+       }
+
+       allocated_vma = 0;
+       if (!new_vma) {
+               new_vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
+               if (!new_vma)
+                       goto out;
+               allocated_vma = 1;
+       }
+
+       if (!move_page_tables(current->mm, new_addr, addr, old_len)) {
+               unsigned long vm_locked = vma->vm_flags & VM_LOCKED;
+
+               if (allocated_vma) {
+                       *new_vma = *vma;
+                       new_vma->vm_start = new_addr;
+                       new_vma->vm_end = new_addr+new_len;
+                       new_vma->vm_pgoff += (addr-vma->vm_start) >> PAGE_SHIFT;
+                       new_vma->vm_raend = 0;
+                       if (new_vma->vm_file)
+                               get_file(new_vma->vm_file);
+                       if (new_vma->vm_ops && new_vma->vm_ops->open)
+                               new_vma->vm_ops->open(new_vma);
+                       insert_vm_struct(current->mm, new_vma);
+               }
+
+               do_munmap(current->mm, addr, old_len);
+
+               current->mm->total_vm += new_len >> PAGE_SHIFT;
+               if (vm_locked) {
+                       current->mm->locked_vm += new_len >> PAGE_SHIFT;
+                       if (new_len > old_len)
+                               make_pages_present(new_addr + old_len,
+                                                  new_addr + new_len);
+               }
+               return new_addr;
+       }
+       if (allocated_vma)
+               kmem_cache_free(vm_area_cachep, new_vma);
+ out:
+       return -ENOMEM;
+}
+
+/*
+ * Expand (or shrink) an existing mapping, potentially moving it at the
+ * same time (controlled by the MREMAP_MAYMOVE flag and available VM space)
+ *
+ * MREMAP_FIXED option added 5-Dec-1999 by Benjamin LaHaise
+ * This option implies MREMAP_MAYMOVE.
+ */
+unsigned long do_mremap(unsigned long addr,
+       unsigned long old_len, unsigned long new_len,
+       unsigned long flags, unsigned long new_addr)
+{
+       struct vm_area_struct *vma;
+       unsigned long ret = -EINVAL;
+
+       if (flags & ~(MREMAP_FIXED | MREMAP_MAYMOVE))
+               goto out;
+
+       if (addr & ~PAGE_MASK)
+               goto out;
+
+       old_len = PAGE_ALIGN(old_len);
+       new_len = PAGE_ALIGN(new_len);
+
+       /* new_addr is only valid if MREMAP_FIXED is specified */
+       if (flags & MREMAP_FIXED) {
+               if (new_addr & ~PAGE_MASK)
+                       goto out;
+               if (!(flags & MREMAP_MAYMOVE))
+                       goto out;
+
+               if (new_len > TASK_SIZE || new_addr > TASK_SIZE - new_len)
+                       goto out;
+
+               /* Check if the location we're moving into overlaps the
+                * old location at all, and fail if it does.
+                */
+               if ((new_addr <= addr) && (new_addr+new_len) > addr)
+                       goto out;
+
+               if ((addr <= new_addr) && (addr+old_len) > new_addr)
+                       goto out;
+
+               do_munmap(current->mm, new_addr, new_len);
+       }
+
+       /*
+        * Always allow a shrinking remap: that just unmaps
+        * the unnecessary pages..
+        */
+       ret = addr;
+       if (old_len >= new_len) {
+               do_munmap(current->mm, addr+new_len, old_len - new_len);
+               if (!(flags & MREMAP_FIXED) || (new_addr == addr))
+                       goto out;
+       }
+
+       /*
+        * Ok, we need to grow..  or relocate.
+        */
+       ret = -EFAULT;
+       vma = find_vma(current->mm, addr);
+       if (!vma || vma->vm_start > addr)
+               goto out;
+       /* We can't remap across vm area boundaries */
+       if (old_len > vma->vm_end - addr)
+               goto out;
+       if (vma->vm_flags & VM_DONTEXPAND) {
+               if (new_len > old_len)
+                       goto out;
+       }
+       if (vma->vm_flags & VM_LOCKED) {
+               unsigned long locked = current->mm->locked_vm << PAGE_SHIFT;
+               locked += new_len - old_len;
+               ret = -EAGAIN;
+               if (locked > current->rlim[RLIMIT_MEMLOCK].rlim_cur)
+                       goto out;
+       }
+       ret = -ENOMEM;
+       if ((current->mm->total_vm << PAGE_SHIFT) + (new_len - old_len)
+           > current->rlim[RLIMIT_AS].rlim_cur)
+               goto out;
+       /* Private writable mapping? Check memory availability.. */
+       if ((vma->vm_flags & (VM_SHARED | VM_WRITE)) == VM_WRITE &&
+           !(flags & MAP_NORESERVE)                             &&
+           !vm_enough_memory((new_len - old_len) >> PAGE_SHIFT))
+               goto out;
+
+#if defined(CONFIG_XENO_PRIV)
+       /* mremap() unsupported for I/O mappings in Xenolinux. */
+       ret = -EINVAL;
+       if (vma->vm_flags & VM_IO)
+               goto out;
+#endif
+
+       /* old_len exactly to the end of the area..
+        * And we're not relocating the area.
+        */
+       if (old_len == vma->vm_end - addr &&
+           !((flags & MREMAP_FIXED) && (addr != new_addr)) &&
+           (old_len != new_len || !(flags & MREMAP_MAYMOVE))) {
+               unsigned long max_addr = TASK_SIZE;
+               if (vma->vm_next)
+                       max_addr = vma->vm_next->vm_start;
+               /* can we just expand the current mapping? */
+               if (max_addr - addr >= new_len) {
+                       int pages = (new_len - old_len) >> PAGE_SHIFT;
+                       spin_lock(&vma->vm_mm->page_table_lock);
+                       vma->vm_end = addr + new_len;
+                       spin_unlock(&vma->vm_mm->page_table_lock);
+                       current->mm->total_vm += pages;
+                       if (vma->vm_flags & VM_LOCKED) {
+                               current->mm->locked_vm += pages;
+                               make_pages_present(addr + old_len,
+                                                  addr + new_len);
+                       }
+                       ret = addr;
+                       goto out;
+               }
+       }
+
+       /*
+        * We weren't able to just expand or shrink the area,
+        * we need to create a new one and move it..
+        */
+       ret = -ENOMEM;
+       if (flags & MREMAP_MAYMOVE) {
+               if (!(flags & MREMAP_FIXED)) {
+                       unsigned long map_flags = 0;
+                       if (vma->vm_flags & VM_SHARED)
+                               map_flags |= MAP_SHARED;
+
+                       new_addr = get_unmapped_area(vma->vm_file, 0, new_len, vma->vm_pgoff, map_flags);
+                       ret = new_addr;
+                       if (new_addr & ~PAGE_MASK)
+                               goto out;
+               }
+               ret = move_vma(vma, addr, old_len, new_len, new_addr);
+       }
+out:
+       return ret;
+}
+
+asmlinkage unsigned long sys_mremap(unsigned long addr,
+       unsigned long old_len, unsigned long new_len,
+       unsigned long flags, unsigned long new_addr)
+{
+       unsigned long ret;
+
+       down_write(&current->mm->mmap_sem);
+       ret = do_mremap(addr, old_len, new_len, flags, new_addr);
+       up_write(&current->mm->mmap_sem);
+       return ret;
+}
diff --git a/xenolinux-2.4.22-sparse/mm/swapfile.c b/xenolinux-2.4.22-sparse/mm/swapfile.c
new file mode 100644 (file)
index 0000000..de04a37
--- /dev/null
@@ -0,0 +1,1267 @@
+/*
+ *  linux/mm/swapfile.c
+ *
+ *  Copyright (C) 1991, 1992, 1993, 1994  Linus Torvalds
+ *  Swap reorganised 29.12.95, Stephen Tweedie
+ */
+
+#include <linux/slab.h>
+#include <linux/smp_lock.h>
+#include <linux/kernel_stat.h>
+#include <linux/swap.h>
+#include <linux/swapctl.h>
+#include <linux/blkdev.h> /* for blk_size */
+#include <linux/vmalloc.h>
+#include <linux/pagemap.h>
+#include <linux/shm.h>
+
+#include <asm/pgtable.h>
+
+spinlock_t swaplock = SPIN_LOCK_UNLOCKED;
+unsigned int nr_swapfiles;
+int total_swap_pages;
+static int swap_overflow;
+
+static const char Bad_file[] = "Bad swap file entry ";
+static const char Unused_file[] = "Unused swap file entry ";
+static const char Bad_offset[] = "Bad swap offset entry ";
+static const char Unused_offset[] = "Unused swap offset entry ";
+
+struct swap_list_t swap_list = {-1, -1};
+
+struct swap_info_struct swap_info[MAX_SWAPFILES];
+
+#define SWAPFILE_CLUSTER 256
+
+static inline int scan_swap_map(struct swap_info_struct *si)
+{
+       unsigned long offset;
+       /* 
+        * We try to cluster swap pages by allocating them
+        * sequentially in swap.  Once we've allocated
+        * SWAPFILE_CLUSTER pages this way, however, we resort to
+        * first-free allocation, starting a new cluster.  This
+        * prevents us from scattering swap pages all over the entire
+        * swap partition, so that we reduce overall disk seek times
+        * between swap pages.  -- sct */
+       if (si->cluster_nr) {
+               while (si->cluster_next <= si->highest_bit) {
+                       offset = si->cluster_next++;
+                       if (si->swap_map[offset])
+                               continue;
+                       si->cluster_nr--;
+                       goto got_page;
+               }
+       }
+       si->cluster_nr = SWAPFILE_CLUSTER;
+
+       /* try to find an empty (even not aligned) cluster. */
+       offset = si->lowest_bit;
+ check_next_cluster:
+       if (offset+SWAPFILE_CLUSTER-1 <= si->highest_bit)
+       {
+               int nr;
+               for (nr = offset; nr < offset+SWAPFILE_CLUSTER; nr++)
+                       if (si->swap_map[nr])
+                       {
+                               offset = nr+1;
+                               goto check_next_cluster;
+                       }
+               /* We found a completly empty cluster, so start
+                * using it.
+                */
+               goto got_page;
+       }
+       /* No luck, so now go finegrined as usual. -Andrea */
+       for (offset = si->lowest_bit; offset <= si->highest_bit ; offset++) {
+               if (si->swap_map[offset])
+                       continue;
+               si->lowest_bit = offset+1;
+       got_page:
+               if (offset == si->lowest_bit)
+                       si->lowest_bit++;
+               if (offset == si->highest_bit)
+                       si->highest_bit--;
+               if (si->lowest_bit > si->highest_bit) {
+                       si->lowest_bit = si->max;
+                       si->highest_bit = 0;
+               }
+               si->swap_map[offset] = 1;
+               nr_swap_pages--;
+               si->cluster_next = offset+1;
+               return offset;
+       }
+       si->lowest_bit = si->max;
+       si->highest_bit = 0;
+       return 0;
+}
+
+swp_entry_t get_swap_page(void)
+{
+       struct swap_info_struct * p;
+       unsigned long offset;
+       swp_entry_t entry;
+       int type, wrapped = 0;
+
+       entry.val = 0;  /* Out of memory */
+       swap_list_lock();
+       type = swap_list.next;
+       if (type < 0)
+               goto out;
+       if (nr_swap_pages <= 0)
+               goto out;
+
+       while (1) {
+               p = &swap_info[type];
+               if ((p->flags & SWP_WRITEOK) == SWP_WRITEOK) {
+                       swap_device_lock(p);
+                       offset = scan_swap_map(p);
+                       swap_device_unlock(p);
+                       if (offset) {
+                               entry = SWP_ENTRY(type,offset);
+                               type = swap_info[type].next;
+                               if (type < 0 ||
+                                       p->prio != swap_info[type].prio) {
+                                               swap_list.next = swap_list.head;
+                               } else {
+                                       swap_list.next = type;
+                               }
+                               goto out;
+                       }
+               }
+               type = p->next;
+               if (!wrapped) {
+                       if (type < 0 || p->prio != swap_info[type].prio) {
+                               type = swap_list.head;
+                               wrapped = 1;
+                       }
+               } else
+                       if (type < 0)
+                               goto out;       /* out of swap space */
+       }
+out:
+       swap_list_unlock();
+       return entry;
+}
+
+static struct swap_info_struct * swap_info_get(swp_entry_t entry)
+{
+       struct swap_info_struct * p;
+       unsigned long offset, type;
+
+       if (!entry.val)
+               goto out;
+       type = SWP_TYPE(entry);
+       if (type >= nr_swapfiles)
+               goto bad_nofile;
+       p = & swap_info[type];
+       if (!(p->flags & SWP_USED))
+               goto bad_device;
+       offset = SWP_OFFSET(entry);
+       if (offset >= p->max)
+               goto bad_offset;
+       if (!p->swap_map[offset])
+               goto bad_free;
+       swap_list_lock();
+       if (p->prio > swap_info[swap_list.next].prio)
+               swap_list.next = type;
+       swap_device_lock(p);
+       return p;
+
+bad_free:
+       printk(KERN_ERR "swap_free: %s%08lx\n", Unused_offset, entry.val);
+       goto out;
+bad_offset:
+       printk(KERN_ERR "swap_free: %s%08lx\n", Bad_offset, entry.val);
+       goto out;
+bad_device:
+       printk(KERN_ERR "swap_free: %s%08lx\n", Unused_file, entry.val);
+       goto out;
+bad_nofile:
+       printk(KERN_ERR "swap_free: %s%08lx\n", Bad_file, entry.val);
+out:
+       return NULL;
+}      
+
+static void swap_info_put(struct swap_info_struct * p)
+{
+       swap_device_unlock(p);
+       swap_list_unlock();
+}
+
+static int swap_entry_free(struct swap_info_struct *p, unsigned long offset)
+{
+       int count = p->swap_map[offset];
+
+       if (count < SWAP_MAP_MAX) {
+               count--;
+               p->swap_map[offset] = count;
+               if (!count) {
+                       if (offset < p->lowest_bit)
+                               p->lowest_bit = offset;
+                       if (offset > p->highest_bit)
+                               p->highest_bit = offset;
+                       nr_swap_pages++;
+               }
+       }
+       return count;
+}
+
+/*
+ * Caller has made sure that the swapdevice corresponding to entry
+ * is still around or has not been recycled.
+ */
+void swap_free(swp_entry_t entry)
+{
+       struct swap_info_struct * p;
+
+       p = swap_info_get(entry);
+       if (p) {
+               swap_entry_free(p, SWP_OFFSET(entry));
+               swap_info_put(p);
+       }
+}
+
+/*
+ * Check if we're the only user of a swap page,
+ * when the page is locked.
+ */
+static int exclusive_swap_page(struct page *page)
+{
+       int retval = 0;
+       struct swap_info_struct * p;
+       swp_entry_t entry;
+
+       entry.val = page->index;
+       p = swap_info_get(entry);
+       if (p) {
+               /* Is the only swap cache user the cache itself? */
+               if (p->swap_map[SWP_OFFSET(entry)] == 1) {
+                       /* Recheck the page count with the pagecache lock held.. */
+                       spin_lock(&pagecache_lock);
+                       if (page_count(page) - !!page->buffers == 2)
+                               retval = 1;
+                       spin_unlock(&pagecache_lock);
+               }
+               swap_info_put(p);
+       }
+       return retval;
+}
+
+/*
+ * We can use this swap cache entry directly
+ * if there are no other references to it.
+ *
+ * Here "exclusive_swap_page()" does the real
+ * work, but we opportunistically check whether
+ * we need to get all the locks first..
+ */
+int can_share_swap_page(struct page *page)
+{
+       int retval = 0;
+
+       if (!PageLocked(page))
+               BUG();
+       switch (page_count(page)) {
+       case 3:
+               if (!page->buffers)
+                       break;
+               /* Fallthrough */
+       case 2:
+               if (!PageSwapCache(page))
+                       break;
+               retval = exclusive_swap_page(page);
+               break;
+       case 1:
+               if (PageReserved(page))
+                       break;
+               retval = 1;
+       }
+       return retval;
+}
+
+/*
+ * Work out if there are any other processes sharing this
+ * swap cache page. Free it if you can. Return success.
+ */
+int remove_exclusive_swap_page(struct page *page)
+{
+       int retval;
+       struct swap_info_struct * p;
+       swp_entry_t entry;
+
+       if (!PageLocked(page))
+               BUG();
+       if (!PageSwapCache(page))
+               return 0;
+       if (page_count(page) - !!page->buffers != 2)    /* 2: us + cache */
+               return 0;
+
+       entry.val = page->index;
+       p = swap_info_get(entry);
+       if (!p)
+               return 0;
+
+       /* Is the only swap cache user the cache itself? */
+       retval = 0;
+       if (p->swap_map[SWP_OFFSET(entry)] == 1) {
+               /* Recheck the page count with the pagecache lock held.. */
+               spin_lock(&pagecache_lock);
+               if (page_count(page) - !!page->buffers == 2) {
+                       __delete_from_swap_cache(page);
+                       SetPageDirty(page);
+                       retval = 1;
+               }
+               spin_unlock(&pagecache_lock);
+       }
+       swap_info_put(p);
+
+       if (retval) {
+               block_flushpage(page, 0);
+               swap_free(entry);
+               page_cache_release(page);
+       }
+
+       return retval;
+}
+
+/*
+ * Free the swap entry like above, but also try to
+ * free the page cache entry if it is the last user.
+ */
+void free_swap_and_cache(swp_entry_t entry)
+{
+       struct swap_info_struct * p;
+       struct page *page = NULL;
+
+       p = swap_info_get(entry);
+       if (p) {
+               if (swap_entry_free(p, SWP_OFFSET(entry)) == 1)
+                       page = find_trylock_page(&swapper_space, entry.val);
+               swap_info_put(p);
+       }
+       if (page) {
+               page_cache_get(page);
+               /* Only cache user (+us), or swap space full? Free it! */
+               if (page_count(page) - !!page->buffers == 2 || vm_swap_full()) {
+                       delete_from_swap_cache(page);
+                       SetPageDirty(page);
+               }
+               UnlockPage(page);
+               page_cache_release(page);
+       }
+}
+
+/*
+ * The swap entry has been read in advance, and we return 1 to indicate
+ * that the page has been used or is no longer needed.
+ *
+ * Always set the resulting pte to be nowrite (the same as COW pages
+ * after one process has exited).  We don't know just how many PTEs will
+ * share this swap entry, so be cautious and let do_wp_page work out
+ * what to do if a write is requested later.
+ */
+/* mmlist_lock and vma->vm_mm->page_table_lock are held */
+static inline void unuse_pte(struct vm_area_struct * vma, unsigned long address,
+       pte_t *dir, swp_entry_t entry, struct page* page)
+{
+       pte_t pte = *dir;
+
+       if (likely(pte_to_swp_entry(pte).val != entry.val))
+               return;
+       if (unlikely(pte_none(pte) || pte_present(pte)))
+               return;
+       get_page(page);
+       set_pte(dir, pte_mkold(mk_pte(page, vma->vm_page_prot)));
+       swap_free(entry);
+       ++vma->vm_mm->rss;
+}
+
+/* mmlist_lock and vma->vm_mm->page_table_lock are held */
+static inline void unuse_pmd(struct vm_area_struct * vma, pmd_t *dir,
+       unsigned long address, unsigned long size, unsigned long offset,
+       swp_entry_t entry, struct page* page)
+{
+       pte_t * pte;
+       unsigned long end;
+
+       if (pmd_none(*dir))
+               return;
+       if (pmd_bad(*dir)) {
+               pmd_ERROR(*dir);
+               pmd_clear(dir);
+               return;
+       }
+       pte = pte_offset(dir, address);
+       offset += address & PMD_MASK;
+       address &= ~PMD_MASK;
+       end = address + size;
+       if (end > PMD_SIZE)
+               end = PMD_SIZE;
+       do {
+               unuse_pte(vma, offset+address-vma->vm_start, pte, entry, page);
+               address += PAGE_SIZE;
+               pte++;
+       } while (address && (address < end));
+}
+
+/* mmlist_lock and vma->vm_mm->page_table_lock are held */
+static inline void unuse_pgd(struct vm_area_struct * vma, pgd_t *dir,
+       unsigned long address, unsigned long size,
+       swp_entry_t entry, struct page* page)
+{
+       pmd_t * pmd;
+       unsigned long offset, end;
+
+       if (pgd_none(*dir))
+               return;
+       if (pgd_bad(*dir)) {
+               pgd_ERROR(*dir);
+               pgd_clear(dir);
+               return;
+       }
+       pmd = pmd_offset(dir, address);
+       offset = address & PGDIR_MASK;
+       address &= ~PGDIR_MASK;
+       end = address + size;
+       if (end > PGDIR_SIZE)
+               end = PGDIR_SIZE;
+       if (address >= end)
+               BUG();
+       do {
+               unuse_pmd(vma, pmd, address, end - address, offset, entry,
+                         page);
+               address = (address + PMD_SIZE) & PMD_MASK;
+               pmd++;
+       } while (address && (address < end));
+}
+
+/* mmlist_lock and vma->vm_mm->page_table_lock are held */
+static void unuse_vma(struct vm_area_struct * vma, pgd_t *pgdir,
+                       swp_entry_t entry, struct page* page)
+{
+       unsigned long start = vma->vm_start, end = vma->vm_end;
+
+       if (start >= end)
+               BUG();
+       do {
+               unuse_pgd(vma, pgdir, start, end - start, entry, page);
+               start = (start + PGDIR_SIZE) & PGDIR_MASK;
+               pgdir++;
+       } while (start && (start < end));
+}
+
+static void unuse_process(struct mm_struct * mm,
+                       swp_entry_t entry, struct page* page)
+{
+       struct vm_area_struct* vma;
+
+       /*
+        * Go through process' page directory.
+        */
+       spin_lock(&mm->page_table_lock);
+       for (vma = mm->mmap; vma; vma = vma->vm_next) {
+               pgd_t * pgd = pgd_offset(mm, vma->vm_start);
+               unuse_vma(vma, pgd, entry, page);
+       }
+       XENO_flush_page_update_queue();
+       spin_unlock(&mm->page_table_lock);
+       return;
+}
+
+/*
+ * Scan swap_map from current position to next entry still in use.
+ * Recycle to start on reaching the end, returning 0 when empty.
+ */
+static int find_next_to_unuse(struct swap_info_struct *si, int prev)
+{
+       int max = si->max;
+       int i = prev;
+       int count;
+
+       /*
+        * No need for swap_device_lock(si) here: we're just looking
+        * for whether an entry is in use, not modifying it; false
+        * hits are okay, and sys_swapoff() has already prevented new
+        * allocations from this area (while holding swap_list_lock()).
+        */
+       for (;;) {
+               if (++i >= max) {
+                       if (!prev) {
+                               i = 0;
+                               break;
+                       }
+                       /*
+                        * No entries in use at top of swap_map,
+                        * loop back to start and recheck there.
+                        */
+                       max = prev + 1;
+                       prev = 0;
+                       i = 1;
+               }
+               count = si->swap_map[i];
+               if (count && count != SWAP_MAP_BAD)
+                       break;
+       }
+       return i;
+}
+
+/*
+ * We completely avoid races by reading each swap page in advance,
+ * and then search for the process using it.  All the necessary
+ * page table adjustments can then be made atomically.
+ */
+static int try_to_unuse(unsigned int type)
+{
+       struct swap_info_struct * si = &swap_info[type];
+       struct mm_struct *start_mm;
+       unsigned short *swap_map;
+       unsigned short swcount;
+       struct page *page;
+       swp_entry_t entry;
+       int i = 0;
+       int retval = 0;
+       int reset_overflow = 0;
+       int shmem;
+
+       /*
+        * When searching mms for an entry, a good strategy is to
+        * start at the first mm we freed the previous entry from
+        * (though actually we don't notice whether we or coincidence
+        * freed the entry).  Initialize this start_mm with a hold.
+        *
+        * A simpler strategy would be to start at the last mm we
+        * freed the previous entry from; but that would take less
+        * advantage of mmlist ordering (now preserved by swap_out()),
+        * which clusters forked address spaces together, most recent
+        * child immediately after parent.  If we race with dup_mmap(),
+        * we very much want to resolve parent before child, otherwise
+        * we may miss some entries: using last mm would invert that.
+        */
+       start_mm = &init_mm;
+       atomic_inc(&init_mm.mm_users);
+
+       /*
+        * Keep on scanning until all entries have gone.  Usually,
+        * one pass through swap_map is enough, but not necessarily:
+        * mmput() removes mm from mmlist before exit_mmap() and its
+        * zap_page_range().  That's not too bad, those entries are
+        * on their way out, and handled faster there than here.
+        * do_munmap() behaves similarly, taking the range out of mm's
+        * vma list before zap_page_range().  But unfortunately, when
+        * unmapping a part of a vma, it takes the whole out first,
+        * then reinserts what's left after (might even reschedule if
+        * open() method called) - so swap entries may be invisible
+        * to swapoff for a while, then reappear - but that is rare.
+        */
+       while ((i = find_next_to_unuse(si, i))) {
+               /* 
+                * Get a page for the entry, using the existing swap
+                * cache page if there is one.  Otherwise, get a clean
+                * page and read the swap into it. 
+                */
+               swap_map = &si->swap_map[i];
+               entry = SWP_ENTRY(type, i);
+               page = read_swap_cache_async(entry);
+               if (!page) {
+                       /*
+                        * Either swap_duplicate() failed because entry
+                        * has been freed independently, and will not be
+                        * reused since sys_swapoff() already disabled
+                        * allocation from here, or alloc_page() failed.
+                        */
+                       if (!*swap_map)
+                               continue;
+                       retval = -ENOMEM;
+                       break;
+               }
+
+               /*
+                * Don't hold on to start_mm if it looks like exiting.
+                */
+               if (atomic_read(&start_mm->mm_users) == 1) {
+                       mmput(start_mm);
+                       start_mm = &init_mm;
+                       atomic_inc(&init_mm.mm_users);
+               }
+
+               /*
+                * Wait for and lock page.  When do_swap_page races with
+                * try_to_unuse, do_swap_page can handle the fault much
+                * faster than try_to_unuse can locate the entry.  This
+                * apparently redundant "wait_on_page" lets try_to_unuse
+                * defer to do_swap_page in such a case - in some tests,
+                * do_swap_page and try_to_unuse repeatedly compete.
+                */
+               wait_on_page(page);
+               lock_page(page);
+
+               /*
+                * Remove all references to entry, without blocking.
+                * Whenever we reach init_mm, there's no address space
+                * to search, but use it as a reminder to search shmem.
+                */
+               shmem = 0;
+               swcount = *swap_map;
+               if (swcount > 1) {
+                       flush_page_to_ram(page);
+                       if (start_mm == &init_mm)
+                               shmem = shmem_unuse(entry, page);
+                       else
+                               unuse_process(start_mm, entry, page);
+               }
+               if (*swap_map > 1) {
+                       int set_start_mm = (*swap_map >= swcount);
+                       struct list_head *p = &start_mm->mmlist;
+                       struct mm_struct *new_start_mm = start_mm;
+                       struct mm_struct *mm;
+
+                       spin_lock(&mmlist_lock);
+                       while (*swap_map > 1 &&
+                                       (p = p->next) != &start_mm->mmlist) {
+                               mm = list_entry(p, struct mm_struct, mmlist);
+                               swcount = *swap_map;
+                               if (mm == &init_mm) {
+                                       set_start_mm = 1;
+                                       spin_unlock(&mmlist_lock);
+                                       shmem = shmem_unuse(entry, page);
+                                       spin_lock(&mmlist_lock);
+                               } else
+                                       unuse_process(mm, entry, page);
+                               if (set_start_mm && *swap_map < swcount) {
+                                       new_start_mm = mm;
+                                       set_start_mm = 0;
+                               }
+                       }
+                       atomic_inc(&new_start_mm->mm_users);
+                       spin_unlock(&mmlist_lock);
+                       mmput(start_mm);
+                       start_mm = new_start_mm;
+               }
+
+               /*
+                * How could swap count reach 0x7fff when the maximum
+                * pid is 0x7fff, and there's no way to repeat a swap
+                * page within an mm (except in shmem, where it's the
+                * shared object which takes the reference count)?
+                * We believe SWAP_MAP_MAX cannot occur in Linux 2.4.
+                *
+                * If that's wrong, then we should worry more about
+                * exit_mmap() and do_munmap() cases described above:
+                * we might be resetting SWAP_MAP_MAX too early here.
+                * We know "Undead"s can happen, they're okay, so don't
+                * report them; but do report if we reset SWAP_MAP_MAX.
+                */
+               if (*swap_map == SWAP_MAP_MAX) {
+                       swap_list_lock();
+                       swap_device_lock(si);
+                       nr_swap_pages++;
+                       *swap_map = 1;
+                       swap_device_unlock(si);
+                       swap_list_unlock();
+                       reset_overflow = 1;
+               }
+
+               /*
+                * If a reference remains (rare), we would like to leave
+                * the page in the swap cache; but try_to_swap_out could
+                * then re-duplicate the entry once we drop page lock,
+                * so we might loop indefinitely; also, that page could
+                * not be swapped out to other storage meanwhile.  So:
+                * delete from cache even if there's another reference,
+                * after ensuring that the data has been saved to disk -
+                * since if the reference remains (rarer), it will be
+                * read from disk into another page.  Splitting into two
+                * pages would be incorrect if swap supported "shared
+                * private" pages, but they are handled by tmpfs files.
+                *
+                * Note shmem_unuse already deleted swappage from cache,
+                * unless corresponding filepage found already in cache:
+                * in which case it left swappage in cache, lowered its
+                * swap count to pass quickly through the loops above,
+                * and now we must reincrement count to try again later.
+                */
+               if ((*swap_map > 1) && PageDirty(page) && PageSwapCache(page)) {
+                       rw_swap_page(WRITE, page);
+                       lock_page(page);
+               }
+               if (PageSwapCache(page)) {
+                       if (shmem)
+                               swap_duplicate(entry);
+                       else
+                               delete_from_swap_cache(page);
+               }
+
+               /*
+                * So we could skip searching mms once swap count went
+                * to 1, we did not mark any present ptes as dirty: must
+                * mark page dirty so try_to_swap_out will preserve it.
+                */
+               SetPageDirty(page);
+               UnlockPage(page);
+               page_cache_release(page);
+
+               /*
+                * Make sure that we aren't completely killing
+                * interactive performance.  Interruptible check on
+                * signal_pending() would be nice, but changes the spec?
+                */
+               if (current->need_resched)
+                       schedule();
+       }
+
+       mmput(start_mm);
+       if (reset_overflow) {
+               printk(KERN_WARNING "swapoff: cleared swap entry overflow\n");
+               swap_overflow = 0;
+       }
+       return retval;
+}
+
+asmlinkage long sys_swapoff(const char * specialfile)
+{
+       struct swap_info_struct * p = NULL;
+       unsigned short *swap_map;
+       struct nameidata nd;
+       int i, type, prev;
+       int err;
+       
+       if (!capable(CAP_SYS_ADMIN))
+               return -EPERM;
+
+       err = user_path_walk(specialfile, &nd);
+       if (err)
+               goto out;
+
+       lock_kernel();
+       prev = -1;
+       swap_list_lock();
+       for (type = swap_list.head; type >= 0; type = swap_info[type].next) {
+               p = swap_info + type;
+               if ((p->flags & SWP_WRITEOK) == SWP_WRITEOK) {
+                       if (p->swap_file == nd.dentry)
+                         break;
+               }
+               prev = type;
+       }
+       err = -EINVAL;
+       if (type < 0) {
+               swap_list_unlock();
+               goto out_dput;
+       }
+
+       if (prev < 0) {
+               swap_list.head = p->next;
+       } else {
+               swap_info[prev].next = p->next;
+       }
+       if (type == swap_list.next) {
+               /* just pick something that's safe... */
+               swap_list.next = swap_list.head;
+       }
+       nr_swap_pages -= p->pages;
+       total_swap_pages -= p->pages;
+       p->flags = SWP_USED;
+       swap_list_unlock();
+       unlock_kernel();
+       err = try_to_unuse(type);
+       lock_kernel();
+       if (err) {
+               /* re-insert swap space back into swap_list */
+               swap_list_lock();
+               for (prev = -1, i = swap_list.head; i >= 0; prev = i, i = swap_info[i].next)
+                       if (p->prio >= swap_info[i].prio)
+                               break;
+               p->next = i;
+               if (prev < 0)
+                       swap_list.head = swap_list.next = p - swap_info;
+               else
+                       swap_info[prev].next = p - swap_info;
+               nr_swap_pages += p->pages;
+               total_swap_pages += p->pages;
+               p->flags = SWP_WRITEOK;
+               swap_list_unlock();
+               goto out_dput;
+       }
+       if (p->swap_device)
+               blkdev_put(p->swap_file->d_inode->i_bdev, BDEV_SWAP);
+       path_release(&nd);
+
+       swap_list_lock();
+       swap_device_lock(p);
+       nd.mnt = p->swap_vfsmnt;
+       nd.dentry = p->swap_file;
+       p->swap_vfsmnt = NULL;
+       p->swap_file = NULL;
+       p->swap_device = 0;
+       p->max = 0;
+       swap_map = p->swap_map;
+       p->swap_map = NULL;
+       p->flags = 0;
+       swap_device_unlock(p);
+       swap_list_unlock();
+       vfree(swap_map);
+       err = 0;
+
+out_dput:
+       unlock_kernel();
+       path_release(&nd);
+out:
+       return err;
+}
+
+int get_swaparea_info(char *buf)
+{
+       char * page = (char *) __get_free_page(GFP_KERNEL);
+       struct swap_info_struct *ptr = swap_info;
+       int i, j, len = 0, usedswap;
+
+       if (!page)
+               return -ENOMEM;
+
+       len += sprintf(buf, "Filename\t\t\tType\t\tSize\tUsed\tPriority\n");
+       for (i = 0 ; i < nr_swapfiles ; i++, ptr++) {
+               if ((ptr->flags & SWP_USED) && ptr->swap_map) {
+                       char * path = d_path(ptr->swap_file, ptr->swap_vfsmnt,
+                                               page, PAGE_SIZE);
+
+                       len += sprintf(buf + len, "%-31s ", path);
+
+                       if (!ptr->swap_device)
+                               len += sprintf(buf + len, "file\t\t");
+                       else
+                               len += sprintf(buf + len, "partition\t");
+
+                       usedswap = 0;
+                       for (j = 0; j < ptr->max; ++j)
+                               switch (ptr->swap_map[j]) {
+                                       case SWAP_MAP_BAD:
+                                       case 0:
+                                               continue;
+                                       default:
+                                               usedswap++;
+                               }
+                       len += sprintf(buf + len, "%d\t%d\t%d\n", ptr->pages << (PAGE_SHIFT - 10), 
+                               usedswap << (PAGE_SHIFT - 10), ptr->prio);
+               }
+       }
+       free_page((unsigned long) page);
+       return len;
+}
+
+int is_swap_partition(kdev_t dev) {
+       struct swap_info_struct *ptr = swap_info;
+       int i;
+
+       for (i = 0 ; i < nr_swapfiles ; i++, ptr++) {
+               if (ptr->flags & SWP_USED)
+                       if (ptr->swap_device == dev)
+                               return 1;
+       }
+       return 0;
+}
+
+/*
+ * Written 01/25/92 by Simmule Turner, heavily changed by Linus.
+ *
+ * The swapon system call
+ */
+asmlinkage long sys_swapon(const char * specialfile, int swap_flags)
+{
+       struct swap_info_struct * p;
+       struct nameidata nd;
+       struct inode * swap_inode;
+       unsigned int type;
+       int i, j, prev;
+       int error;
+       static int least_priority = 0;
+       union swap_header *swap_header = 0;
+       int swap_header_version;
+       int nr_good_pages = 0;
+       unsigned long maxpages = 1;
+       int swapfilesize;
+       struct block_device *bdev = NULL;
+       unsigned short *swap_map;
+       
+       if (!capable(CAP_SYS_ADMIN))
+               return -EPERM;
+       lock_kernel();
+       swap_list_lock();
+       p = swap_info;
+       for (type = 0 ; type < nr_swapfiles ; type++,p++)
+               if (!(p->flags & SWP_USED))
+                       break;
+       error = -EPERM;
+       if (type >= MAX_SWAPFILES) {
+               swap_list_unlock();
+               goto out;
+       }
+       if (type >= nr_swapfiles)
+               nr_swapfiles = type+1;
+       p->flags = SWP_USED;
+       p->swap_file = NULL;
+       p->swap_vfsmnt = NULL;
+       p->swap_device = 0;
+       p->swap_map = NULL;
+       p->lowest_bit = 0;
+       p->highest_bit = 0;
+       p->cluster_nr = 0;
+       p->sdev_lock = SPIN_LOCK_UNLOCKED;
+       p->next = -1;
+       if (swap_flags & SWAP_FLAG_PREFER) {
+               p->prio =
+                 (swap_flags & SWAP_FLAG_PRIO_MASK)>>SWAP_FLAG_PRIO_SHIFT;
+       } else {
+               p->prio = --least_priority;
+       }
+       swap_list_unlock();
+       error = user_path_walk(specialfile, &nd);
+       if (error)
+               goto bad_swap_2;
+
+       p->swap_file = nd.dentry;
+       p->swap_vfsmnt = nd.mnt;
+       swap_inode = nd.dentry->d_inode;
+       error = -EINVAL;
+
+       if (S_ISBLK(swap_inode->i_mode)) {
+               kdev_t dev = swap_inode->i_rdev;
+               struct block_device_operations *bdops;
+               devfs_handle_t de;
+
+               if (is_mounted(dev)) {
+                       error = -EBUSY;
+                       goto bad_swap_2;
+               }
+
+               p->swap_device = dev;
+               set_blocksize(dev, PAGE_SIZE);
+               
+               bd_acquire(swap_inode);
+               bdev = swap_inode->i_bdev;
+               de = devfs_get_handle_from_inode(swap_inode);
+               bdops = devfs_get_ops(de);  /*  Increments module use count  */
+               if (bdops) bdev->bd_op = bdops;
+
+               error = blkdev_get(bdev, FMODE_READ|FMODE_WRITE, 0, BDEV_SWAP);
+               devfs_put_ops(de);/*Decrement module use count now we're safe*/
+               if (error)
+                       goto bad_swap_2;
+               set_blocksize(dev, PAGE_SIZE);
+               error = -ENODEV;
+               if (!dev || (blk_size[MAJOR(dev)] &&
+                    !blk_size[MAJOR(dev)][MINOR(dev)]))
+                       goto bad_swap;
+               swapfilesize = 0;
+               if (blk_size[MAJOR(dev)])
+                       swapfilesize = blk_size[MAJOR(dev)][MINOR(dev)]
+                               >> (PAGE_SHIFT - 10);
+       } else if (S_ISREG(swap_inode->i_mode))
+               swapfilesize = swap_inode->i_size >> PAGE_SHIFT;
+       else
+               goto bad_swap;
+
+       error = -EBUSY;
+       for (i = 0 ; i < nr_swapfiles ; i++) {
+               struct swap_info_struct *q = &swap_info[i];
+               if (i == type || !q->swap_file)
+                       continue;
+               if (swap_inode->i_mapping == q->swap_file->d_inode->i_mapping)
+                       goto bad_swap;
+       }
+
+       swap_header = (void *) __get_free_page(GFP_USER);
+       if (!swap_header) {
+               printk("Unable to start swapping: out of memory :-)\n");
+               error = -ENOMEM;
+               goto bad_swap;
+       }
+
+       lock_page(virt_to_page(swap_header));
+       rw_swap_page_nolock(READ, SWP_ENTRY(type,0), (char *) swap_header);
+
+       if (!memcmp("SWAP-SPACE",swap_header->magic.magic,10))
+               swap_header_version = 1;
+       else if (!memcmp("SWAPSPACE2",swap_header->magic.magic,10))
+               swap_header_version = 2;
+       else {
+               printk("Unable to find swap-space signature\n");
+               error = -EINVAL;
+               goto bad_swap;
+       }
+       
+       switch (swap_header_version) {
+       case 1:
+               memset(((char *) swap_header)+PAGE_SIZE-10,0,10);
+               j = 0;
+               p->lowest_bit = 0;
+               p->highest_bit = 0;
+               for (i = 1 ; i < 8*PAGE_SIZE ; i++) {
+                       if (test_bit(i,(char *) swap_header)) {
+                               if (!p->lowest_bit)
+                                       p->lowest_bit = i;
+                               p->highest_bit = i;
+                               maxpages = i+1;
+                               j++;
+                       }
+               }
+               nr_good_pages = j;
+               p->swap_map = vmalloc(maxpages * sizeof(short));
+               if (!p->swap_map) {
+                       error = -ENOMEM;                
+                       goto bad_swap;
+               }
+               for (i = 1 ; i < maxpages ; i++) {
+                       if (test_bit(i,(char *) swap_header))
+                               p->swap_map[i] = 0;
+                       else
+                               p->swap_map[i] = SWAP_MAP_BAD;
+               }
+               break;
+
+       case 2:
+               /* Check the swap header's sub-version and the size of
+                   the swap file and bad block lists */
+               if (swap_header->info.version != 1) {
+                       printk(KERN_WARNING
+                              "Unable to handle swap header version %d\n",
+                              swap_header->info.version);
+                       error = -EINVAL;
+                       goto bad_swap;
+               }
+
+               p->lowest_bit  = 1;
+               maxpages = SWP_OFFSET(SWP_ENTRY(0,~0UL)) - 1;
+               if (maxpages > swap_header->info.last_page)
+                       maxpages = swap_header->info.last_page;
+               p->highest_bit = maxpages - 1;
+
+               error = -EINVAL;
+               if (swap_header->info.nr_badpages > MAX_SWAP_BADPAGES)
+                       goto bad_swap;
+               
+               /* OK, set up the swap map and apply the bad block list */
+               if (!(p->swap_map = vmalloc(maxpages * sizeof(short)))) {
+                       error = -ENOMEM;
+                       goto bad_swap;
+               }
+
+               error = 0;
+               memset(p->swap_map, 0, maxpages * sizeof(short));
+               for (i=0; i<swap_header->info.nr_badpages; i++) {
+                       int page = swap_header->info.badpages[i];
+                       if (page <= 0 || page >= swap_header->info.last_page)
+                               error = -EINVAL;
+                       else
+                               p->swap_map[page] = SWAP_MAP_BAD;
+               }
+               nr_good_pages = swap_header->info.last_page -
+                               swap_header->info.nr_badpages -
+                               1 /* header page */;
+               if (error) 
+                       goto bad_swap;
+       }
+       
+       if (swapfilesize && maxpages > swapfilesize) {
+               printk(KERN_WARNING
+                      "Swap area shorter than signature indicates\n");
+               error = -EINVAL;
+               goto bad_swap;
+       }
+       if (!nr_good_pages) {
+               printk(KERN_WARNING "Empty swap-file\n");
+               error = -EINVAL;
+               goto bad_swap;
+       }
+       p->swap_map[0] = SWAP_MAP_BAD;
+       swap_list_lock();
+       swap_device_lock(p);
+       p->max = maxpages;
+       p->flags = SWP_WRITEOK;
+       p->pages = nr_good_pages;
+       nr_swap_pages += nr_good_pages;
+       total_swap_pages += nr_good_pages;
+       printk(KERN_INFO "Adding Swap: %dk swap-space (priority %d)\n",
+              nr_good_pages<<(PAGE_SHIFT-10), p->prio);
+
+       /* insert swap space into swap_list: */
+       prev = -1;
+       for (i = swap_list.head; i >= 0; i = swap_info[i].next) {
+               if (p->prio >= swap_info[i].prio) {
+                       break;
+               }
+               prev = i;
+       }
+       p->next = i;
+       if (prev < 0) {
+               swap_list.head = swap_list.next = p - swap_info;
+       } else {
+               swap_info[prev].next = p - swap_info;
+       }
+       swap_device_unlock(p);
+       swap_list_unlock();
+       error = 0;
+       goto out;
+bad_swap:
+       if (bdev)
+               blkdev_put(bdev, BDEV_SWAP);
+bad_swap_2:
+       swap_list_lock();
+       swap_map = p->swap_map;
+       nd.mnt = p->swap_vfsmnt;
+       nd.dentry = p->swap_file;
+       p->swap_device = 0;
+       p->swap_file = NULL;
+       p->swap_vfsmnt = NULL;
+       p->swap_map = NULL;
+       p->flags = 0;
+       if (!(swap_flags & SWAP_FLAG_PREFER))
+               ++least_priority;
+       swap_list_unlock();
+       if (swap_map)
+               vfree(swap_map);
+       path_release(&nd);
+out:
+       if (swap_header)
+               free_page((long) swap_header);
+       unlock_kernel();
+       return error;
+}
+
+void si_swapinfo(struct sysinfo *val)
+{
+       unsigned int i;
+       unsigned long nr_to_be_unused = 0;
+
+       swap_list_lock();
+       for (i = 0; i < nr_swapfiles; i++) {
+               unsigned int j;
+               if (swap_info[i].flags != SWP_USED)
+                       continue;
+               for (j = 0; j < swap_info[i].max; ++j) {
+                       switch (swap_info[i].swap_map[j]) {
+                               case 0:
+                               case SWAP_MAP_BAD:
+                                       continue;
+                               default:
+                                       nr_to_be_unused++;
+                       }
+               }
+       }
+       val->freeswap = nr_swap_pages + nr_to_be_unused;
+       val->totalswap = total_swap_pages + nr_to_be_unused;
+       swap_list_unlock();
+}
+
+/*
+ * Verify that a swap entry is valid and increment its swap map count.
+ *
+ * Note: if swap_map[] reaches SWAP_MAP_MAX the entries are treated as
+ * "permanent", but will be reclaimed by the next swapoff.
+ */
+int swap_duplicate(swp_entry_t entry)
+{
+       struct swap_info_struct * p;
+       unsigned long offset, type;
+       int result = 0;
+
+       type = SWP_TYPE(entry);
+       if (type >= nr_swapfiles)
+               goto bad_file;
+       p = type + swap_info;
+       offset = SWP_OFFSET(entry);
+
+       swap_device_lock(p);
+       if (offset < p->max && p->swap_map[offset]) {
+               if (p->swap_map[offset] < SWAP_MAP_MAX - 1) {
+                       p->swap_map[offset]++;
+                       result = 1;
+               } else if (p->swap_map[offset] <= SWAP_MAP_MAX) {
+                       if (swap_overflow++ < 5)
+                               printk(KERN_WARNING "swap_dup: swap entry overflow\n");
+                       p->swap_map[offset] = SWAP_MAP_MAX;
+                       result = 1;
+               }
+       }
+       swap_device_unlock(p);
+out:
+       return result;
+
+bad_file:
+       printk(KERN_ERR "swap_dup: %s%08lx\n", Bad_file, entry.val);
+       goto out;
+}
+
+/*
+ * Prior swap_duplicate protects against swap device deletion.
+ */
+void get_swaphandle_info(swp_entry_t entry, unsigned long *offset, 
+                       kdev_t *dev, struct inode **swapf)
+{
+       unsigned long type;
+       struct swap_info_struct *p;
+
+       type = SWP_TYPE(entry);
+       if (type >= nr_swapfiles) {
+               printk(KERN_ERR "rw_swap_page: %s%08lx\n", Bad_file, entry.val);
+               return;
+       }
+
+       p = &swap_info[type];
+       *offset = SWP_OFFSET(entry);
+       if (*offset >= p->max && *offset != 0) {
+               printk(KERN_ERR "rw_swap_page: %s%08lx\n", Bad_offset, entry.val);
+               return;
+       }
+       if (p->swap_map && !p->swap_map[*offset]) {
+               printk(KERN_ERR "rw_swap_page: %s%08lx\n", Unused_offset, entry.val);
+               return;
+       }
+       if (!(p->flags & SWP_USED)) {
+               printk(KERN_ERR "rw_swap_page: %s%08lx\n", Unused_file, entry.val);
+               return;
+       }
+
+       if (p->swap_device) {
+               *dev = p->swap_device;
+       } else if (p->swap_file) {
+               *swapf = p->swap_file->d_inode;
+       } else {
+               printk(KERN_ERR "rw_swap_page: no swap file or device\n");
+       }
+       return;
+}
+
+/*
+ * swap_device_lock prevents swap_map being freed. Don't grab an extra
+ * reference on the swaphandle, it doesn't matter if it becomes unused.
+ */
+int valid_swaphandles(swp_entry_t entry, unsigned long *offset)
+{
+       int ret = 0, i = 1 << page_cluster;
+       unsigned long toff;
+       struct swap_info_struct *swapdev = SWP_TYPE(entry) + swap_info;
+
+       if (!page_cluster)      /* no readahead */
+               return 0;
+       toff = (SWP_OFFSET(entry) >> page_cluster) << page_cluster;
+       if (!toff)              /* first page is swap header */
+               toff++, i--;
+       *offset = toff;
+
+       swap_device_lock(swapdev);
+       do {
+               /* Don't read-ahead past the end of the swap area */
+               if (toff >= swapdev->max)
+                       break;
+               /* Don't read in free or bad pages */
+               if (!swapdev->swap_map[toff])
+                       break;
+               if (swapdev->swap_map[toff] == SWAP_MAP_BAD)
+                       break;
+               toff++;
+               ret++;
+       } while (--i);
+       swap_device_unlock(swapdev);
+       return ret;
+}
diff --git a/xenolinux-2.4.22-sparse/mm/vmalloc.c b/xenolinux-2.4.22-sparse/mm/vmalloc.c
new file mode 100644 (file)
index 0000000..b5b4da9
--- /dev/null
@@ -0,0 +1,381 @@
+/*
+ *  linux/mm/vmalloc.c
+ *
+ *  Copyright (C) 1993  Linus Torvalds
+ *  Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
+ *  SMP-safe vmalloc/vfree/ioremap, Tigran Aivazian <tigran@veritas.com>, May 2000
+ */
+
+#include <linux/config.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+#include <linux/spinlock.h>
+#include <linux/highmem.h>
+#include <linux/smp_lock.h>
+
+#include <asm/uaccess.h>
+#include <asm/pgalloc.h>
+
+rwlock_t vmlist_lock = RW_LOCK_UNLOCKED;
+struct vm_struct * vmlist;
+
+static inline void free_area_pte(pmd_t * pmd, unsigned long address, unsigned long size)
+{
+       pte_t * pte;
+       unsigned long end;
+
+       if (pmd_none(*pmd))
+               return;
+       if (pmd_bad(*pmd)) {
+               pmd_ERROR(*pmd);
+               pmd_clear(pmd);
+               return;
+       }
+       pte = pte_offset(pmd, address);
+       address &= ~PMD_MASK;
+       end = address + size;
+       if (end > PMD_SIZE)
+               end = PMD_SIZE;
+       do {
+               pte_t page;
+               page = ptep_get_and_clear(pte);
+               address += PAGE_SIZE;
+               pte++;
+               if (pte_none(page))
+                       continue;
+               if (pte_present(page)) {
+                       struct page *ptpage = pte_page(page);
+                       if (VALID_PAGE(ptpage) && (!PageReserved(ptpage)))
+                               __free_page(ptpage);
+                       continue;
+               }
+               printk(KERN_CRIT "Whee.. Swapped out page in kernel page table\n");
+       } while (address < end);
+}
+
+static inline void free_area_pmd(pgd_t * dir, unsigned long address, unsigned long size)
+{
+       pmd_t * pmd;
+       unsigned long end;
+
+       if (pgd_none(*dir))
+               return;
+       if (pgd_bad(*dir)) {
+               pgd_ERROR(*dir);
+               pgd_clear(dir);
+               return;
+       }
+       pmd = pmd_offset(dir, address);
+       address &= ~PGDIR_MASK;
+       end = address + size;
+       if (end > PGDIR_SIZE)
+               end = PGDIR_SIZE;
+       do {
+               free_area_pte(pmd, address, end - address);
+               address = (address + PMD_SIZE) & PMD_MASK;
+               pmd++;
+       } while (address < end);
+}
+
+void vmfree_area_pages(unsigned long address, unsigned long size)
+{
+       pgd_t * dir;
+       unsigned long end = address + size;
+
+       dir = pgd_offset_k(address);
+       flush_cache_all();
+       do {
+               free_area_pmd(dir, address, end - address);
+               address = (address + PGDIR_SIZE) & PGDIR_MASK;
+               dir++;
+       } while (address && (address < end));
+       flush_tlb_all();
+}
+
+static inline int alloc_area_pte (pte_t * pte, unsigned long address,
+                       unsigned long size, int gfp_mask,
+                       pgprot_t prot, struct page ***pages)
+{
+       unsigned long end;
+
+       address &= ~PMD_MASK;
+       end = address + size;
+       if (end > PMD_SIZE)
+               end = PMD_SIZE;
+       do {
+               struct page * page;
+
+               if (!pages) {
+                       spin_unlock(&init_mm.page_table_lock);
+                       page = alloc_page(gfp_mask);
+                       spin_lock(&init_mm.page_table_lock);
+               } else {
+                       page = (**pages);
+                       (*pages)++;
+
+                       /* Add a reference to the page so we can free later */
+                       if (page)
+                               atomic_inc(&page->count);
+
+               }
+               if (!pte_none(*pte))
+                       printk(KERN_ERR "alloc_area_pte: page already exists\n");
+               if (!page)
+                       return -ENOMEM;
+               set_pte(pte, mk_pte(page, prot));
+               address += PAGE_SIZE;
+               pte++;
+       } while (address < end);
+       return 0;
+}
+
+static inline int alloc_area_pmd(pmd_t * pmd, unsigned long address,
+                       unsigned long size, int gfp_mask,
+                       pgprot_t prot, struct page ***pages)
+{
+       unsigned long end;
+
+       address &= ~PGDIR_MASK;
+       end = address + size;
+       if (end > PGDIR_SIZE)
+               end = PGDIR_SIZE;
+       do {
+               pte_t * pte = pte_alloc(&init_mm, pmd, address);
+               if (!pte)
+                       return -ENOMEM;
+               if (alloc_area_pte(pte, address, end - address,
+                                       gfp_mask, prot, pages))
+                       return -ENOMEM;
+               address = (address + PMD_SIZE) & PMD_MASK;
+               pmd++;
+       } while (address < end);
+       return 0;
+}
+
+static inline int __vmalloc_area_pages (unsigned long address,
+                                       unsigned long size,
+                                       int gfp_mask,
+                                       pgprot_t prot,
+                                       struct page ***pages)
+{
+       pgd_t * dir;
+       unsigned long end = address + size;
+       int ret;
+
+       dir = pgd_offset_k(address);
+       spin_lock(&init_mm.page_table_lock);
+       do {
+               pmd_t *pmd;
+               
+               pmd = pmd_alloc(&init_mm, dir, address);
+               ret = -ENOMEM;
+               if (!pmd)
+                       break;
+
+               ret = -ENOMEM;
+               if (alloc_area_pmd(pmd, address, end - address, gfp_mask, prot, pages))
+                       break;
+
+               address = (address + PGDIR_SIZE) & PGDIR_MASK;
+               dir++;
+
+               ret = 0;
+       } while (address && (address < end));
+       spin_unlock(&init_mm.page_table_lock);
+       flush_cache_all();
+       return ret;
+}
+
+int vmalloc_area_pages(unsigned long address, unsigned long size,
+                      int gfp_mask, pgprot_t prot)
+{
+       return __vmalloc_area_pages(address, size, gfp_mask, prot, NULL);
+}
+
+struct vm_struct * get_vm_area(unsigned long size, unsigned long flags)
+{
+       unsigned long addr, next;
+       struct vm_struct **p, *tmp, *area;
+
+       area = (struct vm_struct *) kmalloc(sizeof(*area), GFP_KERNEL);
+       if (!area)
+               return NULL;
+
+       size += PAGE_SIZE;
+       if (!size) {
+               kfree (area);
+               return NULL;
+       }
+
+       addr = VMALLOC_START;
+       write_lock(&vmlist_lock);
+       for (p = &vmlist; (tmp = *p) ; p = &tmp->next) {
+               if ((size + addr) < addr)
+                       goto out;
+               if (size + addr <= (unsigned long) tmp->addr)
+                       break;
+               next = tmp->size + (unsigned long) tmp->addr;
+               if (next > addr) 
+                       addr = next;
+               if (addr > VMALLOC_END-size)
+                       goto out;
+       }
+       area->flags = flags;
+       area->addr = (void *)addr;
+       area->size = size;
+       area->next = *p;
+       *p = area;
+       write_unlock(&vmlist_lock);
+       return area;
+
+out:
+       write_unlock(&vmlist_lock);
+       kfree(area);
+       return NULL;
+}
+
+void vfree(void * addr)
+{
+       struct vm_struct **p, *tmp;
+
+       if (!addr)
+               return;
+       if ((PAGE_SIZE-1) & (unsigned long) addr) {
+               printk(KERN_ERR "Trying to vfree() bad address (%p)\n", addr);
+               return;
+       }
+       write_lock(&vmlist_lock);
+       for (p = &vmlist ; (tmp = *p) ; p = &tmp->next) {
+               if (tmp->addr == addr) {
+                       *p = tmp->next;
+#ifdef CONFIG_XENO_PRIV
+                       if (tmp->flags & VM_IOREMAP)
+                               zap_page_range(&init_mm, VMALLOC_VMADDR(tmp->addr), tmp->size);
+                       else
+#endif
+                       vmfree_area_pages(VMALLOC_VMADDR(tmp->addr), tmp->size);
+                       write_unlock(&vmlist_lock);
+                       kfree(tmp);
+                       return;
+               }
+       }
+       write_unlock(&vmlist_lock);
+       printk(KERN_ERR "Trying to vfree() nonexistent vm area (%p)\n", addr);
+}
+
+void * __vmalloc (unsigned long size, int gfp_mask, pgprot_t prot)
+{
+       void * addr;
+       struct vm_struct *area;
+
+       size = PAGE_ALIGN(size);
+       if (!size || (size >> PAGE_SHIFT) > num_physpages)
+               return NULL;
+       area = get_vm_area(size, VM_ALLOC);
+       if (!area)
+               return NULL;
+       addr = area->addr;
+       if (__vmalloc_area_pages(VMALLOC_VMADDR(addr), size, gfp_mask,
+                                prot, NULL)) {
+               vfree(addr);
+               return NULL;
+       }
+       return addr;
+}
+
+void * vmap(struct page **pages, int count,
+           unsigned long flags, pgprot_t prot)
+{
+       void * addr;
+       struct vm_struct *area;
+       unsigned long size = count << PAGE_SHIFT;
+
+       if (!size || size > (max_mapnr << PAGE_SHIFT))
+               return NULL;
+       area = get_vm_area(size, flags);
+       if (!area) {
+               return NULL;
+       }
+       addr = area->addr;
+       if (__vmalloc_area_pages(VMALLOC_VMADDR(addr), size, 0,
+                                prot, &pages)) {
+               vfree(addr);
+               return NULL;
+       }
+       return addr;
+}
+
+long vread(char *buf, char *addr, unsigned long count)
+{
+       struct vm_struct *tmp;
+       char *vaddr, *buf_start = buf;
+       unsigned long n;
+
+       /* Don't allow overflow */
+       if ((unsigned long) addr + count < count)
+               count = -(unsigned long) addr;
+
+       read_lock(&vmlist_lock);
+       for (tmp = vmlist; tmp; tmp = tmp->next) {
+               vaddr = (char *) tmp->addr;
+               if (addr >= vaddr + tmp->size - PAGE_SIZE)
+                       continue;
+               while (addr < vaddr) {
+                       if (count == 0)
+                               goto finished;
+                       *buf = '\0';
+                       buf++;
+                       addr++;
+                       count--;
+               }
+               n = vaddr + tmp->size - PAGE_SIZE - addr;
+               do {
+                       if (count == 0)
+                               goto finished;
+                       *buf = *addr;
+                       buf++;
+                       addr++;
+                       count--;
+               } while (--n > 0);
+       }
+finished:
+       read_unlock(&vmlist_lock);
+       return buf - buf_start;
+}
+
+long vwrite(char *buf, char *addr, unsigned long count)
+{
+       struct vm_struct *tmp;
+       char *vaddr, *buf_start = buf;
+       unsigned long n;
+
+       /* Don't allow overflow */
+       if ((unsigned long) addr + count < count)
+               count = -(unsigned long) addr;
+
+       read_lock(&vmlist_lock);
+       for (tmp = vmlist; tmp; tmp = tmp->next) {
+               vaddr = (char *) tmp->addr;
+               if (addr >= vaddr + tmp->size - PAGE_SIZE)
+                       continue;
+               while (addr < vaddr) {
+                       if (count == 0)
+                               goto finished;
+                       buf++;
+                       addr++;
+                       count--;
+               }
+               n = vaddr + tmp->size - PAGE_SIZE - addr;
+               do {
+                       if (count == 0)
+                               goto finished;
+                       *addr = *buf;
+                       buf++;
+                       addr++;
+                       count--;
+               } while (--n > 0);
+       }
+finished:
+       read_unlock(&vmlist_lock);
+       return buf - buf_start;
+}